DÜNYA

Ortaokulda Sorulan Bu Kodlama Sorusunu Çözebilecek misin?

TÜBİTAK’ın 30. Bilim Olimpiyatları’nda ortaokul öğrencilerine sordurulmuş olduğu kodlama sorusu tekrardan gündem oldu. Asla kodlama bilmiyorsanız bile , çözümünü anlaşılır şekilde harf harf anlattık.

Günümüzde pek oldukça şahıs matematik ve kodlama arasındaki ilişkiyi tam olarak kabul etmese de, başlangıç seviyesinde kodlama gerçekleştirmek için de temel düzeyde matematik bilgisi gerekiyor. Bu sayede yazılan, yazdığınız yada yazacağınız kodları idrak etmek ve anlaşılabilir kılmak mümkün oluyor.

İşte bu durumun son örneği, 21 Mayıs’ta gerçekleşen 30. Bilim Olimpiyatları’nda karşımıza çıktı. TÜBİTAK tarafınca düzenlenen olimpiyatlarda ortaokullara sorulan kodlama sorusu, toplumsal medyada bugün tekrardan gündem oldu. Gelin, soruya, çözümüne ve gelen tepkilere bakalım.

İşte münakaşa yaratan o temel düzeydeki kodlama sorusu:

kod sorusu

Sayfayı derhal kaydırmayın! Ilkin birazcık anlamaya ve burada ne sorulduğunu algılamaya çalışın.

Peki bu probleminin cevabı ne?

Bu probleminin yanıtını verebilmek için aslen günümüzde artık herkeste olması ihtiyaç duyulan temel düzeyde kodlama bilgisine ihtiyacınız var. C yazılım dilinde yazılan yukarıdaki sual, bizlere aslen matematiksel bir durumu soruyor. Gelin, ilkin kodu asla kodlama bilmeyenlerin de suali anlaması için satır satır açıklayalım.

main() … ne demek?:

Tüm kodumuzu kaplayan bu yapı, aslen bizlere bu kodun bir fonksiyonu temsil ettiğini gösteriyor. Bir programın yapı taşı olan fonksiyonlar, belirli bir işi yapmak için bir araya getirilen kodlardan oluşuyor. Fonksiyonlar içinde değişkenler ve yapılacak işlemler tanımlanıyor ve bu fonksiyon çalıştırıldığında ortaya bir netice çıkıyor. Bu, aslen tüm programlarda yerleşik olan, bir programın çalıştırıldığı anda ilk kez yürüttüğü kodların bulunmuş olduğu bir fonksiyondur.

int a = 0;

Her bir fonksiyon içinde değişken tanımladığımızı söylemiştik. İşte bu kod satırı da bizlere bir değişkeni tanımlıyor. Buradaki ‘int’ ifadesi, tam sayı değerleri temsil eden veri tipini ifade ediyor. Ilk olarak değişkenimizin veri tipini kod içinde belirttikten sonrasında bu değişkenimize bir isim veriyoruz. Arkasından değişkenimizin kıymetini programa sunuyoruz, doğrusu diyoruz ki a’yı 0 al.

for (int b = 55; b > 0; a++, b = b – a);

Probleminin cevabı aslen bu satırda çıkıyor. Bu satırda ‘for(…;…;…)’ döngüsünden faydalanıyoruz. Programlamanın en temel yapı taşlarından birisi olan bu döngü yardımıyla birbirini yine eden işlemleri satır satır yazmak yerine, tek bir satır içinde yazabiliyoruz. Bu döngü olmasaydı, birbirini yine eden işlemleri binlerce satır süresince alt alta yazabilirdik. Mesela bir ekrana 1’den 1000’e kadar sayı yazdırmak isteseydik, normalde bunların her birini her satırda “1 yaz, 2 yaz, 3 yaz, 4 yaz, 5 yaz…” benzer biçimde tekrarlardık.

For döngüsü, parantezlerin içine alınan ve noktalı virgüller ile ayrılan üç değişik durum istiyor. Bunlardan ilkinde döngümüzün başlangıç kıymetini tanımlıyoruz, sonrasında döngünün devamı için ihtiyaç duyulan koşulu söylüyoruz ve son olarak her bir döngüde ne yapılacağını anlatıyoruz. Bu üç durumun yazılış sıralaması kesinlikle değişmiyor. Gelin, yukarıdaki soruda yer edinen bu üç durumu da açıklayalım.

Burada, tıpkı yukarıda yaptığımız benzer biçimde tam sayı türünde değişken belirliyoruz ve bu değişkenin adını ‘b’, kıymetini ise 55 olarak giriyoruz.

Burada da döngümüze diyoruz ki, bu döngüyü ‘b’ 0’dan büyük olduğu sürece sürdür. “İyi de azca ilkin b’ye 55 dedik, bu döngü sonsuza kadar sürmez mi?” diyor olabilirsiniz. Fakat azca sonrasında yapacağımız işlemde b’nin kıymetini her bir döngüde değiştireceğiz.

