Ortaokul Öğrencilerine Sorulan Kodlama Sorusu Gündem Oldu: Peki Siz Çözebilecek misiniz?

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

Günümüzde pek çok kişi 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 veya yazacağınız kodları anlamak 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ından düzenlenen olimpiyatlarda ortaokullara sorulan kodlama sorusu, sosyal medyada bugün yeniden gündem oldu. Gelin, soruya, çözümüne ve gelen tepkilere bakalım.

İşte tartışma yaratan o temel düzeydeki kodlama sorusu:

Sayfayı hemen kaydırmayın! Önce biraz anlamaya ve burada ne sorulduğunu algılamaya çalışın.

Peki bu sorunun cevabı ne?

Bu sorunun cevabını verebilmek için aslında günümüzde artık herkeste olması gereken temel düzeyde kodlama bilgisine ihtiyacınız var. C yazılım dilinde yazılan yukarıdaki soru, bize aslında matematiksel bir durumu soruyor. Gelin, önce kodu hiç kodlama bilmeyenlerin de soruyu anlaması için satır satır açıklayalım.

main() {…} ne demek?:

Tüm kodumuzu kaplayan bu yapı, aslında bize 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 sonuç çıkıyor. Bu, aslında tüm programlarda yerleşik olan, bir programın çalıştırıldığı anda ilk kez yürüttüğü kodların bulunduğ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 bize bir değişkeni tanımlıyor. Buradaki ‘int’ ifadesi, tam sayı değerleri temsil eden veri tipini ifade ediyor. Öncelikle değişkenimizin veri tipini kod içerisinde belirttikten sonra bu değişkenimize bir isim veriyoruz. Ardından değişkenimizin değerini programa sunuyoruz, yani diyoruz ki a’yı 0 al.

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

Sorunun cevabı aslında 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ü sayesinde birbirini tekrar eden işlemleri satır satır yazmak yerine, tek bir satır içinde yazabiliyoruz. Bu döngü olmasaydı, birbirini tekrar eden işlemleri binlerce satır boyunca alt alta yazabilirdik. Örneğin 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…” gibi tekrarlardık.

For döngüsü, parantezlerin içine alınan ve noktalı virgüller ile ayrılan üç farklı durum istiyor. Bunlardan ilkinde döngümüzün başlangıç değerini tanımlıyoruz, sonrasında döngünün devamı için gereken 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 alan bu üç durumu da açıklayalım.

  • int b = 55

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

  • b > 0

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 az önce b’ye 55 dedik, bu döngü sonsuza kadar sürmez mi?” diyor olabilirsiniz. Fakat az sonra yapacağımız işlemde b’nin değerini her bir döngüde değiştireceğiz.

  • a++, b = b - a

Geldik zurnanın zırt dediği yere. Bu satır, kodlamada noktalama işaretlerinin de ne kadar önemli olduğunu gösteriyor. Az önce 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, aslında 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’ önce 1, sonra 2, 3, 4, 5… diye değerlenecek (Binlerce satır kod yazmaktan da böylelikle kurtuluyoruz aslında). Fakat bu değerleme devam etmeden önce programdan bir şey daha istiyoruz: b = b - a.

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

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

Bu döngü, yapılan işlemler sonucunda son çıkan ‘b’ değişkeni 0 olana kadar devam edecek. Her bir yeni döngüde de bir önceki döngüde belirlenen ‘b’ değişkenini ele alacak. Yani 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ı, ancak ve ancak yukarıda yer alan döngünün sonlanmasıyla birlikte, döngü sonucunda oluşan değerleri ele alarak çalışacak. Yani ‘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 sonuçları ş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 sürekli artıyor)
  • b = 52 - 3 => b = 49,
  • b = 49 - 4 => b = 45….

Sorunun cevabı, yani döngünün vereceği son cevap 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? Elbette ‘a’ sayısına eşit olması. Bu durum da ancak 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 değeri 0, ‘a’nın yeni değeri ise 10 olarak tanımlanıyor. Program, artık bir sonraki kod satırına, yani ‘printf()’ satırına geçiyor ve burada ‘a’ değerini bizlere yazıyor:

  • Cevap: 10.

Tabii 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ı aslında şu şekilde olacaktı:

  • 1’den başlayan ardışık sayıların toplamı, en son hangi sayıyı toplama dahil ettiğinizde toplam 55’e ulaşıyor?

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

Soruya gelen tepkiler de bu şekildeydi:

  • Bir Ekşi Sözlük kullanıcısı da aslında sorunun önemini çok iyi şekilde şöyle anlatıyor: