Yazan : Şadi Evren ŞEKER
Okan Üniversitesi Meslek Yüksek Okulunda vermekte olduğum Programming Concepts sınavı soruları ve çözümleri aşağıdaki şekildedir.
-
Write a C code to read the age of user and print it back. (10 points)
-
Write a C code, reads the ages of students in a class until -1 is inserted by user. Calculate and print the average age of the class. (20 points)
-
Print a 2D fibonacci square matrix. Read the dimension of the matrix. (30 points)
-
Print the prime numbers in ascending order. Read the number of numbers from user. (40 points)
Bilgisayarkavramlari.com sitesi, Türkçe olduğu için soruları önce Türkçe olarak açıklayıp ardından çözümlerini yapacağız.
- Soruda, kullanıcıdan yaşını okumamız ve okunan yaşı ekrana basmamız istenmiş. Bu soru basit bir okuma / yazma sorusudur.
2. Soruda, sınıfta bulunan öğrencilerin yaşlarını okuyan ve ortalamasını alan bir kod yazmamız isteniyor. Soruda, ayrıca -1 girilene kadar öğrenci okumaya devam edeceğimiz belirtiliyor.
Yukarıdaki kodda görüldüğü üzere, öncelikle girilen sayıları toplayan ve kaç sayı girildiğini tutan iki adet değişken kullanıyoruz. Bu değişkenlerin ilk değeri 0 olarak atanmıştır. Aslında soru, biriktirici tip bir döngü gerektirmektedir (accumulator style). Dolayısıyla say ve toplam değişkenleri döngünün dışında tanımlanmıştır.
Girilen yaş değerleri, yas isimli değişkende tutulmaktadır ve bu değişkenin -1 olması durumunda program ortalamayı hesaplayarak sonlanacaktır.
Kodun 8. Satırında bulunan while döngüsü, girilen bu değeri kontrol etmektedir.
Döngünün içerisinde bulunan 9. Satırda biriktirme işlemi yapılmaktadır. Burada dikkat edilecek bir husus, biriktirme işleminin, sayı okunmadan önce yapılmasıdır. Şayet sayı okunduktan sonra bu satır kullanılsaydı (örneğin 9. Satır, 12. satırdan sonraya kopyalansaydı, o zaman girilen -1 değeri de bir yaş olarak toplama dahil edilecekti.
Aynı durum ne yazık ki say değişkeni için geçerli değildir. Girilen -1 değeri, bir sayı gibi sayılmaktadır. Bunun çözümü olarak kodun 14. Satırında girilen yaşların sayısından 1 çıkarıyoruz.
Bu problemlerin farklı çözümleri de olabilir. Örneğin döngü içerisine yazılan ilave bir if kontrolü ile, girilen yaş değeri kontrol edilip -1 girildiğinde toplanmaması ve yaş olarak sayılmaması da söylenebilirdi.
3. Soruda , fibonacci serisi iki boyutlu olarak istenmiş. Bu sorunun örneğin 5 için sonucu aşağıdaki şekilde olacaktır.
1 | 1 | 2 | 3 | 5 |
1 | 2 | 3 | 5 | 8 |
2 | 3 | 5 | 8 | 13 |
3 | 5 | 8 | 13 | 21 |
5 | 8 | 13 | 21 | 34 |
Yukarıdaki tabloda görüldüğü üzere, iki boyutlu fibonacci matrisinin özelliği, sol üst köşeden başlamak üzere, sağa ve aşağı doğru izlenen bütün yollarda fibonacci serisi vermesidir.
Bu sorunun çözümünde iç içe iki döngü kullanmamız gerekiyor. Kod aşağıdaki şekilde olacaktır.
Yukarıdaki kodumuzda görüldüğü üzere, fibonacci serisini a ve b değerlerinden başlayarak hesaplayan bir iç döngü bulunmaktadır ( 13-18. Satırlar arasında). Bu döngünün daha detaylı açıklaması için fibonacci serilerini basan kodu anlattığım ilgili yazıyı okuyabilirsiniz.
Sorudaki, ikinci boyut için, her seferinde fibonacci serisinin başlangıç değerleri olan ilk iki sayıyı değiştiriyoruz. Yani, örneğin, 1,1 ile başlayan kod, fibonacci serisini veriyorsa, örneğin 5,6 ile başlayan kod aşağıdaki seriyi verecektir:
5 6 11 17 28 …
Dolayısıyla her satır için kullanılan bu kodun başlangıç değerlerini doğru bir şekilde verirsek, soruda istenen matrisi üretebiliriz.
Soruda, her satırın değeri ise yine bir fibonacci serisidir. Dikkat edilirse, matrisin ilk sütunu da bir fibonacci serisidir. Öyleyse fibonacci serisi elde etmek için kullandığımız algoritmayı, 10-18. satırlar arasında çalışan, dış döngüye de uygularsak sonucu bulabiliriz. Nitekim koddaki 20-22 satırlar arasında yapılan işlem de her satırın başlangıç değeri olan ilk iki sayıyı, yine fibonacci serisine göre hesaplamaktır.
4. Soruda, verilen bir sayı kadar asal sayıyı basmamız istenmiş. Örneğin 5 girilmesi durumunda, ilk 5 asal sayıyı basan kod isteniyor ki bu sayılar 2 3 5 7 11 şeklindedir.
Sorunun çözümü için öncelikle bir sayının asal olup olmadığını bulan kodu yazabilmemiz gerekir.
Yukarıdaki kod, sorunun çözümü değildir. Sadece n sayısının asal olup olmadığını kontrol eder. Buradaki kontrol işlemi, 2 ile sayının bir eksiğine kadar olan sayıların bir döngü ile, n sayısını, tam bölüp bölmediğini kontrol etmekten ibarettir. Şayet sayılardan bir tanesi tam bölerse, bu sayı asal değildir diyebiliriz. Şayet sayıların hiç biri bölemezse o zaman sayı asaldır. Dolayısıyla döngüden önce (6. satırda) asal =1 şeklinde bir değişken tanımlayıp sayıyı önce asal kabul edelim. Şayet sayıyı bölen 2 ile n-1 arasında tek bir sayı dahi olsa, asal değişkeninin değeri 8. satırdaki if içerisinde 0 yapılmaktadır. Sonuçta döngüden çıkıldığında asal değişkeni 1 değeriyle girip, 1 olarak çıktıysa sayıyı asal ilan edebiliriz çünkü 2 ile n-1 arasındaki hiçbir sayı tam olarak bölememiştir.
Aslında fermat teoremine göre, sayının asallığını kontrol için 2 ile n-1 arasındaki sayılar yerine 2 ile n’in karekökü arasındaki sayılara bakmak yeterlidir. Performans kaygısından dolayı bu iyileştirme koda eklenebilir.
Öte yandan sorunun çözümü için yukarıdaki koda bir ilave yapmamız gerekir. Soruda, verilen sayı kadar asal sayıyı ekrana basmamız isteniyor. Bu durumda bir sayaca ihtiyacımız var ve elbette yukarıda, hangi sayının asal olduğunu bulan kodu da değiştirmemiz ve elimizde asal sayıları veren bir formül olmadığı için ardışık sayılardan sırayla asal olanları listelememiz gerekiyor.
Yukarıdaki yeni kodda, bir önceki kodumuz, 11-19. satırlar arasında yer almaktadır. Bu kodun tek farkı, sayının asal olması durumunda sayıyı ekrana bastırması ve asal olmadığı durumda hiçbir şey yapmamasıdır.
İlave olarak her bulduğumuz asal sayı için sayaç değerini 1 arttırmakta ve sayaç değeri istenen asal sayı sayısından küçük olduğu sürece yeni asal sayılar bulmaya devam etmekteyiz.
Son değişikliğimiz ise n sayısı üzerindedir. n sayısını 2’den başlatarak her adımda 1 arttırıyoruz. Böylelikle ardışık tam sayılar, istenen sayıya ulaşılana kadar asal mı diye kontrol ediliyor ve aralarından asal olanlar bulunduğu zaman ekrana basılıyor.