Geldik zurnanın zırt söylediği yere. Bu satır, kodlamada noktalama işaretlerinin de ne kadar mühim bulunduğunu gösteriyor. Azca ilkin for döngüsünün üç durum istediğini söylemiştik. Fakat burada aralarında virgül bulunan iki ifade görüyoruz. İşte bu virgül, aslen for döngüsünden iki işlem yapmasını istediğimizi gösteriyor. Virgül ile de üçüncü durumda belirttiğimiz, yapılmasını istediğimiz işlem sayısını artırabiliyoruz.

İlk işlemimizde (a++) programa diyoruz ki ‘a’ sayısını her döngüde 1 artır. Bu sayede ilk döngüde 0 olan ‘a’ ilkin 1, sonrasında 2, 3, 4, 5… diye değerlenecek (Binlerce satır kod yazmaktan da böylelikle kurtuluyoruz aslen). Fakat bu değerleme devam etmeden ilkin programdan bir şey daha istiyoruz: b = b – a.

Bu ifadede programdan istediğimiz şey ise her döngüyle beraber ‘b’yi al, ‘b’ sayısından ‘a’ sayısını çıkararak yeni sayıyı ‘b’ye ata. Doğrusu ‘b’ sayısının kıymetini ‘b-a’ yap. Bunu döngümüzün başladığı ana nazaran ifade ettiğimizde işlem şu şekilde olacak:

  • b = 55 (b) – 0 (a)
  • b = 55

Bu döngü, meydana getirilen işlemler sonucunda son çıkan ‘b’ değişkeni 0 olana kadar devam edecek. Her bir yeni döngüde de bundan önceki döngüde belirlenen ‘b’ değişkenini ele alacak. Doğrusu birinci döngüde b = 55 olurken, ikinci döngüde b = 54 olacak.

printf(“%d”, a)

Bu komut satırında ‘printf’ fonksiyonunu kullanarak programa, konsola bir ifade yazmasını söylüyoruz. ‘%d’ ile yazacağı bu ifadenin bir tam sayı olacağını ve  bu tam sayının da ‘a’ olacağını ifade ediyoruz. Bu komut satırı, sadece ve sadece yukarıda yer edinen döngünün sonlanmasıyla beraber, döngü sonucunda oluşan değerleri ele alarak çalışacak. Doğrusu ‘b’, 0’a ulaşmadığı sürece program hiçbir şey yazdırmayacak.

Kodu açıkladık, sıra çözümde:

Şimdi gelelim çözüme. Döngünün her bir döngüde yapacağı işlem ve neticeleri şu şekilde olacak:

  • b = 55 – 0 => b = 55, a’yı 1 artır.
  • b = 55 – 1 => b = 54, a’yı 1 artır.
  • b = 54 – 2 => b = 52, (a devamlı artıyor)
  • b = 52 – 3 => b = 49,
  • b = 49 – 4 => b = 45….

Probleminin cevabı, doğrusu döngünün vereceği son yanıt ve döngüyü durduracağı son sayı, b’nin 0’a eşitlenmesi durumunda ortaya çıkacak. Peki döngü sonunda çıkan ‘b’nin sıfırlanması için ne gerekiyor? Elbet ‘a’ sayısına eşit olması. Bu durum da sadece a 10’a ulaştığında gerçekleşiyor:

  • b = 19 – 9 => b = 10
  • b = 10 – 10 => b = 0

Döngümüz, ‘b’ 0 olduğunda dur dediğimizden dolayı artık burada sonlanıyor. Döngü sonucunda ‘b’nin yeni kıymeti 0, ‘a’nın yeni kıymeti ise 10 olarak tanımlanıyor. Program, artık bir sonraki kod satırına, doğrusu ‘printf()’ satırına geçiyor ve burada ‘a’ kıymetini bizlere yazıyor:

Doğal tüm bu işlemi yapmak için programın gittiği adımlardan gitmek gerekmiyor. İşte matematik ve anladığını aktarma becerileri de burada devreye giriyor. Bu kod, bir matematik sınavında sorulsaydı aslen şu şekilde olacaktı:

  • 1’den süregelen ardışık sayıların toplamı, son olarak hangi sayıyı toplama dahil ettiğinizde toplam 55’e ulaşıyor?

Bu probleminin matematiksel cevabı da n(n+1)/2 = 55’in çözümü olacaktı. Burada denklemi karşılayan tek kıymet de 10 idi.

Soruya gelen tepkiler de bu şekildeydi:

kod sorusu

kod sorusu

kod sorusu

  • Bir Ekşi Lügat kullanıcısı da aslen probleminin önemini oldukça iyi şekilde şu şekilde konu alıyor:

kod sorusu

kod sorusu



İlgili Makaleler

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Başa dön tuşu

Reklam Engelleyici Algılandı

Sitedeki içerikleri görüntülemek için lütfen reklam engelleyiciyi kapatın veya bu site için izin verin.