Program Akış Kontrol Yapıları Giriş Normal şartlar altında program içerisindeki çalıştırılabilir satırlar, yazılmış oldukları sırada, yani birinden sonra diğerinin çalışması şeklinde ilerler. Programın ya da fonksiyonun çalışma akışını kontrol eden mekanizmalara kontrol yapıları (control structure) denilir. ENF 102 Jeoloji 2/32 C dilinde sıralı (sequence), seçimli (selection), tekrarlı (repetition) olmak üzere üç çeşit kontrol yapısı mevcuttur. Şu ana kadar bir bileşik yapı (compound statement) içerisindeki yani ve işaretleri arasındaki komutların sıralı (sequence) olarak çalıştıkları görüldü. C dilinde, 1adetsıralı, 3 adet seçimli, 3 adet de tekrarlı olmak üzere 7adetakış kontrol yapısı vardır. ENF 102 Jeoloji 3/32 ENF 102 Jeoloji 4/32 if Deyimi Verilen durum ya da koşula göre istenilen işlem ya da işlemleri gerçekleştirmek için kullanılır. if deyimi değişik biçimlerde kullanılabilir. Tek alternatifli if if (koşul) komut; Bu yapıda if komutundan sonra gelen koşul ya da durum ifadesinin sonucu doğru (true) başka bir ifade ile "Evet" ise şarttan sonra gelen komut çalışır. Koşulun sonucu yanlış (false) yani "Hayır" ise if komutundan sonra gelen komutlar çalışır. ENF 102 Jeoloji 5/32 ENF 102 Jeoloji 6/32 Ç.Ü Jeoloji Böl. ENF-102 2011 1
ÖRNEK: if (a>b) printf ("a, b den büyüktür"); Şarta ya da duruma bağlı olarak çalışması gereken birden fazla komut ya da çalıştırılabilir ifade mevcutsa blok açılır. Tek alternatifli bileşik komut yapılı (compound) if if ( koşul ) komut 1; komut 2; komut N; obuyapıda if komutundan sonra gelen koşul ya da durum ifadesinin sonucu doğru (true) ise şarttan sonra gelen blok içindeki komutlar çalışır. o Koşul yanlış (false) ise if bloğundan sonra gelen komutlar çalışır. ENF 102 Jeoloji 7/32 ENF 102 Jeoloji 8/32 İki alternatifli if yapısı ÖRNEK if( koşul ) komut 1; else komut 2; Bu yapıda if komutundan sonra gelen koşul ya da durum ifadesinin sonucu doğru (true) ise şarttan sonra gelen komut çalışır. Koşul yanlış (false) ise else'den sonra gelen komut çalışır. if (a>b) printf ( a, b den büyüktür"); else printf ( a, b den küçük ya da eşittir ); ENF 102 Jeoloji 9/32 ENF 102 Jeoloji 10/32 if ( koşul ) komut 1; komut 2; komut N; else komut 1; komut 2; komut N; İki alternatifli bileşik yapılı (compound statement) if Bu yapıda if komutundan sonra gelen koşul ya da durum ifadesinin sonucu doğru (true) ise şarttan sonra gelen blok içerisindeki komutlar çalışır. ş Koşul yanlış (false) ise else'den sonra gelen blok içerisindeki komutlar çalışır. ÖRNEK: Klavyeden girilen sayının çift mi yoksa tek mi olduğunu bulan c programını yazınız. Yazacağınız program aşağıdaki örnek çalışmaya uygun olmalıdır. ÖRNEK ÇALIŞMA: Sayiyi giriniz: 20 Girilen sayi cifttir. ENF 102 Jeoloji 11/32 ENF 102 Jeoloji 12/32 Ç.Ü Jeoloji Böl. ENF-102 2011 2
Kod: /*Bu program tek çift ayırımı yapar*/ printf("sayıyı giriniz:"); scanf("%d", &a); if( a % 2 ==0 ) /*2 ye bölündüğünde kalan 0 ise çifttir*/ printf("girilen sayı çifttir"); else printf("girilen sayı tektir"); ÖRNEK : Girilen 3 sayıdan büyük olanı bulup ekrana yazan C programını yazınız. Yazacağınız program aşağıdaki örnek çalışmaya uygun olmalıdır. ÖRNEK ÇALIŞMA: Sayilari giriniz (3 adet): 20 40 10 Girilen sayıların en buyugu = 40 ENF 102 Jeoloji 13/32 ENF 102 Jeoloji 14/32 Kod: /*Bu program girilen sayılardan en büyük olanı bulur*/ int a, b, c, enb; printf("sayilari giriniz (3 adet):"); ); scanf("%d%d%d", &a, &b, &c); enb = a; if( b > enb ) enb = b; if (c > enb ) enb = c; printf("girilen sayilarin en buyugu = %d", enb); ÖRNEK : Vize ve final notları girildikten sonra aşağıdaki tabloya göre öğrencinin harf notuna karar verip gösteren C programını kodlayınız. Program çalıştığında aşağıdaki örnek çalışmaya uygun olmalıdır. Başarı ortalaması= Vize nin %40 ı +Finalin %60 ı Başarı ortalaması 50 den küçük k olanlar l için i F 50 ve 59 arası için D 60 ve 69 arası için C 70 ve 79 arası için B 80 ve yukarısı için A ENF 102 Jeoloji 15/32 ENF 102 Jeoloji 16/32 ÖRNEK ÇALIŞMA: Öğrencinin vize notu: 40 Öğrencinin final notu: 50 --------------------------------- Başarı ortalaması tl = 46 Öğrencinin harf notu = F /*Bu program vize ve final notuna göre harf notunu hesaplar*/ int vize,final; float ortalama; char harf; printf("\n\n Ogrencinin vize notu: "); scanf("%d",&vize); printf("\n\n Ogrencinin final notu: "); scanf("%d",&final); ortalama = vize*0.4+final*0.6; if(ortalama<50) harf='f'; else if (ortalama<60) harf = 'D'; else if ( ortalama<70) harf = 'C'; else if (ortalama<80) harf = 'B'; else harf='a'; printf("---------------------- ------\n"); printf("basari ortalamasi = %.2f\n",ortalama); printf( Ogrencinin harf notu = %c\n",harf); ENF 102 Jeoloji 17/32 ENF 102 Jeoloji 18/32 Ç.Ü Jeoloji Böl. ENF-102 2011 3
Önceki program içice eğer yapısı kullanılmadan ayrı ayrı if komutları kullanılarak yazılmak işlenseydi mutlaka koşullar arasında mantıksal bağlaçlar kullanılması gerekecekti. Böyle bir durumdad hem alt sınır hem de üt üst sınır kontrolü yapılması gerekirdi. Sınanan iki sınır değeri de mantıksal VE (and) operatörü olan && operatörü ile birbirine bağlanmalıydı.?: Üçlü Şart Operatörü (Ternary Conditional) Bu operatör, üç adet operand alır. C diline özgü bir operatördür. Genel kullanım biçimi aşağıdaki gibidir. ENF 102 Jeoloji 19/32 ENF 102 Jeoloji 20/32 Üçlü şart operatörü? ve : olmak üzere iki ayrı sembolden oluşur.? simgesinin önündeki ifadenin sonucuna göre operand2 ya da operand3 işlem görür. operand1 ifadesinin sonucu 0 dan farklı yani doğru (true) ise oparand2 değil ise yani sonuç yanlış (false) ise operand2 gerçekleşir. Bu operatörün önceliği mantıksal operatörlerden sonra atama operatörlerinden öncedir. Doğru ise Ortalama>=60? printf( gecti ) : printf( kaldı ); Yanlış işe ENF 102 Jeoloji 21/32 ENF 102 Jeoloji 22/32 Mantıksal işlemleri gerçekleştirirken dikkat edilmesi gereken bir başka nokta ortaya çıkan sayısal değerlerde sıfırın (0) yanlışı (false) ifade etmesidir. Sıfırdan farklı (nonzero) herhangi bir değer doğruyu (true) ifade etmektedir. /*Bu program havanın sağuk olup olmadığına karar verir*/ printf( Hava derecesini giriniz:"); scanf("%d", &a); a <= 10? printf( hava soğuk ) : printf( hava o kadar da soğuk değil ); ENF 102 Jeoloji 23/32 ENF 102 Jeoloji 24/32 Ç.Ü Jeoloji Böl. ENF-102 2011 4
ÖRNEK: : if (5 >=5 && 6) printf ( Deneme 1 ); else printf ( Deneme 2 ); : Yandaki kod çalıştırıldığında ilk yapılacak işlem 5>=5 işlemi olur. Buradan çıkan değer doğru (true) olur. Doğru VE -AND 6(sıfırdan farklı olduğu için 6 da doğru kabul edilir) işleminin sonucu yine doğrudur. Dolayısı ile ekrana Deneme 1metniyazılacaktır. ENF 102 Jeoloji 25/32 Switch Çoklu Seçim Deyimi (Multiple Selection Slatenıent) Bu deyim verilen ifadenin değerine göre verilen komut ya da komut satırlarını çalıştırır. Verilen ifadenin değerinin sıralı giden olması gerekir. Bu ifade için kullanılacak değişken tipleri int ve char olabilir. float ya da double gibi ondalıkdeğerler olamaz. ENF 102 Jeoloji 26/32 Syntax: switch (ifade) case <değer 1> : komut 1; [break;] case <değer 2> : komut 2; [break;] : case <değer n> : komut N; [break;] Bu deyim, switch yanında verilen ifadenin değeri, blok içerisinde case sözcüklerinin yanında verilen değerlerden hangisine uyuyor ise o satırdaki komut ya da komutları çalıştırır. Buradaki break deyimi i verilmez ise hangi satıra uyuyorsa o satırdaki komutlar çalıştırılır ancakblok sonuna kadar uyan durumun altındaki satırlar da çalıştırılır. ENF 102 Jeoloji 27/32 ENF 102 Jeoloji 28/32 ÖRNEK: Klavyeden girilen 1 den 5 e kadar olan tamsayıların okunuşlarını yazı ile ekrana yazan c programını kodlayınız. /*Bu program 1-5 arasındaki değerlerin sayı olarak okunuşlarını yazar*/ printf("sayıyı giriniz (1-5):"); scanf("%d",&a); switch (a) case 1:printf("bir "); case 2:printf("iki "); case 3:printf("üç "); case 4:printf("dört "); case 5:printf("beş "); default:printf("yanlış değer girdiniz"); ENF 102 Jeoloji 29/32 Program çalıştırıldığında sonuçlan aşağıdaki gibi olacaktır. ÇIKTI: Sayıyı giriniz (1-5): 3 üç dört beş yanlış değer girdiniz Klavyeden 3 girildiğinde a değişkeninin değeri 3'e eşit olduğundan ekrana üç metnini yazmıştır ancakdiğer case satırlarını da sırası ileçalıştırmıştır. l Bunu önlemek için her case satırının bitmesi gereken yerinde break deyimi kullanılmalıdır. Böylece değişkenin değerine uyan durumdaki komut çalışacak diğer satırlar çalışmayacaktır, break deyimi switch bloğunu kırarak program akışını bloğun dışından devam etmesini sağlar. ENF 102 Jeoloji 30/32 Ç.Ü Jeoloji Böl. ENF-102 2011 5
Programın doğru hali aşağıdaki gibidir. /*Bu program 1-5 arasındaki değerlerin sayı olarak okunuşlarını yazar*/ printf("sayıyı giriniz (1-5):"); scanf("%d",&a); switch (a) case 1:printf("bir ");break; case 2:printf("iki "); break; case 3:printf("üç "); break; case 4:printf("dört "); break; case 5:printf("beş "); break; default:printf("yanlış değer girdiniz"); Soru : Klavyeden girilen gün değerine göre hangi güne ait olduğunu ekrana yazan C programını kodlayınız. Günler Pazar dan başlamak üzere 1 den 7 e kadar numaralandırılacaktır. ÖRNEK ÇALIŞMA: Gün değerini giriniz (1-7): 4 ------------------------------------ Girdiğiniz değer Çarşamba ya aittir. ENF 102 Jeoloji 31/32 ENF 102 Jeoloji 32/32 Kaynakça: Programlamayı C ile öğreniyorum (2. Baskı), M. Yorulmaz, S. Yorulmaz, 2005, Ankara ENF 102 Jeoloji 33/32 Ç.Ü Jeoloji Böl. ENF-102 2011 6