Scala'ya Hızlı Giriş
Skala/Kojo öğreticisi — masaüstü Koco'daki 19 sayfalık öykünün tarayıcı sürümü.
1Scala'ya Hızlı Giriş
Scala diline hoşgeldin! Skala diye oku, olur mu? Bu kılavuz, masaüstü Koco'nun Yardım → Scala'ya Giriş öyküsünün tarayıcı sürümüdür. Soldaki listeden istediğin bölüme atlayabilirsin; her bölümün sonunda da bir önceki ve bir sonraki bölüme bağlantı var.
Bu kılavuz nasıl kullanılır?
Kılavuzda pek çok yazılımcık örneği bulacaksın. Her kod bloğunun altındaki Editörde aç → bağlantısı örneği yeni bir sekmede iKoco düzenleyicisine taşır; oradaki Çalıştır düğmesine basman yeter. Sonra istediğin değişikliği yapıp tekrar çalıştır. Değiştir, boz, düzelt: en iyi böyle öğrenilir.
- Çok uzun örneklerde bağlantı yerine Kopyala düğmesi var. Kodu panoya alır; düzenleyiciye yapıştırıp çalıştır.
- Bazı tablolarda tek komutluk hücreler (
ileri(100)gibi) de tıklanabilir; onlar da düzenleyicide açılır. - Turuncu masaüstü rozeti taşıyan örneklerde, yalnız masaüstü Koco'da bulunan bir komut var. Rozetin yanında hangi komutun eksik olduğu ve varsa ikojo'daki karşılığı yazar. Kod yine gösteriliyor ki masaüstünde deneyebil. Farkların özeti için Farklar sayfasına bak.
1 + 2 gibi yalın bir deyiş yazınca sonucu çıktı gözünde görürsün; tarayıcıda görmek için satıryaz(1 + 2) yazmak gerekir, o yüzden burada örneklerin çoğu satıryaz içinde. İki: masaüstünde art arda çalıştırdığın örnekler birbirinin tanımlarını hatırlar; tarayıcıda her çalıştırma temiz başlar. Onun için birbirine dayanan örneklerin tanımlarını her blokta yineledik. Ayrıca ikojo'da satıryaz(a, b) ikiliyi (a,b) biçiminde tek parça yazar.Bölümler
| # | Bölüm | Ne öğreneceğiz? |
|---|---|---|
| 2 | Kaplumbağacığın Kullanılışı | Kaplumbağayı yürüten ve çizdiren komutlar |
| 3 | Anahtar Sözcükler | Türkçe anahtar sözcükler ve İngilizceleri |
| 4 | Başlayalım | Deyişler, dez ve den, açıklamalar, yazılar, parçacık işlemleri |
| 5 | Yazılım Akışı: Eğer, Yoksa ve İçin | Karar çatalları ve döngüler |
| 6 | Yalın Değerler, Sayılar, Kesirler ve Yazılar | Temel türler |
| 7 | İşlevler | tanım ile işlev tanımlamak, özyineleme |
| 8 | Nesneler ve Sınıflar | sınıf, yeni, durum sınıf, yayar, baskın |
| 9 | Desen Eşleme: Eşle ve Durum | eşle / durum yapısı |
| 10 | İleri Eşleme: İkil Ağaç | Sınıf hiyerarşisi ve özyineli arama |
| 11 | Dingin Türleme ve Tür Çıkarımı | Derleyici türleri nasıl bulur? |
| 12 | İşlevler de Birer Nesnedir | İşlev girdileri, adsız işlevler, genelleyici işlevler, işle/ele/katla |
| 13 | Sıralamalar (Tuple) | Çoklu değerler ve çözümleme |
| 14 | Matematiksel İşlevler | Trigonometri, üst, yuvarlama, rastgele |
| 15 | İşlem Önceliği ve Birleşmeliği | Kendi işlemlerini tanımlamak |
| 16 | Yazıların (String) Kullanılışı | Yazı yöntemleri |
| 17 | Dizinlerin (List) Kullanılışı | Dizin yöntemleri |
| 18 | Çizim ve Oyun | Resim, canlandır, klavye, saat, Yaşam Oyunu, Planarity |
| 19 | Daha Çok Öğrenelim | Kitaplar ve bağlantılar |
Kojo'nun kaplumbağacığını zaten iyi tanıyorsan ikinci bölümü atlayıp doğrudan Başlayalım ile başlayabilirsin. İlk iki üç bölümü okuduktan sonra sona yakın olan Çizim ve Oyun bölümüne göz atmanda da fayda var: orada çok şey öğreneceksin.
Not: Bu kılavuz Anthony Bagwell'in simplyscala.com sitesinden Kojo'ya uyarlanarak yazılmıştır (Phil Bagwell; Kojo örneklerinin bir kısmı Lalit Pant'tan). O site ne yazık ki artık çalışmıyor, ama arşivde bulabilirsin: web.archive.org'dan simplyscala.com. Türkçesi Bülent Başaran'ın sevgiyle çevirisidir.
2Kaplumbağacığın Kullanılışı
Bu bölümü en başa, hatta Başlayalım adlı bölümden de öne koyduk. Çünkü hem okuması, anlaması ve oynaması daha kolay hem de daha görsel ve onun için de biraz daha cazip. Kojo'nun kaplumbağacığını zaten iyi tanıyorsan bir sonraki bölüme atlayıp Scala yani epey ciddi bir yazılım dili öğrenmeye başlayabilirsin.
Kaplumbağacığı hareket ettirerek ona çizgi çizdirten pek çok komutumuz var. Çoğunu aşağıdaki tabloda bulacaksın. Onlara tıklayıver ki kaplumbağacık neler yapabiliyor göresin: her komut düzenleyicide açılır, Çalıştır'a basman yeter. Tablodaki sırayı izlemene gerek yok. İstediklerine birkaç kere tıklayabilirsin.
Aşağıdaki ilk örnekte bir işlev (ya da komut) tanımlıyoruz. Ne yaptığını anladın mı? Çalıştırınca göreceksin. Bir üçgen çiziyor. Fark ettin mi, yinele komuduyla ileri ve sağ komutlarını üçer kere çağırıyoruz.
tanım birÜçgenÇiz() = {
yinele(3) {
ileri(100)
sağ(120)
}
}
sil()
birÜçgenÇiz()
sol()
birÜçgenÇiz()Çalıştırdın ve kaplumbağanın iki tane üçgen çizmesini seyrettin, değil mi? Bu kılavuzdaki kod bloklarının her birini denemeyi unutma. Genelde sırayla gitmende fayda var. Ama bazılarını birden çok da çalıştırabilirsin, bazılarını da es geçebilirsin. Rahat takıl. Biraz oku, biraz dene. Düzenleyicide değişiklikler yap ve tekrar çalıştır. İçinden geldiği gibi davran ki daha keyifle keşfedesin bilgisayar programlamayı!
| Komut | Ne yapar |
|---|---|
ileri(100) | 100 adım ilerler |
sil() | Tuvali temizler ve başlangıç noktasına döndürür |
geri(50) | 50 adım geriye gider |
eksenleriGöster() | X ve Y eksenlerini gösterir |
ızgarayıGöster() | Tuvalin ızgarasını çizer |
konumuKur(150, 100) | Çizgi çizmeden koordinatları verilen (x, y) noktasına gider. Ama baktığı doğrultu değişmez |
noktayaGit(0, -100) | Doğrultusunu koordinatları verilen noktaya çevirir ve o noktaya kadar ilerler |
eksenleriGizle() | Eksenleri saklar |
ızgarayıGizle() | Izgarayı gizler |
dön(30) | Saat yönünün tersine doğru 30 derece döner. Eksi girersen saat yönünde döner |
sağ() | Sağa döner. Yani saat yönünde 90 derece döner |
sağ(60) | Sağa doğru 60 derece döner |
sol() | Sola döner. Yani saat yönünün tersinde 90 derece döner |
sol(30) | Sola doğru 30 derece döner |
noktayaDön(40, 60) | Doğrultusunu koordinatları verilen (x, y) noktasına çevirir |
açıyaDön(30) | Diyelim ki 0 derece ekranın sağı, 90 derece ekranın üstü olsun. Verilen açıya döner |
satıryaz(doğrultu) | Şu anda baktığımız doğrultuyu açı olarak çıktıyla bildirir. 180 sola bakıyor demek. 270 de aşağıya |
ev() | Evine yani (0, 0) noktasına döner ve 90 dereceye yani yukarı bakar |
satıryaz(konum) | Şu andaki konumu çıktı olarak bildirir |
ışınlarıAç() | Dört yönü belirten farlar yansın |
ışınlarıKapat() | Farları söndürelim |
satıryaz(canlandırmaHızı) | 100 adımı şu anda kaç milisaniyede attığını bildirir |
kaplumbağa.geri(100) | Başlangıçtaki kaplumbağamızın adı kaplumbağa. Onu yöntemleriyle de çağırabiliriz |
Tuvali silmek için sil() komutunu kullan (masaüstünde tuvale sağ tıklayıp Temizle'ye de basabilirsin). Şimdi biraz daha uzun örnekler:
sil kalemiKaldır() ileri(100) kalemiİndir() ileri(100)
Kalem kalkıkken hareket ederse çizim yapmaz. Kalem inince çizmeye devam eder.
tanım birÜçgenÇiz() = {
yinele(3) {
ileri(100)
sağ(120)
}
}
sil()
kalemRenginiKur(mavi)
birÜçgenÇiz()Rengini değiştirelim. Çizimin içini boyamak da kolay. Kojo'nun kendi üçgen komudu da var; girdisini değiştirerek değişik boylarda üçgen çizebiliriz:
sil() boyamaRenginiKur(kırmızı) üçgen(80)
Çizim yaptığı kalem kalınlığını da giriyoruz:
sil() kalemKalınlığınıKur(10) üçgen(90) kalemKalınlığınıKur(1)
görünmez ve görünür komutları da şöyle çalışıyor. Kaplumbağacık görünmese de çizim yapmaya devam edebiliyor:
sil() görünmez() ileri(100) görünür() dön(120) ileri(100)
Bulunduğu noktaya yazı yazdırabiliriz. İngilizce'den çevirdiğimiz bazı türlerin adı İngilizce olabilir. Şaşırtmasın seni!
sil
yazı("Merhaba Kardeş!")
zıpla()
yazı(Aralık(10, 0, -1).yazıya)
zıpla()
yazı(Dizi(1, 2, 3).yazıya)
zıpla()Kaplumbağacığın hızını belirlemek için bir süre giriyoruz. 100 adımı girdiğimiz kadar milisaniyede atıveriyor. Epey hızlı canım! Başlangıçta 100 adım atmak 1000 milisaniye yani bir saniye alıyor.
sil() ileri(-100) canlandırmaHızınıKur(10) dön(120) ileri(100)
Verilen (x, y) noktasında yeni bir kaplumbağa canlandırmak da mümkün. İlk yeni kaplumbağaya ad takmayı unuttuk!
yeniKaplumbağa(50, 50) dez yk2 = yeniKaplumbağa(100, 100) yk2.geri(180) // ikinci kaplumbağacığı da hızlandıralım: yk2.canlandırmaHızınıKur(10) yk2.sol() yk2.ileri(300)
yaklaş(oran, x, y) tuvali verilen oran kadar büyültür ya da küçültür ve verilen noktayı tam tuvalin merkezine getirir. ikojo'da aynı işi yaklaşXY(oran, oran, x, y) yapar:
sil() üçgen(100) yaklaş(0.5, 10, 10)
sil() üçgen(100) yaklaşXY(0.5, 0.5, 10, 10)
İleri bölümlerde başka pek çok örnek göreceğiz. Matematiksel işlevleri sevenlere iki üç bölüm sonra kaplumbağalı bir sürpriz de var: Kaplumbağamız Yazılım Akışı bölümünün sonuna yakın hızla bir parabol çizecek! Devam etmek için bir sonraki bölüme geç. Ya da soldaki listeden istediğin bölüme atla.
3Anahtar Sözcükler
Türkçemizde kimbilir kaç bin kelime var? Hepsini bilmek mümkün değil elbet. Ayrıca pek çok kelimenin birden çok anlamı oluyor. Hatta bazen anlamları belirsiz bile olabiliyor ve sözlüğe bakmamız yetmiyor, ne demek istediniz diye soruyoruz. Ama yine de birbirimizi anlamakta genelde zorlanmıyoruz. Bilgisayar dillerindeyse durum çok farklı. Hem çok daha az sözcük gerekli hem de sözcüklerin anlamı çok daha belirli.
Bilgisayar dillerinin derleyicileri olduğunu ve yazdığımız yazılımları donanımın anlayacağı 0 ve 1 sayılarına çevirdiğini duymuş olabilirsin. Bunu yapabilmek için genelde derleyiciler çok küçük ama çok becerikli bir sözlükle yazılır. Bu sözlükteki kelimelere 'anahtar' ya da 'özel' sözcükler deriz. Scala dilinin anahtar sözcüklerinin en önemlilerini bu kılavuzda örnekleriyle görecek ve öğreneceğiz. Yine de bu bölümde hepsini yazdık ki ilerde İngilizcelerini bilmek gerekince gelip bakabilelim.
Bu bölümün gerisini şimdi atla istersen. Sonra merak ettikçe gelip bakarsın. İstersen hızlıca bir göz at. Zaten detaylarını görmeden aşağıdaki açıklamalar pek anlamlı olmaz. Şimdilik bilmemiz gereken tek şey, herşeyin çok küçücük bir anahtar kelimeler sözlüğüyle başladığı. Onun için bir bilgisayar dili öğrenmek yabancı bir dil öğrenmekten çok daha kolay aslında! Tabii bir de kaplumbağacığın anladığı komut sözcükler var. Bir önceki bölümde bir kısmını gördük ve öğrendik. Ama onlar da zaten bizim dilimizdeki anlamlarına çok yakın, değil mi?
Aşağıdaki her satırda bir anahtar sözcük var. İlk sütun, kılavuzdaki kullanış sırasına göre sıralı. Sonra gelip bulmak kolay olsun diye. İkinci sütunda anahtar sözcüğün İngilizce'si var. Keyword diye de bilinir. Eğer o keyword, İngilizce bir sözcüğün kısaltmasıysa o sözcüğün kendisi de üçüncü sütunda. Son sütunda da ufak bir açıklamayla yetindik. Kılavuzumuzun diğer bölümleri daha geniş açıklamalar verecek.
| Türkçe | İngilizce | Açılımı | Açıklama |
|---|---|---|---|
tanım | def | define | İlk bölümde kaplumbağacığa üçgen çizdirmek için kullanmıştık. Bu anahtar sözcük yeni bir işlev tanımlar ve ona bir ad takar. Bu yeni ad da derleyicinin sözlüğüne eklenmiş olur! |
dez | val | value | İlk bölümdeki yeni kaplumbağacığa ad takmamızı sağlayan anahtar sözcük. Bilinen ve değişmez bir değere bir ad takar. Bu yeni ad da yazılımcığın özel sözlüğüne eklenmiş olur. |
den | var | variable | Yeni bir değişken tanımlar ve ona bir ad takar. Bu yeni ad da sözlüğe eklenmiş olur. |
eğer | if | Bir çatallanma yani karar verme durumu tanımlar. Duruma göre iki seçenekten birini seçer derleyici. | |
yoksa | else | eğer sözcüğünden sonra kullanılır. | |
için | for | İşlevsel bir döngü tanımlar. Çok daha iyi bir yöntemdir! | |
ver | yield | İçin komudunun içinde teker teker nesne çıktısı vermek için kullanılır. | |
sınıf | class | Yeni bir tür tanımlar. Nesne odaklı yazılımın ana birim taşıdır. | |
durum | case | İki durumda kullanılır: Daha becerikli bir sınıf tanımlamaya ve örüntü/desen eşlemeye yarar. | |
yayar | extends | Bir türün başka bir türü yaymasına yarar. İleri bir konudur. Hafifçe değindik sadece. | |
yeni | new | Yeni bir nesne oluşturmak için gerekebilir. | |
eşle | match | Örüntü/desen eşlemeye yarar. | |
doğru | true | Mantıksal doğru. Eğer komuduna girdi olarak kullanılabilir. | |
yanlış | false | Mantıksal yanlış. Eğer komuduna girdi olarak kullanılabilir. | |
baskın | override | Daha temel bir türden (üst sınıf da denir) gelen yöntemleri yeniden tanımlarken gerekir. |
Yukarıdaki 15 sözcükle neler neler yapabiliriz yakında göreceğiz. Bu kılavuzda hiç kullanmadığımız diğer anahtar sözcükler de aşağıda. İngilizcelerinin A'dan Z'ye sıralamasına uyduk. Örnek yazılımcıklarda ender de olsa kullanılıyorlar. Ama şu ikisini de unutmayalım:
| Türkçe | İngilizce | Açıklama |
|---|---|---|
yineleDoğruKaldıkça | while | Bir koşul doğru kaldıkça yinelenen bir döngü tanımlar. Koşul baştan yanlışsa döngüye hiç girmez. |
yap | do | Önce 'yineleDoğruKaldıkça' döngüsünün komutları en az bir kere çalışsın sonra da koşuluna bakılsın dersen bu sözcükle olur. |
Bunlar eski programlama dillerinde çok faydalı komutlardı. Ama Scala'da pek gerek yok. Kullanılmasalar daha iyi olur. Onun için birincisinin adını da uzun tuttuk. Kılavuzumuzda da az yer verdik.
| Türkçe | İngilizce | Açıklama |
|---|---|---|
soyut | abstract | Ender kullanılır. Scala kitabından soyut sınıflar |
yakala | catch | Kuraldışı bir durum varsa işe yarar. 'dene' ile birlikte kullanılır. |
son | final | Baskın komuduyla yeniden tanımlanmasını istemediğimiz nesneler ve türler için gerekir. |
sonunda | finally | dene ve yakala komutlarıyla birlikte işe yarar. |
bazı | forSome | Bu Scala3'te yok. Sadece Scala2'de var. Unut daha iyi! |
örtük | implicit | İşte usta yazıcılar için çok faydalı bir komut. Ama Scala3'te daha iyisi var. |
getir | import | Başka bir yazılımın bizim yazılımcığımız içinde kullanılmasını sağlar. |
miskin | lazy | Miskinlik de çok faydalıdır bazı durumlarda. |
yok | null | Bu Java'dan kalma. Hiç kullanma! |
nesne | object | Bazen sınıfa gerek olmaz. Tek nesne yeter. Bazen de sınıfa destek olur. |
deste | package | Büyük yazılımları deste deste düzenlemeye yarar. Sonra 'getir' ile kullanılır. |
gizli | private | Dışarıya gizli nesneler ve türler tanımlamak için. |
koru | protected | Alt türlere açık dışarıya gizli. |
geriDön | return | İşlevden prematüre geri dönüş için. Hiç kullanma daha iyi. |
damgalı | sealed | Bir dosya dışında değişiklik yapılmasını istemediğimiz türler için kullanırız. |
üst | super | Bir üst türden bahsetmek gerekirse. |
bu | this | Bir sınıfın tanımının içinde kendi nesnelerinden bahsetmek için kullanılabilen adıl. Ya da eski adıyla bu zamiri! |
bildir | throw | Kuraldışı durumlarda kullanılır. 'Throw' atmak demek. Emir ya da istek kipi 'at' olacaktı. Ama bazı teknik sorunlardan ötürü olmadı. Zaten bildir sözcüğü daha kibar oldu, değil mi? |
özellik | trait | Temel bir tür tanımlamak için çok faydalıdır. Ama onun yerine 'sınıf' da kullanılabilir. |
dene | try | Kuraldışı durumları sınır içine alır. |
tür | type | Bir türe yeni bir ad takar. |
birlikte | with | Bir türün bir türü başka bir türle birlikte yaymasına yarar. İleri bir konudur. Bu kılavuzda henüz anlatmadık. |
Son olarak da alfabetik sırayla hepsini birbirine bağlayalım, bulmak kolay olsun diye. Önce Türkçe'de sıralı, sonra İngilizce sıralı:
| Türkçe | İngilizce | İngilizce | Türkçe | |
|---|---|---|---|---|
baskın | override | abstract | soyut | |
bazı | forSome | case | durum | |
bildir | throw | catch | yakala | |
birlikte | with | class | sınıf | |
bu | this | def | tanım | |
damgalı | sealed | do | yap | |
den | var | else | yoksa | |
dene | try | extends | yayar | |
deste | package | false | yanlış | |
dez | val | final | son | |
doğru | true | finally | sonunda | |
durum | case | for | için | |
eğer | if | forSome | bazı | |
eşle | match | if | eğer | |
geriDön | return | implicit | örtük | |
getir | import | import | getir | |
gizli | private | lazy | miskin | |
için | for | match | eşle | |
koru | protected | new | yeni | |
miskin | lazy | null | yok | |
nesne | object | object | nesne | |
son | final | override | baskın | |
sonunda | finally | package | deste | |
soyut | abstract | private | gizli | |
sınıf | class | protected | koru | |
tanım | def | return | geriDön | |
tür | type | sealed | damgalı | |
ver | yield | super | üst | |
yakala | catch | this | bu | |
yanlış | false | throw | bildir | |
yap | do | trait | özellik | |
yayar | extends | true | doğru | |
yeni | new | try | dene | |
yineleDoğruKaldıkça | while | type | tür | |
yok | null | val | dez | |
yoksa | else | var | den | |
örtük | implicit | while | yineleDoğruKaldıkça | |
özellik | trait | with | birlikte | |
üst | super | yield | ver |
İşte hepsi bu kadar! Yabancı dil öğrenmekten çok daha kolay değil mi ama? Türkçe ve İngilizce adların tam listesi için Koco Sözlüğü'ne de bakabilirsin.
4Başlayalım
Başlayalım
Kılavuzumuzda pek çok yazılımcık örneği bulacaksın. Onları buradan kolaylıkla çalıştırabilirsin. Herhangi birinin altındaki Editörde aç bağlantısına tıkladığında o örnek düzenleyiciye taşınır; Çalıştır'a bas. Yani hepsini yazmana gerek yok. Ayrıca işin bir güzel yanı da şu: istediğin değişiklikleri orada yapıp tekrar çalıştırabilirsin. Haydi şimdi bunu deneyelim. Aşağıdaki mesajı Bülent yerine kendi adını yazıp tekrar çalıştırıver. Bu arada benim adım Bülent. Bu satırları siz Türkçe severler için severek çevirdim.
satıryaz("merhaba dünya ve kaplumbağacık")
satıryaz("Bülent'ten hepinize selamlar, sevgiler")Yaptığın değişikliğin sonucunu çıktı alanında ya da çizim tuvalinde hemen göreceksin.
Bu kılavuz ilk bölümde gördüğün bölümlerden oluşuyor. Bir sonraki bölüme geçmek için her bölümün sonundaki bağlantıyı kullan; ilgini çeken bölüme de soldaki listeden kolaylıkla atlayabilirsin. Kılavuz ayrı bir sekmede açıldığı için düzenleyicideki yazılımcığın kapanmaz; onun üzerinde değişiklikler yapıp çalıştırmaya odaklanabilirsin.
Her örneği deneyebilir, istediğine geri dönüp değişiklikler yapıp tekrar çalıştırabilirsin. Değişik fikirler dener, yazılım dilini daha iyi tanıyıp yazım, yazılım gramer (syntax) kurallarını daha çabuk öğrenebilirsin. Düzenleyicideki programları Kaydet ile kalıcı bir adrese kaydedebilir, bağlantısını paylaşabilirsin (giriş yapman gerekir).
Şu anda kullandığın Kojo öğrenim ortamı, çok gelişmiş ve uzman bilgisayar mühendislerinin en sevdikleri dillerin önde gelenlerinden Scala yazılım dilini öğrenmene yardımcı olmak için hem çok faydalı hem de eğlendirici özellikler ve beceriler içeriyor. İleri matematik kavramlarını resimler ve grafikler çizerek inceleyip daha iyi öğrenir, değişik tür oyunları hem oynayabilir hem de nasıl yazıldıklarını kolayca öğrenebilir, hatta fizik deneyleri bile yapabilirsin! En güzeli Kojo'nun kaplumbağaları var! Onlara yol göstererek çizimler yaptırabilirsin. Küçük, hemen anlayıp seveceğin tek kaplumbağalı bir örnekle başlayalım mı? Kaplumbağa yürüsün ve bir taraftan da bir üçgen çizsin istersen, bu yazılımcığı çalıştırman yeter:
sil ileri(100) sağ(120) ileri(100) sağ(120) ileri(100) sağ(120)
Bu kılavuzun ikinci bölümünde daha pek çok örnek yazılımcık ve kaplumbağanın anladığı komutların bir listesini bulabilirsin.
Scala dili tam anlamıyla genel ve güçlü bir bilgisayar programlama dilidir. Özelliklerinin çoğunluğu uzman programcılara ve bilgisayar mühendislerine tanıdık gelecektir. Bu kılavuzdan faydalanmak için yazılım dili bilmesen de olur, ama elbette daha önce başka bir yazılım diliyle deneyimin olduysa daha hızlı ilerleyebilirsin. Onun için anladığın yerleri ve bölümleri hızlı geçmen hatta atlaman bile doğal olur.
Öyleyse, başlayalım mı artık?
Deyişler
Basit matematiksel deyişler pek şaşırtıcı gelmeyecektir. Tanıdık matematik işlemleri ve öncelikleri Scala'da da geçerlidir. İşlemleri daha açık açık sıralamak için parantez kullanılır.
satıryaz içine alıyoruz.satıryaz(1 + 2) satıryaz(3 + 4 * (2 - 3)) satıryaz(23 % 5)
Son satırda tabanlı aritmetik işlemi yaptık. 5 tabanında. Yani 5'e bölünce ne kalıyorsa onu bulduk.
satıryaz(6 / 4)
Bu son işlemde önemli bir nokta var. Tam sayılar bölününce sonuç yine bir tam sayı olur ve kalan dikkate alınmaz. Ufak bir değişiklikle kesirli ve daha doğru bir işlem yapabiliriz:
satıryaz(6 / 4.0)
Biraz daha uzun bir işlem yapalım:
satıryaz(3.5 * 9.4 + 7 / 5)
Scala tam ve kesirli gibi değişik bir kaç sayı tipini tanır. Hepsinin bir tür adı var. Örneğin Sayı, Uzun, İriSayı, Kesir, vb. Bunları ileride detaylı olarak inceleyeceğiz. Yukarıdaki iki örnekten 4.0 ve 3.5 kesir (İngilizcesi Double), 4 ve 6 ise birer tam sayıdır (İngilizcede Integer, kısaca Int). Eğer bir matematiksel deyiş bir kaç tür sayı içeriyorsa Scala derleyicisi mümkünse sayının türünü biraz zorlayarak değiştirebilir.
Bir deyişin sonucunu bir değişken (aslında çoğunlukla bir değişmez değer) kullanarak kaydedip daha sonra yine kullanabiliriz. Değişken ve değişmez değer isimleri (ve sonra göreceğimiz başka tür isimler) harf, sayı ve * / + - : = ! < > & ^ | gibi semboller kullanarak yazılır. Örneğin, "FutbolTopu", "BilardoTopuBeyaz1", "yardımHattı", "*+" ve "res4" (result yani sonuç)...
Bunun için iki yöntem vardır: den ve dez anahtar sözcükleri. dez sözcüğüyle sabit ve hiç değişmeyecek değerleri ve sonuçları saklayabiliriz. Bunlara değişmez değer, ya da kısaca değişmez diyelim. Ya neden bir de den anahtar sözcüğü var? Aşağıda bir örnekle ikisinin farkını hemen anlayacağız. dez ile tanımlanan değerlerin sabit olması (İngilizcede 'immutable value') aslında çok önemli bir işlevsel yazılım (functional programming) kavramıdır, ama bunu daha sonra yeri gelince daha iyi anlayacağız. Şimdilik mümkün oldukça den yerine dez komutunu kullanmaya dikkat edelim. Bu sayede yazılımın başka bir yerindeki değişkenleri yanlışlıkla bozamayız.
dez noktaSayısı = 34 + 5 satıryaz(noktaSayısı)
Bir ya da daha fazla sayıda işlemin sonucunu çıktı alanına satıryaz(deyiş) komutunu kullanarak yazabiliriz. Birden çok deyişi yan yana yazmak istersek satıryaz(deyiş1, deyiş2, deyişn) da olur; masaüstü Kojo bunları aralarına boşluk koyarak yazar, ikojo ise (d1,d2,dn) biçiminde bir sıralama olarak gösterir. Deyişler arasına virgül koymayı unutmayalım.
dez noktaSayısı = 34 + 5 satıryaz(noktaSayısı, 3 + 2, noktaSayısı / 2, 3.9 / 2.3) den boy = noktaSayısı + 4 satıryaz(boy)
Masaüstü Kojo'nun çıktı gözü her değerin adını ve değerini yazmakla kalmaz, ikisinin arasında o değerin türünü de yazar: Int (Sayı), Double (Kesir) vb. Şimdi deneyelim:
dez noktaSayısı = 34 + 5 noktaSayısı = 10
Bu hata verdi, değil mi? dez ile tanımlanan değişkenlerin değerleri değiştirilemez. Scala derleyicisi (compiler), 'Error: reassignment to val' yani sabit bir değeri değiştirmek hata olur diyor ve izin vermiyor. 'error' hata demek.
dez x = 3.14 x = 3.1415
Şimdi boyunu 4 nokta uzatalım:
dez noktaSayısı = 34 + 5 den boy = noktaSayısı + 4 boy += 4 satıryaz(boy)
Okuyanları bilgilendirmek ve kendimize anımsatmak için satır sonlarına // yani iki taksim ya da bölüm işaretinden sonra bir açıklama yazabiliriz. Bir satıra sığmıyorsa /* ile başlayıp */ ile biten daha uzun açıklamalar ekleyebiliriz. Scala derleyicisi bunları göz ardı eder ve bu sayede bilgisayarın kafası karışmaz 8-).
/*
Çok satırlı bir açıklama örneği
Fahrenayttan santigrata çevirelim
*/
dez dereceF = 98.4 // vücut termometresi bunu göstersin
satıryaz(dereceF, "derece Fahrenayt",
(dereceF-32)*5/9, "derece Santigrat")satıryaz komutuyla yazı yazdık, yukarıda gördüğün gibi. Böyle çift tırnaklar içine alınan yazıların türüne Yazı (İngilizcesi String) diyoruz. Bu tür, sadece yazı yazmak için değil, yazılarla işlemler yapmak için de kullanılabilir:
dez adım = "Mustafa Kemal" dez mesaj = "Merhaba " + adım satıryaz(mesaj)
Toplama işareti sanki toplama yaparmış gibi yazıları birbirine ekleyiveriyor. Mantıklı değil mi? Yazı türüyle daha neler yazılabilir neler! İki bölüm sonra başka örnekler de göreceğiz.
İki tabanlı sayma ve parçacık işlemleri
Duymuşsundur eminim, bilgisayar devreleri aslında 2, 3, 4 gibi sayıları bile bilmez. Onun yerine sadece 0 ve 1 sayılarını tanır. Hatta tanımak dedik de aslında sadece voltaj değerlerini ve elektrik akımlarını tanır onlar. Bu uzun, ilginç ve çok keyifli bir öyküdür. Benim gibi elektrik mühendisi olmak istersen, bana emaille selam ve sorularını yollayabilirsin. Neyse, konumuza dönelim. Daha büyük sayılarla işlemler yapmak için bilgisayar onları bir 0 ve 1 dizisi olarak ele alır ve içindeki sayısız mantık devreleri sayesinde toplama, çıkarma, çarpma, bölme ve hatta türev ve integral alma gibi daha ileri matematik işlemlerini kolayca ve hiç üşenmeden halleder. Bunların detayı bilgisayar uzmanlarının işi. Biz 0 ve 1 dizilerine dönelim, çünkü herşey onlarla başlıyor! İngilizcede 'binary arithmetic' denir. Biz iki tabanlı sayma diyelim. Her sayı, 0 ve 1'lerden oluşan bir dizi olduğu için, direk onun parçacıkları üzerinde de işlemler yapabiliriz. Bu işlemlere 'bitwise' yani parçacıksal işlem denir. Böyle 0 ve 1 dizilerinin her bir elemanına İngilizcede 'bit' denir. Saçlarımızda yaşayan ve zararsız küçük böcekcikler değil elbet! İngilizcede azıcık, küçücük anlamlarına geliyor. Biz parçacık diyelim istersen. Çok uzattık. Kusura kalma. Şimdi parçacıkları teker teker nasıl işleme sokarız bir kaç örnek görelim:
satıryaz(3 & 2)
Bu & imiyle mantıksal 've' işlemi yapıyoruz (İngilizcesi 'logic and'). Sadece 1 ve 1 sonuç olarak 1 verir. Girdilerden biri 0 olursa sonucu da 0 olur. | da mantıksal veya (or) işlemi. Sadece 0 veya 0 sonuç olarak 0 verir. Biri 1 olursa sonuç da 1 olur:
satıryaz(1 | 2)
Mantıksal dışlayan veya işlemi (xor yani exclusive or) aşağıda. Sadece biri 1 öbürü 0 olunca 1 verir:
satıryaz(1 ^ 2)
Parçacıkları sola kaydırmak ikiyle çarpmaya denk! İki kere kaydırsak ne olur? Ya 10, 20 ya da 30 kere kaydırsak?
satıryaz(1 << 2) satıryaz(1 << 10) satıryaz(1 << 20) satıryaz(1 << 30)
Nasıl da hızlı büyüdü, değil mi? 10 kere kaydırmak, 2'yi on kere kendisiyle çarpmak demek, yani iki üssü ona denk. O da 1024 ediyor. Binden birazcık fazla. 2 üssü 20, bir milyonu; 2 üssü 30 da bir milyarı geçti...
Sağa kaydır ama eksiyse eksi kalsın:
satıryaz(-24 >> 2) satıryaz(-14 >>> 2)
Sağa kaydırıyor ama sonuca bakın! Ben anlamadım vallahi. Ya sen? Bakın bu çok ilginç. Parçacıkları sola kaydırmak ikiyle çarpmaya denk! Sağa kaydırmaksa ikiye bölmeye benzemiyor mu? Bu daha önce de dediğim gibi uzmanlık konusu. Üzerinde yazılmış pek çok bilimsel makale ve ders kitapları var. Hatta bazıları çok azımızın anlayabileceği yüksek ihtisas kitapları! Bugünlük bu kadarı fazla bile. Ama sen istersen bu yazılımcığı kurcala. -14 yerine 14'ü dene. Çalıştır ki sonucu hemen göresin. Bakarsın uzman olmak istersin. Neden olmasın?
Farkında mısınız? Bu kadarcık bilgiyle bile artık çok güçlü bir hesap makinemiz oldu. Ama dahası var! Bir sonraki bölümde program akışı nasıl düzenlenir öğrenecek ve yazılımcıklarımızı çok daha becerikli hale getireceğiz.
5Yazılım Akışı: Eğer, Yoksa ve İçin
Şu ana kadar yazdığımız yazılımcıkların komutları, baştan sona kadar, sırayla, satır satır ve teker teker çalıştılar. Ama pek çok durumda program akışını değiştirmek isteriz. Yani komutların çalışma sırasını duruma göre değiştiririz. Bu sayede, bazı komutları yineler, bazılarını atlarız.
İlk önce bir komut dizisi (ya da komut bloğu da denir) oluştururuz. Bunun için komutları kıvrık parantezler, yani {} içine alıyoruz. Bu komut dizisi istediğimiz kadar satır ve hatta başka komut dizileri de içerebilir. Dizinin içindeki son komut dizinin değerini belirler.
Program akışını değiştirmek için kullandığımız bir kaç değişik yöntem var. Gelin en önemlilerinden biri olan, eğer/yoksa yapısıyla başlayalım. Bu iki anahtar sözcük bir koşul kullanarak bir karar çatalı oluşturmaya yarar.
eğer
Genel olarak şöyle yazarız: eğer (koşul) dizi1/deyiş1 yoksa dizi2/deyiş2. Eğer koşul doğruysa ilk kısım yani dizi1/deyiş1 çalışır. Yoksa 'yoksa' sözcüğünden sonra gelenler çalışır.
eğer(doğru) satıryaz("Doğru") yoksa satıryaz("Doğru değil")Bunu daha kısa da yazabiliriz. 'eğer/yoksa' deyişi hep bir değer verir. Bakın bunu da satıryaz komutuyla yazıyoruz.
satıryaz(eğer(doğru) "Doğru" yoksa "Doğru değil")
Kullandığımız koşulun geçerli olması için 'doğru' ya da 'yanlış' (İngilizcede 'true' veya 'false') değerlerinden birini vermesi gerekir. Bu değerlerin türüne biz İkil deriz (İngilizcesi Boolean). Bu koşulu sağlayan işlemlere karşılaştırma işlemi deriz. Bunlar matematiksel işlemler ya da benzerleri olabilir. İlk önce matematiksel olanları, yani sayıları karşılaştıran işlemleri görelim. Başka tür değerleri (örneğin sözcükleri) karşılaştırmayı sonraya bırakalım.
satıryaz(1 > 2) // büyüktür satıryaz(1 < 2) // küçüktür satıryaz(1 == 2) // eşittir satıryaz(1 >= 2) // büyük ya da eşittir satıryaz(1 != 2) // eşit değil satıryaz(1 <= 2) // küçük ya da eşittir
eğer/yoksa yapısının nasıl çalıştığını anlamak çok kolay. Koşul doğruysa 'yoksa' sözcüğünden önceki komutlar çalıştırılırlar. Yok, eğer koşul doğru değilse, o halde 'yoksa' sözcüğünden sonraki komutlar çalıştırılır. Scala ve diğer işlevsel dillere benzemeyen yazılım dilleri (örneğin, C, Java, Python), eğer/yoksa yapısını sadece akışı belirlemek için kullanırlar. Ama Scala, Haskell ve diğer işlevsel diller gibi, eğer/yoksa yapısından bir değer beklerler. Onun için 'eğer' genelde tek başına kullanılamaz. Arkasından hemen 'yoksa' gelir ve iki durumda da bir değer geri bildirilir. Bunun bir istisnası da vardır, ama onu da sonraya bırakalım. Bakın bu örneklerde koşul olarak hep yalın sayıları karşılaştırıyoruz. Ama elbette başka dez değerler ve komutlar da kullanabiliriz. Yeter ki bir İkil, yani doğru ya da yanlış değeri olsun.
satıryaz(eğer (1>2) 4 yoksa 5) satıryaz(eğer (1<2) 6 yoksa 7) dez deneme1 = eğer (1==2) 8 yoksa 9 satıryaz(deneme1)
dez kitapsa = 6 >= 3 // bu doğru
dez değer = 16
dez sayı = 10
dez satış = eğer (kitapsa) değer * sayı yoksa {
dez birim = değer / sayı
birim * 3
}
satıryaz(satış) // doğru mu?{ ve } içinde bir dizi deyiş ya da bir dizi komut yazabiliyoruz. satış değeri dizi içindeki en son deyişin değeri olur.
Gerçek hayatta da olduğu gibi bazen bir kaç koşul bir araya gelir. Bu durumda iki tane mantıksal işlem kullanırız. Bunlardan birincisi && mantıksal 'Ve' anlamına gelir. İkincisi de || mantıksal 'Veya' anlamına gelir. Bunları sakın parçacıkları işleyen & ve | işlemleriyle karıştırmayalım. Aslında ilişkili ve benzer kavramlar. Ama dikkat edelim. Çok uzatmadan birkaç örnek görelim, göreceksin çok doğal gelecek. Ne de olsa mantık hepimizde var.
dez kitapsa = 6 >= 3
dez değer = 16
dez sayı = 10
dez satış =
eğer ( (kitapsa && değer > 5) || ( sayı > 30) ) değer * sayı
yoksa değer / sayı
satıryaz(satış)yineleDoğruKaldıkça
Bu yapı bilhassa eski yazılım dillerinde çok kullanılır. İngilizce'de pek çok farklı anlama gelen 'while' sözcüğü komut olarak kullanılır. Türkçemize 'o halde' ya da 'o sırada' diye de çevirebiliriz. Genel olarak, yineleDoğruKaldıkça (koşul) dizi/deyiş yapısı kullanarak komut dizisini tekrar tekrar çalıştırabiliriz. Koşul sağlandığı sürece yineleme devam eder. Koşul değişince, yani artık doğru olmadığında yineleme son bulur. Bir örnekle anlamak çok daha kolay olacak. Ama ilk önce bir değişkenle başlayalım:
den toplam = 18 yineleDoğruKaldıkça (toplam < 15) toplam += 5 satıryaz(toplam)
Kolay değil mi? Sizce kaç kere yinelenecek komut? Sonunda toplam kaç olacak? Bu biraz hileli bir soru oldu. Aslında yinelenecek mi, toplam değişecek mi diye mi sormalıydık? Toplamın ilk değerini ya da koşulu değiştirip tekrar çalıştırabiliriz elbet. Bu 'yineleDoğruKaldıkça' yapısını 'yap' adlı anahtar sözcüğü kullanarak tersine de çevirebiliriz: yap dizi/deyiş yineleDoğruKaldıkça (koşul). Bakın burada ilk önce komut dizisi çalıştırılır sonra koşula bakılır. Doğruysa komut dizisi yinelenir:
den toplam = 18 yap toplam += 5 yineleDoğruKaldıkça (toplam < 15) satıryaz(toplam)
Gördük ki bu sefer toplam 23 oldu. Bir önceki örnekteki halbuki 18 olmuştu. Bakın bu yapıyı iki sayının ortak paydalarının en büyüğünü hesaplamak için kullanalım:
// en büyük ortak paydayı bulalım
den x = 36
den y = 99
yineleDoğruKaldıkça (x != 0) {
dez yardımcı = x
x = y % x
y = yardımcı
}
satıryaz("ortak paydaların en büyüğü: " + y)için
Komut dizilerini kolayca yinelemek için kullanabileceğimiz bir yöntem daha var ki belki de en faydalısı. için (aralık) dizi/deyiş sayesinde verilen aralıktaki her bir değer için dizi/deyiş yinelenir. Aralık da nedir mi? Hemen bir örnek görelim:
için ( i <- 1 |-| 4 ) yaz("merhaba!")Bunun İngilizcesi de şöyle:
için ( i <- 1 to 4 ) yaz("merhaba!")'to' sözcüğü de bizim yapım/çekim ekimiz gibi, birden dörde kadar derken dörde sözcüğündeki '-e' anlamında. İngilizceyle Türkçe ne kadar farklı sanki, değil mi? Bir de bana sorun. 22 yaşında yaşamak için Amerika'ya gittiğimde, ki daha önce yurtdışına çıktığım günler sayılıdır, o kadar zorluk çektim ki! Güya iyi biliyordum hem de İngilizceyi! İşimize dönelim: Aralık burada birden dörde kadar olan sayılar elbet. i değişkeni 1 değeriyle başlıyor ve her tekrarda bir artıyor. Son sayı burada 4. Ama sonuncu sayıya gelmeden hemen önce durmak istersek |-| yerine |- imgesini kullanıyoruz:
için ( i <- 1 |- 12 ) {
dez kare = i*i
satıryaz(i, kare)
}Bunun İngilizcesi de şöyle:
için (i <- 1 until 12) {
dez kare = i*i
satıryaz(i, kare)
}İngilizce'de 'until 12', 12'ye kadar anlamına geliyor.
Biliyor musun, bu yineleme işlemlerini birden çok boyutta yapmak bilgisayarla çok kolay. Birden fazla aralık vereceğiz ve her aralık için de bir değişken (aslında değişiyor gibi göründüğüne bakma, bunlar da değişmez). Tek dikkat etmemiz gereken ikisi arasına bir noktalı virgül koymak. Bakın ne kolay!
için (i <- 1 |- 5 ; j <- "abc") satıryaz(i, j)
Bakın şu işe! Sayı yerine harfler kullandık! için yapısı içinde kullandığımız kümeler illa da sayılardan oluşmak zorunda değil yani. Genel olarak biz bunlara küme tekerleme diyebiliriz (İngilizcesi: iterating through a set or collection) yani teker teker her küme elemanını ele alıyoruz. "abc" yazısı da aslında bir harf kümesi ya da kolleksiyonu. Bakın hep küme ya da kolleksiyon dedim. Bu kavramlar yakın ama ufak farklılıkları var. Daha sonra bunlara verilen anlamı daha iyi anlayacağız. Şu anda çok da önemli değil gerçekten. Neyse. Harflerle tekerlemeye bir örnek daha verelim ve devam edelim:
için(c<-"merhaba!") satıryaz(c)
Bu için komudu aslında çok faydalı. Sadece çıktı için kullanılmıyor. Anahtar sözcük ver ile birlikte kullanarak bir dizi değer oluşturabiliriz. Bir küçük örnekle yetinelim şimdilik:
dez ikililer = için(i <- 1 |- 5 ; j <- "abc") ver(i, j) yaz(ikililer)
Şimdi de matematik, bilhassa kartezyen geometrisi sevenlere bir sürprizimiz var. Kaplumbağacığı kullanarak bir eğri çizelim. Neyin eğrisi? İki boyutlu bir polinom, yani çok terimli bir matematiksel deyiş. Genel olarak a*x^2 + b*x + c diye yazabiliriz. Yine bu çok faydalı olan için yapısıyla:
sil yaklaşXY(0.9, 0.5, 60, 400) tanım eğri(x: Kesir) = 0.01 * x * x - 0.5 * x - 10 ızgarayıGöster(); eksenleriGöster() dez aralık = 200 atla(-aralık,eğri(-aralık)) hızıKur(orta) için(x <- -aralık+10 |-| aralık+100; eğer (x % 10 == 0)) noktayaGit(x, eğri(x))
eğri adında yeni bir işlev tanımlayıverdik. Bunu daha sonra daha iyi anlayacağız. (ikojo'da ızgara ve eksen komutları henüz yok; o satırı silip çalıştır, parabol yine çizilir.)
Şimdilik x ve y eksenlerini ve kare çizgileri silelim. Ve bir sonraki bölümle devam edelim!
eksenleriGizle(); ızgarayıGizle()
6Yalın Değerler, Sayılar, Kesirler ve Yazılar
Bütün hesaplar gibi, bütün programların da yapıtaşları 'yalın' değerlerdir. Nedir onlar? Örneğin 1, 2, 1/3, 3.14, 'a', 'b', 'ç', "Merhaba Güzel Dünya!", ve aklın alamayacağı kadar çok sabit yani değişmez değerler. Hepsini biliyorsun elbette. Tabii bu örnekler biraz karışık oldu. Bir harfle bir sayıyı karıştırmak iyi olmaz. Onun için bunları türlerine ayırmak Scala'nın çok iyi becerdiği bir konu. Başka pek çok dil de buna dikkat eder. Ama göreceksin Scala bir başka. Uzatmadan en temelinden başlayalım.
Temel Türler
Scala kendiliğinden bazı temel türler tanımlar. Daha ilerde göreceğimiz gibi sen de kendi türlerini tanımlayıp Scala'dakilere ekleyebilirsin. Ama ilk önce bu temel türlerle tanışalım, işi kolay kılalım.
| Tür | Açıklama |
|---|---|
Lokma | İngilizcesi Byte. -128'den başlar, -127 -126 ... -1 0 1 2 ... 127'e kadar gider. Neden seçip ayırmış bu sayıları acaba? Daha önce de konuştuk ya, bilgisayar, her sayıyı sıfır ve bir sayılarının dizisi olarak saklar ve işler. Bu sayı dizilerindeki bir ve sıfır sayılarına parçacık demiştik. Sekiz tanesini bir arada ele alırsak, ona Lokma diyoruz. Eksi sayıları artılardan ayırmak için o parçacıklardan birine özel bir anlam veriyoruz. Geriye kalıyor 7 parçacık. İkinin üstlerini anımsayalım: 2 4 8 16 32 64 128. Yani 7 parçacıkla 128'e kadar sayabiliyoruz. İngilizcede buna "8-bit signed 2's complement" derler. Uzattık ama temelin temeli bu! Neyse, şimdilik bu kadar yetsin |
Kısa | (Short). İki lokma yani 16 parçacık. -32,768'den başlayıp 32,767'yle biter |
Sayı | (Integer) Dört lokma yani 32 parçacık. -2,147,483,648'den 2,147,483,647'e kadar gider |
Uzun | (Long) İki sayı yani 64 parçacık. -2^63 ile 2^63-1 arası |
UfakKesir | (Float) 32 parçacık kullanarak kesirli sayıları ifade eder. İşini ciddiye alır ve IEEE'nin 754 no'lu standardına göre yapar. Bilirsin pi sayısının basamakları bitmek bilmez. UfakKesir olarak ama tam değeri şudur: 3.1415927 |
Kesir | (Double) Ufak kesirden iki kat daha hassas. Bunu da 64 parçacık kullanarak sağlar. Pi sayısını şöyle bilir: 3.141592653589793. Aynı ufak kesir gibi ciddi standarda uyar. |
Harf | (Char) Unicode karakter. 16 parçacık (bit) yani 2 lokma kullanır. Eksi artı sıkıntısı yoktur. İngilizce'de 'unsigned' denir. |
Yazı | (String) Sınırsız bir harf dizisidir. Çok basit olsa da çok faydalıdır. |
İkil | (Boolean) doğru ve yanlış değerlerini bilir başka da birşey bilmez. Başka bir lakabı da Seçim. |
Sayma Sayıları
Tabloda da gördüğümüz gibi dört temel tür var (bir de iri sayılar var. Çok büyük sayma sayılarıyla oynamak için tasarlanmış sayı türünün adı İriSayı (BigInt). Eğer canın mümkün olan bütün briç ellerini saymak isterse Uzun yetmez İriSayı gerekir. Merak edersen bana haber ver. Konuşuruz.) Bunları tekrar anımsayalım çünkü çok faydalılar: Lokma Kısa Sayı ve Uzun. Yalın sayı değerlerini girmenin tek yolu var sanma. Farklı tabanlar kullanabiliriz. Sadece onluk tabanla sınırlı değil becerimiz. Onaltılık taban da bazen işe yarar. Bunu belirtmenin yolu ilk rakamı 0 yapmak.
Bize en doğal gelen onluk tabanın yalın sayıları 1 2 3 ... 8 ya da 9 ile başlar (decimal):
satıryaz(17) satıryaz(653) dez benimSayım = 653 dez benimSayım2: Sayı = 653 satıryaz(benimSayım == benimSayım2)
Onaltılık taban da bilgisayara ve bazı algoritmalara çok doğal gelir (hexadecimal): Sıfırla başlar ve x harfini ekleriz. Büyük X de olur. Farketmez. Sonra da onaltılık tabanın 16 sayısından seçeneklerle devam ederiz. İlk onunu herkes bilir, 0 1 2 ... 8 9. Sonra değeri onluk tabanda 10 olan a ya da A, sonra 11'e denk b/B ... en son da 15'e denk olan f/F. Ne ilginç değil mi? 13 yazmak yerine 0xd ile batıl inançlara da son verebiliriz belki!
dez x1 = 13
dez x2 = 0xd
eğer (x1 == x2) satıryaz("kim korkar d'den?!")
satıryaz(0x23) // onaltılık taban. Yani onluk tabanda 35
satıryaz(0x01FF) // onluk tabanda 511
satıryaz(0xcb17) // onluk tabanda 51991Varsayılan durum bunların Sayı türünde olduğudur. Ama bazen Uzun sayı olması gerekebilir. Onu ifade etmek de kolay. Sonuna "l" ya da "L" (yani İngilizce Long) koyarız. U veya u da iyi olurdu ama bunu Kojo'ya eklemeyi bilemedim ben. Belki de Scala, hatta Scala'nın atası olan Java'yı güncellemek gerekmesin?
satıryaz(0XFAF1L) // Uzun sayı onluk tabanda 64241
Yalın değerlerin Kısa ve Lokma türlerinde olmasını isteriz bazen. Ama, dikkat edelim ki geçerli aralığı aşmasın. Yoksa ne olur? Deneyerek daha iyi anlarsın sanıyorum.
dez birLokma: Lokma = 27 dez kısaSayı: Kısa = 1024 satıryaz(birLokma, kısaSayı)
dez sorunYok: Lokma = 127 dez sorunsuz: Lokma = -128 dez hataVerir: Lokma = 128
Son satır hata verdi. "Error... type mismatch" gibi birşeyler dedi. Yani türler uyuşmadı diyor. 128 sayısı Lokma'ya sığmıyor.
Kesirli sayılar
Kesirli sayıları yalın olarak ifade etmek için nokta kullanırız elbet. Sıfır dışında bir sayıyla başlarlar. İşin ilginci sonuna E veya e harfi ekleyebiliriz. O İngilizce exponent yani üssü anlamına gelir ve hemen arkasından bir tam sayı (eksi de olabilir) ekleriz. Örneklerle anlamak daha kolay olacak:
satıryaz(9.876) dez çokKüçük = 1.2345e-5 dez epeyBüyük = 9.87E45 satıryaz(çokKüçük, epeyBüyük)
Daha iyi anlamak için şu örneklere bakalım:
satıryaz(2e3) // yani 2000. üç sıfır ekliyoruz yani satıryaz(3e-2) // yani 0.03. yüzle çarparsak 3 oluyor, fark ettin mi? satıryaz(0.5e1) // 5.0 yazsak daha açık olurdu. Sadece daha iyi anlamak için satıryaz(8e9)
Son satır 2022'nin son günlerinde yeryüzündeki insan kardeşlerimizin sayısını gösteriyordu! Nüfusumuz kaç oldu?
Varsayılan, kesirli yalın sayıların Kesir türünde olmasıdır. Ama istersen UfakKesir de olabilirler. Sonuna f ya da F getirmen yeter. Bu İngilizce "float" sözcüğünden gelir o da bizim noktanın adı "floating point" olduğu için. Eğer Kesir olduğunu açık etmek istersen sonuna d veya D getiriver. O da "double" sözcüğünün baş harfi. Neden double? Çünkü UfakKesir 32 parçacık kullanırken, Kesir 64, yani iki katı parçacık yani daha çok bellek kullanır. Bellek büyüdükçe de hassasiyet artar. Öte yandan ne kadar çok bellek kullanırsak, hem belleğin sınırlarını aşma tehlikesi artar hem de program daha yavaş çalışır. Onun için bazı programları yazarken hangi tür sayıları seçeceğimize çok dikkat ederiz.
dez ufakkesir1 = 1.5324F dez ufak2 = 3e5f satıryaz(ufakkesir1, ufak2)
Harfler
Bilgisayar, okumayı yazmayı bilmese de pek çok karakteri ya da harfi tanır. Sadece Türkçe ve İngilizce alfabeler değil hem de. Daha başka pek çok tek harf dediğimiz sembol, ya da karakter var. İngilizce adı da zaten Char, yani character sözcüğünün kısaltması. Bu harfleri yalın olarak girmek kolay. Tek tırnak içine alıverelim:
dez harf = 'A' satıryaz(harf)
Bu değeri girmenin daha zor yolları da var! Şaka şaka. Daha genel yolları bilmekte fayda var: Evrensel kodlama şöyle oluyor. '
