1. Skip to Menu
  2. Skip to Content
  3. Skip to Footer>

Yuvalı Kontrol Yapıları

PDF Yazdır e-Posta

Written by Admin

Posted on 05 Eylül 2010

Son Güncelleme 05 Eylül 2010

YUKARIDAN AŞAĞIYA ADIMSAL İYİLEŞTİRMEYLE ALGORİTMALAR YAZMAK: DURUM3 (YUVALI KONTROL YAPILARI)

Şimdi başka bir problem üzerinde çalışalım. Algoritmamızı yine sahte kod ve yukarıdan aşağıya adımsal iyileştirmeyle oluşturacağız ve bu algoritmanın C kodunu yazacağız. Daha önceden kontrol yapılarının birbirleri üzerine (bir dizide) eklenebildiğini görmüştük. Şimdi ise C'de kontrol yapılarını, yapısal bir biçimde birleştirebilecek diğer yolu çalışacağız. Bu yola, bir kontrol yapısını diğeri içine yuvalamak denir.Aşağıdaki problemi inceleyiniz.

Bir kurs öğrencilerini bir lisans sınavına hazırlamaktadır. Geçen sene, bu kursu tamamlayan öğrencilerden bir kısmı lisans sınavına girmiştir. Kurs yöneticileri, öğrencilerin sınavdaki başarılarını öğrenmek istemektedir ve size sonuçları özetleyen bir program yazmanızı söylemişlerdir. Bu sınava giren 10 öğrencinin isimlerinin yer aldığı bir liste size verilmiştir. Bu listede eğer öğrenci sınavı geçmişse isminin yanında 1, eğer sınavdan kalmışsa isminin yanında 2 yazmaktadır.

Programınızın sınav sonuçlarını aşağıdaki şekilde analiz etmesi gerekmektedir.
Sizden;

  1. Her sınav sonucunu girmenizi ve program başka bir sınav sonucunu alacağında ekrana "Sonucu girin" mesajını yazdırmanızı
  2. Her tipte sınav sonucunun sayısını bulmanızı
  3. Kaç öğrencinin sınavı geçtiğini ve kaçının kaldığını özetleyen bir gösterge hazırlamanızı
  4. Eğer 8'den fazla öğrenci sınavı geçtiyse "yüksek başarı" mesajını yazdırmanızı istemektedirler.

Problemi dikkatlice okuduktan sonra aşağıdaki gözlemleri yaparız:

  1. Program 10 test sonucunu işleyecektir. Sayıcı kontrollü döngü kullanılacaktır.
  2. Her test sonucu 1 ya da 2 gibi bir sayıdır. Program yeni bir sonuç okuduğunda bu sonucun 1 mi yoksa 2 mi olduğuna karar vermelidir. Algoritmamızda 1 olması durumunu inceleyeceğiz. Eğer sayı 1 değilse 2 olduğunu düşüneceğiz. ( Bu ünitenin sonunda bu kabullenmeye benzer bir dizi alıştırma bulacaksınız )
  3. İki sayıcı kullanılacaktır. Bunlardan birincisi sınavı geçen öğrenci sayısını, ikincisi ise sınavdan kalan öğrenci sayısını saymak için kullanılacaktır.
  4. Program tüm sonuçları işledikten sonra, sınavı geçen öğrenci sayısının 8'den fazla olup olmadığına karar vermelidir.

Şimdi yukarıdan aşağıya adımsal iyileştirmeyi kullanalım. En başa aşağıdaki sahte kodu yazalım:

Sınav sonuçlarını incele ve yüksek başarı durumunun gerçekleşip gerçekleşmediğini belirle.

Bu kodun tüm programın bir özeti olduğunu tekrar vurgulamak istiyoruz. Ancak bu kodu C programına çevrilebilecek kadar detaylandırabilmek için birkaç iyileştirme yapmalıyız. İlk iyileştirmemiz şu şekildedir:

Değişkenleri tanımla, 10 notu gir ve kalanlarla geçenleri say,
Sınav sonuçlarının özetini yazdır ve yüksek başarı sağlandı mı karar ver.

Bu iyileştirme sonucunda da tüm programın bütünü anlatılmış olsa bile hala iyileştirmeler yapmalıyız. Geçen ve kalanları kaydetmek için sayıcılara, döngü sürecini kontrol etmek için bir başka sayıcıya ve kullanıcının gireceği veriyi tutacağımız bir değişkene ihtiyacımız vardır.Bu sebepten,

Değişkenleri tanımla

sahte kodunu

Geçenler değişkenini sıfıra ata.
Kalanlar değişkenini sıfıra ata
Öğrenci değişkenini bire ata

biçiminde iyileştirebiliriz.

On notu gir ve geçenlerle kalanları say

