(PcWorld Dergisi, Kasım 2006)
Hatırlatıcı Girişe Katkı: Evet, koca bir sayı iki tane sayıyı toplayabilmiştik!
Katkıya Tepki: Öyle deme, gerçekten de bir çok taşın yerine oturmasını sağladık. Zaten bundan sonraki işlemlerde geçen aylardaki açıklamalarımızın üzerine bazı eklemeler yaparak kurduğumuz binayı daha da sağlamlaştıracağız.
Katkıya Tepkiye Bir Değerlendirme: Ağabey, gerçekten çok entelektüel bir mahiyette konuştun, benzetmeler, bina filan… Bayağı güzel oldu, büyük adamsın vesselam…
Değerlendirmeye Değerlendirme ve Konuya Giriş İsteği: Şimdi seni bir benzetirim görürsün. Nerede kalmıştık?
Giriş İsteğine Sitem İçeren Bir Cevap: Yahu söyledim ya az önce. Çok unutkan oldun sen. İki sayıyı topladık diye. Sanki hep iki sayıyı toplayacakmışız gibi.
Gelişme Bölümüne Katkı Sağlayacak Soru Bulmuş Yazar Heyecanı: Bir dakika… Ne dedin sen? Sanki gep iki sayı toplayacakmışız gibi mi dedin?
Heyecanı Kuvvetlendirici Cevap: Evet!
Gelişmeye Başlayacak Yazar Heyecanı ve Akabinde Basit Bir Soru: Güzel. Evet, sadece iki sayıyı toplamayacağız. Belki de 10 sayıyı toplayacağız. Peki bu durumda algoritmamız farklı olur mu?Yada geçen ay yazdığımız program da ne değişir?
Basit Soruya Doğru Cevap: Mantık değişmez. Neticede girilecek sayı adedini biliyoruz. Kurarız bir döngü! Sayıları da sırayla öğreniriz… Sonra da döngünün içinde, öğrendiğimiz her yeni sayıyı toplama ekleriz!
Şaşırma: Vay be! Nasıl bu kadar çabuk bilebildin?
Çalışkan Öğrenci Tepkisi: Ben çalışıyorum yahu! Üstelik bu mevzunun mantığı ile ilgili olarak Mayıs ayında genişçe bahsetmiştik. Sonuçta algoritma için şöyle demiştik:
Adım 1: SayıAdedi=0 ve Toplam=0 al.
Adım 2: SayıAdedi=SayıAdedi+1
Adım 2: SayıAdedi’inci sayıyı Sayı değişkenine ata.
Adım 3: Toplam=Toplam+Sayı
Adım 4: Eğer SayıAdedi=5 ise Devam et, değilse Adım 2’ye git.
Adım 5: Sunuç: Toplam değişkeninde!
Tebrik ve Rehberlik Hizmeti: Bravo! O halde, bunun PASCAL kodunu yazalım! Yazalım ki ahali denesin. Ve bu vesile ile ETİKETLEME, program esnasında YER BULMA işlemlerini de görelim.
VAR // Tanımlamalar
SayiAdedi, Sayi, Toplam,ToplanacakSayiAdedi: integer;
Label Adim2Yeri
BEGIN
ToplanacakSayiAdedi:=10;
Toplam:=0; SayiAdedi:=0;
Adim2Yeri:
SayiAdedi:=SayiAdedi+1;
Writeln(SayiAdedi, “ inci sayıyı giriniz:”);
Readln(Sayi);
Toplam:=Toplam+Sayi;
If (SayiAdedi=ToplanacakSayiAdedi) then goto Adim2Yeri;
Writeln(ToplanacakSayiAdedi, “ adet sayınızın toplamı=”, Toplam);
END.
Kodu İnceleyen Bir Kişinin Sorabileceği Bir Soru: LABEL de nesi?
Danışıklı Dövüş İmajı Veren Soruya Gereken Cevap: Label, etiket demek. Hani bir nev-i işaretlemek. Algoritmamıza bakacak olursak, kodların sırasını numaralandırdık ve istediğimiz herhangi bir algoritma satırına kolayca dönebildik! Çünkü o adımın bir numarası, bir İZİ var. İşte LABEL, programcılık için kodlamadaki bazı yerleri kolayca bulmamızı sağlayan bir İzdir, İŞARETtir. Kodlamanın herhangi bir anında, İŞLEM SIRASINI değiştirmeye yarayan bir iz.
Yine Danışıklı Bir Dövüş Edası Olan Bir Koda Bir Bakış İsteği: Pek muhterem hocam, şu koda bir baksak mı? Bunu da mı algoritmadaki gibi adım adım ilerleteceğiz?
Koda Kısa Bir Bakış: Evet! Derleyici de program kodlarını tek tek işletir. En başta tanımlamaları yaptık. Esneklik olması bakımından toplanacak sayı adedini bir değişkene bağladık ve burada mesela 10 seçtik. SayıAdedi ve Toplam değişkenlerinin ilk değerlerini sıfırladık ki sayacımız bozulmasın.
Tam bu esnada algoritmamızdan hareketle fark ettik ki ileride ADIM2’nin sırasına dönüş var. Yani ilerlerde bir yerlerde buraya dönüş var. O zaman buraya bir iz bırakmalı! Bu izin adı da algoritma ile benzerlik taşıması açısından Adim2Yeri olsun.
Daha sonra, bu aşamadan ileri safhada, her döngü içinde sayı adedini 1 artırarak o döngünün zamanında kaçıncı sırada olduğumuzu fark ettik ve her döngü içinde öğrendiğimiz sayıyı yeni toplama ekledik. Burada değişkenlerin başlangıç değerlerinin neden 0 olması gerektiğini taaa 6-7 ay önce söyledik!
Alternatif Arayışları: Peki, acaba bu kadar sayıyı toplamanın başka bir yolu var mıdır? İllaki döngüyü bu şekilde mi kurmalı?
Alternatif Arayışlarına Cevap: Hayır! Biz burada ETİKET kavramını da söylemek için bu tür bir kodlama ile giriş yaptık. Aslında girilecek veriler belli ise, son değeri de girebildiğimiz FOR döngüsünü kullanabilirdik. (Tabi ki burada FOR döngüsünün grameri ile ilgili bir açıklama içinde olmayacağız)
VAR // Tanımlamalar
SayiAdedi, Sayi, Toplam,ToplanacakSayiAdedi: integer;
BEGIN
ToplanacakSayiAdedi:=10;
Toplam:=0; SayiAdedi:=0;
For SayiAdedi=1 to 10 do
BEGIN
Writeln(SayiAdedi, “ inci sayıyı giriniz:”);
Readln(Sayi);
Toplam:=Toplam+Sayi;
END;
Writeln(ToplanacakSayiAdedi, “ adet sayınızın toplamı=”, Toplam);
END.
“FOR” döngüsünde ayrı olarak SayıAdedi’ni 1 artırmaya ihtiyaç yoktur. Çünkü bu döngü kendi içinde bunu zaten yapmaktadır.
Konuya Yeni Bir Boyut Katacak Soru: Evet, geldik güzel bir soruya. Biz daha önce de görmüştük, veriler bazen belirsiz de olabiliyordu. Örneğin, bir süper marketteki kasiyer… Ürün fiyatlarını toplattırırken önceden ürünleri saymıyor, ürünler bitince bir tuşa basarak toplamayı sonlandırıyor, demiştik. Bunu kodlamada nasıl yapacağız? Hangi döngü daha elverişli? FOR mu?
Yeni Boyut: Evet, bazen veri adedi belli olmaz. Hatta biz bu konuyu Haziran ayında etraflıca işlemiştik. Şimdi de koda nasıl geçirebiliriz onu düşünelim… O tarihte algoritmada vardığımız soncu ekleyelim:
Adım 1: Toplam=0 ve SayıAdedi=1
Adım 2: SayıAdedi’nci Sayıyı öğren.
Adım 3: SayıAdedi=SayıAdedi+1
Adım 4: Toplam=Toplam+Sayı
Adım 5: Başka Sayı varsa Adım 2’ye, yoksa Adım 6’ya git.
Adım 6: Sonuç : Toplam
Acaba sence hangisi?
Doğru Cevap: Hmm.. Sanki bu algoritma, bizim etiketli kodlamaya daha çok benziyor! Çünkü tek fark ToplanacakSayıAdedi’ne göre değil başka sayı olup olmadığıan göre bir kıyas yapacağız!
Doğru Cevaba Kod Takviyesi:VAR // Tanımlamalar
SayiAdedi, Sayi, Toplam: integer;
Label Adim2Yeri
BEGIN
Toplam:=0; SayiAdedi:=0;
Adim2Yeri:
SayiAdedi:=SayiAdedi+1;
Writeln(SayiAdedi, “ inci sayıyı giriniz:”);
Readln(Sayi);
Toplam:=Toplam+Sayi;
Writeln(“Başka Sayı Varsa E yoksa H tuşuna basın”);
If (Tus=”E”) then goto Adim2Yeri;
Writeln(SayiAdedi, “kadar sayınız oldu ve toplamları=”, Toplam);
END.
Anlama Belirtisi ve Geleceğe Dair Merak: İşte bu! Başka sayı var mı diye her defasında soracağız. O yüzden döngünü içinde. Ve varsa tekrar işaretlediğimiz yere gideceğiz! Hmm.. Peki Şimdi ne olacak?
Geleceğe Dair İpucu: Sence en büyük kim ve kim kimden büyük?