sahte kodu, her sınavın sonucunu başarılı bir şekilde girebileceğimiz bir döngüye ihtiyaç duymaktadır. Burada, 10 adet sınav sonucu olduğunu kesin olarak bildiğimizden sayıcı kontrollü döngü kullanabiliriz. Döngünün içinde (döngünün içine yuvalanmış), bir çiftli seçim yapısı kullanarak, sınav sonucunun geçer bir not ya da kalır bir not olduğuna karar verip uygun sayıcıları arttırırız. Sahte kodun iyileştirilmiş hali

Öğrenci sayıcısı 10'a eşit ya da 10'dan küçükken yeni sınav sonucunu al

Eğer ( if ) öğrenci geçmişse
Geçenlere bir ekle
Aksi takdirde ( else )
Kalanlara bir ekle

Öğrenci sayıcısına bir ekle

Boş satırların if/else kontrol yapısını açığa çıkartmak için konulduğuna dikkat ediniz. Böylelikle programın okunurluğu arttırılmıştır.

Sınav sonuçlarının özetini yazdır ve yüksek başarı sağlandı mı karar ver

Kodunu aşağıdaki biçimde iyileştirebiliriz:

Geçenlerin sayısını yazdır
Kalanların sayısını yazdır
Eğer(if) 8'den fazla öğrenci geçmişse
"Yüksek başarı" yazdır.

İkinci iyileştirmenin tamamı, Şekil 3.9'da gösterilmiştir. Boş satırların, while yapısını vurgulamak için bırakıldığına ve programın okunurluğunun arttırıldığına dikkat ediniz.
Bu sahte kod C'ye dönüştürülebilecek kadar iyileştirilmiştir. C programı ve bu programın iki örnek çıktısı Şekil 3.10'da gösterilmiştir. Programda, değişkenler bildirilirken aynı anda değişkenlere ilk değer atandığına dikkat ediniz. Bu, C'nin önemli özelliklerinden biridir. Bu şekildeki atamalar derleme zamanında gerçekleşir.

    Performans İpuçları3.1
    Değişkenler bildirilirken, değişkenlere ilk değer atamak programın çalışma zamanını kısaltır.

    Yazılım Mühendisliği Gözlemleri 3.6
    Bilgisayarda bir problemi çözmedeki en zor kısmın çözüm algoritması geliştirmek olduğu tecrübeyle sabittir. Doğru algoritma geliştirildikten sonra çalışan bir C programı geliştirme süreci oldukça kolaydır.

    Yazılım Mühendisliği Gözlemleri 3.7
    Çoğu programcı, programlarını sahte kod gibi program geliştirme araçları kullanmadan yazarlar ve esas hedeflerinin problemi bilgisayarda çözmek olduğunu düşünürler. Bu sebepten de sahte kod yazmanın sonuçları üretme zamanını geciktirdiğini düşünürler.

Gecenler değişkenini sıfıra ata.
Kalanlar değişkenini sıfıra ata
Öğrenci değişkenini bire ata

Öğrenci sayıcısı 10'a eşit ya da 10'dan küçükken yeni sınav sonucunu al

Eğer öğrenci geçmişse
Geçenlere bir ekle
Aksi takdirde
Kalanlara bir ekle

Öğrenci sayicisına bir ekle

Gecenlerin sayısını yazdır


Kalanların sayısını yazdır
Eğer 8'den fazla öğrenci geçmişse
"Yüksek başarı" yazdır
Şekil 3.9 Sınav sonuçları programı için sahte kod.

1 /* Şekil 3.10: fig03_10.c
2 Sınav sonuçlarının analizi */
3 #include <stdio.h>
4
5 int main( )
6 {
7 /* Bildirimde değişkenlere ilk değer vermek */
8 int gecenler = 0, kalanlar = 0, ogrenci = 1, sonuc;
9
10 /* sayıcı kontrollü döngüyle 10 sonucun işlenmesi*/
11 while ( ogrenci <= 10 ) {
12 printf ( "Sonucu girin (1 = geçti, 2=kaldı ): " );
13 scanf( "%d", &sonuc );
14
15 if ( sonuc == 1 ) /* if/else, while içinde yuvalanmıştır. */
16 gecenler = gecenler + 1;
17 else
18 kalanlar = kalanlar + 1;
19
20 ogrenci = ogrenci + 1;
21 }
22
23 printf ( "Geçenler %d\n", gecenler);
24 printf( "Kalanlar %d\n", kalanlar);
25
26 if (gecenler > 8 )
27 printf( " Yüksek başarı\n" );
28
29 return 0; /* Program başarılı bir şekilde sonlanmıştır. */
30 }


Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 2
Sonucu girin (1 = geçti, 2=kaldı ): 2
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 2
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 2
Geçenler 6
Kalanlar 4

Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 2
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Sonucu girin (1 = geçti, 2=kaldı ): 1
Geçenler 9
Kalanlar 1
Yüksek başarı


Şekil 3.10 Sınav sonuçları problemi için C programı ve bu programın iki örnek çıktısı.