BİL131 – DERS 5 // 02.11.2013

0 52
KONTROL İFADELERİ
C programları üç temel kontrol bileşeniyle yazılabilir:
1. Sıralama bir ifadenin diğerini izlemesi
2. Seçim en az iki alternatif arasından birini seçme
3. Öteleme kodun (programın) bir bölümün sıfır veya daha fazla kez tekrarlanması
Bazı C programlarında ifadeler program içindeki sıralarına göre işlenirler. Her bir komut yalnızca bir kez işlenir. Uyarlayıcı, noktalı virgülü programdaki bir ifadenin sonu olarak algılar. Bilgisayar, C ifadelerini arka arkaya, yazıldıkları sıraya göre çalıştırır. Herhangi bir mantıksal kontrol yapısı içermezler. Bu, sıra olarak bilinir. Sıralı yapılar şekil 3.1’deki gibi
gösterilebilir:

Şekil 3.1. Sıralı yapı
Çoğu programın belli noktalarında, mantıksal bir takım testlerin yapılması gerekir. Bu durum koşullu çalışma olarak bilinir. Çeşitli erişilebilir ifade grupları arasından birinin seçildiği özel bir koşullu çalışma şekli vardır. Bu durum bazen seçim olarak adlandırılır. 
C’de seçim yapmanın iki yolu vardır:
l. if ifadesi
2. switch ifadesi
Çoğu programda belli bir mantıksal koşul sağlanana dek belli bir komut grubunun tekrar tekrar çalıştırılması gerekir. Bu durum, döngü oluşturmaolarak bilinir. Bazen, tekrarların sayısı önceden bilinemez. Bu da döngü oluşturmanın bir başka yoludur. Döngü oluşturma üç farklı şekilde yapılabilir:
1. ‘for‘ döngüsü
2. ‘while‘ döngüsü 
3. ‘do…while‘ döngüsü
3.1 if-else İFADESİ
if – else ifadesi, mantıksal testin sonucuna bağlı olarak, iki olası durumdan birinin seçilmesi için kullanılır. İki şekildedir. En basit halinde, şu şekilde yazılabilir:
if (koşul) ifade
ifade yalnızca ve yalnızca koşul’un sıfırdan farklı bir değeri varsa işlenir (yanikoşul doğruysa). Eğer koşul’un değeri sıfırsa (yani koşul yanlışsa), ifade göz ardı edilir. Bu durumun akı şeması Şekil 3.2’de gösterilmiştir.

Şekil 3.2 If ifadesinin akı  şeması
ifade basit veya bileşik (birden fazla ifade) olabilir. Genellikle, diğer kontrol ifadelerini de içeren bir ifadeler dizisidir.
Örnek 3.1.
if (x < 0) printf(“%f”, x);
if (x>=0)
{ y=sin(5*x); printf(“%f\n”, y); }
if ((vergi > 100.) || (status == ‘R’))
printf(“%f”, vergi);
Birinci ifadede, x’in değeri sıfırdan küçükse ekranda gösterilir. İkinci ifadede, x sıfırdan farklı bir değere sahipse bileşik bir ifade işlenir. Son olarak, üçüncü ifadede, belirtilen durumlardan biri doğruysa tax’ın değeri ekrana yazılır.
if ifadesinin ikinci ve genel formu, else kelimesini de içerir.
if (koşul)1. ifade else 2. İfade
koşul doğruysa 1. ifade işlenir. Aksi takdirde (koşul yanlışsa), 2. ifade işlenir. Buradaki koşul mantıksal bir koşul, 1. ve 2. ifadeler ise basit veya bileşik ifadelerdir. if-else yapısının akı şeması Şekil 3.3’te gösterilmektedir.
Örnek 3.2.
if (status = = ‘S’) vergi = 0.20*para; else vergi = 0.14*para;
if(x>=0) y=sin(x); else y=cos(x);
if (kare)
{
scanf(“%f”, &taraf);
kare = taraf * taraf;
printf(“Karenin alanı = %f”, kare);
}
else
{
scanf(“%f %f “, &uzunluk, &en);
alan = uzunluk · en;
printf(“dikdörtgenin alanı = %f “, alan);
}
İlk örnekte, tax değeri için, status değişkenine atanan karaktere bağlı olarak, iki olasılıktan biri seçilmektedir. Bu durum aşağıdaki gibi de ifade edilebilir:
tax = (status = = ‘S’) ? (0.20*para) : (0.14 * para);
if – e1se ifadeleri iç içe de olabilirler. İç içe if-else ifadeleri çeşitli şekillerde olabilirler. Çift kademeli iç içe ifadelerin en genel formu şöyledir:
if e1 if e2 s1
else s2
else if e3 s3
else s4
Burada e1e2 ve e3 koşulları, s1s2s3 ve s4 de ifadeleri göstermektedir. Bu durumda, e1 sıfırdan farklıysa (doğruysa)bütün bir if-else ifadesi, e1 sıfırsa (yanlışsa) başka bir bütün ifelse ifadesi işletilecektir. s1, s2, s3 ve s4’ün de başka if-else ifadelerini içermeleri olasıdır.
Çift kademeli iç içe ifadelerin başka şekilleri şöyledir:
if e1 s1
else if e2 s2
if e1 s1
else if e2 s2
else s3
if e1 if e2 s1
else s2
else s3
if e1 if e2 s1
else s2
İlk üç durumda else’lerle kendilerine karşılık gelen koşullar arasındaki bağlantı açıktır. Fakat, son durumda, else ile hangi koşulun (e1 ya da e2) bağlantılı olduğu açık değildir. Cevap e2’dir. else ifadesi her zaman, başka bir else ile eşleştirilmemiş, kendisinden bir önceki if ile eşleşir. Bu durum, else’in biraz içeride yazılmasıyla anlaşılır (eşleştiği if’le aynı hizada), fakat böyle bir şey tek başına karar verme faktör değildir. Bu yüzden, son ifade şu şekilde yazılır:
if e1 {
if e2 s1 else s2 }
Örnek 3.3. İki tam sayıdan büyük olanını bulma.
#include <stdio.h>
main()
{
int x,y,max;
printf(“İki integer verin \n”);
scanf(“%d %d”,&x,&y);
max=x;
if(max<y) max=y;
printf(“%d\n”, max);
}
Örnek 3.4. Aşağıdaki örnek için bir program yazalım.

#include <stdio.h>
#include <math.h>
main()
{
float x,y;
printf(“x değerini verin \n”);
scanf(“%f ”,&x);
if(x<=0) y=5*sin(x); else y=6*log(4*x);
printf(“\n y=%f “, y);
}
Örnek 3.5. İkinci dereceden bir denklemin köklerini bulan bir program yazalım.
#include <stdio.h>
#include <math.h>
main()
{
float x1,x2,d,a,b,c;
printf(“a, b, c –nin değerlerini verin a,b,c \n”);
scanf(“%f %f %f”,&a,&b,&c);
d = pow(b,2)-4*a*c;
if(d > 0)
{
x1 = (b-sqrt(d))/(2*a);
x2 = (b-sqrt(d))/(2*a);
printf(“Kökler: %f and %f”,x1,x2);
}
else if(d=0)
{
x1 = (b-sqrt(d))/(2*a);
printf(“Bir real kök %f”,x1);
}
else printf(“Real kökler yok”);
}
3.2 while İFADESİ
while ifadesi, koşul doğruyken belli işlemlerin tekrarlanmasını sağlar. Şu şekilde yazılır:
while (koşul) ifade
ifade, koşul değeri doğru (sıfırdan farklı) olduğu sürece tekrarlanarak işlenir. Genellikle bileşik (ifadeler dizisi) olmakla birlikte, ifade basit (tekil) yapıda da olabilir. koşul değeri doğru veya yanlış olan mantıksal bir ifadedir. Döngünün duracağı noktayı belirler. While ifadesinin akı şeması Şekil 3.4’te gösterilmiştir:


Örnek 3.6. 0’dan 10’a kadar olan tam sayıları gösteren bir program yazalım.
#include <stdio.h>
main()
{
int i=0;
while (i <=10)
{
printf(“%d\n”, i);
++i;
}
}
İlk başta, i’ye 0 değeri atanır. i değeri 10’u geçene kadar, while döngüsü i’nin o anki değerini ekrana yazar, i’yi bir arttırır ve döngüyü tekrarlar. Döngü 11 kez tekrarlanır. 0’dan 10’a kadar olan sayılar, ekranda alt alta gözükür
Program aşağıdaki gibi de yazılabilir.
#include <stdio.h>
main()
{
int i=0;
while (i <= 10)
printf(“%d\n”, i++);
}
Örnek 3.7. Bir satırdaki karakterleri tek tek okuyacak ve bunları line adlı karakter tipli bir dizide saklayacak bir C programı aşağıda yazılmıştır. Sonrasında, toupper library fonksiyonu kullanılarak büyük harfe çevrilen karakterler ekrana yazılacaktır.
/* Satırdaki küçük harfleri büyük harflere çevir */
#include <stdio.h>
main()
{
char satır[80];
int tag, i = 0;
/* küçük harfleri oku*/
while ((satır[i] = getchar())!=’\n’) ++i;
tag=i;
/* büyük harfli metni bastır */
i = 0;
while (i < tag)
{
putchar(toupper(satır[i]));
++i;
}
}
i değişkenine ilk başta 0 değeri atanmıştır. İlk while döngüsü,
while ((satır[i] = getchar() !=’\n’) ++i;
aşağıdakiyle aynıdır:
satır[i] = getchar();
while (satır[i] != ‘\n’)
{
i = i + 1;
satır[i] = getchar();
}
Aşağıdaki girdi için
Ben öğrenciyim
Bilgisayar şu çıktıyı verir:
BEN ÖĞRENCIYIM
3.3 do-while İFADESİ
while ifadesi döngüye girilip girilmeyeceğini her geçişin başında, yani döngüdeki işlemleri yapmadan önce test eder. Fakat bazen, döngüye devam edip etmeme testinin her geçişin sonunda yapılması istenebilir. Bu durum “do – while” ifadesiyle sağlanabilir. Do- while ifadesinin genel yapısı şöyledir:
do ifade while (koşul);
koşulun değeri 0’dan farklı olduğu sürece ifade tekrar tekrar yapılacaktır. Döngüden birinci geçişin sonuna kadar koşul test edilmediğinden, ifade en az bir defa işlenecektir. Do-while ifadesinin akı şeması aşağıda verilmiştir:
Buradaki ifade basit veya bileşik olabilir. Döngüden çıkılabilmesi içinkoşulun değerini değiştirebilecek ifadelere sahip olmalıdır.
Pratik olarak, koşul doğru veya yanlış olan mantıksal bir koşuldur. Döngünün içindeki ifadeler mantıksal koşul doğru olduğu sürece tekrarlanacaktır.
Örnek 3.11. 0, 1, 2, . . . ,10 sayılarının ekrana sırayla yazılması işlemini while yerine dowhile ifadesi kullanarak yapınız.
/* 0’dan 10’a kadar olan sayıları bastır*/
#include <stdio.h>
main()
{
int i = 0;
do
printf(“%d\n”, i++);
while (i <= 10);
}
Önceki örnekteki gibi, i değerine ilk başta 0 atanmıştır. do – while döngüsü i’nin o anki değerini ekrana basar, i’yi bir arttırır ve i değerinin 10’u geçip geçmediğini test eder. i 10’u geçmişse döngüden çıkılır, geçmemişse i’nin yeni değeri kullanılarak döngü tekrarlanır. Döngüden her geçişin sonundatest yapıldığına dikkat ediniz. Kesin olan bir şey varsa, döngünün 11 çıktı satırı yazarak 11 kez tekrarlanacağıdır.
Örnek 3.12. Verilen sayıların ortalamasını bulma. Verilen n sayının ortalamasını hesaplayacak programı while yerine do – while döngüleri kullanarak yazalım. n tane sayının bilgisayara girilip girilmediğinin kontrolünün döngünün başında değil de sonunda yapılması dışında, mantık olarak hiçbir fark yoktur. Bu yüzden, n 0 olsa bile, program döngüye en az bir
kere girecektir. Programın değiştirilmiş şekli aşağıdaki gibidir.
/* n sayının ortalamasını hesapla */
#include <stdio.h>
main()
{
int n, i = 1;
float x, average, sum=0;
printf(“Kaç sayı? “); /* n için bir değer oku */
scanf(“%d”, &n);
do
/* sayıları al */
printf(“x = “); scanf(“%f”, &x);
sum += x; ++i;
}while (i <= n);
average = sum/n; /*ortalamayı hesaplayarak cevabı ekrana yaz*/
printf(“\n Ortalaması: %f\n”, average);
}
3.4. for İFADESİ
C’de en çok kullanılan döngü ifadelerinden biri de for ifadesidir. Bu ifade, bir değişken için başlangıç değerini belirleyen bir anlatım, döngüye girilip girilmeyeceğini belirleyen bir anlatım ve döngüden her geçişin sonunda değişkenin değerinin değiştirilmesini sağlayan bir anlatım olmak üzere, üç ayrı anlatımdan oluşur. for ifadesinin genel formu şöyledir.
for (expression 1; expression 2; expression 3) ifade
expression 1 döngü işlemini kontrol eden bir parametreye ( indeks de denir ) başlangıç değeri atamaya yarar. expression 2, döngünün tekrarlanması için gereken koşulu belirtir. Expression 3 de başta expression 1 tarafından atanmış değerin değiştirilmesini sağlar. expression 1 bir atama işlemi,expression 2 mantıksal bir koşul ve expression 3 de tekil bir ifade veya bir
atama ifadesi olarak ortaya çıkar. for ifadesinin akı şeması Şekil 3.6’da gösterilmiştir:
for ifadesi işlendiğinde, expression 2 döngüden her geçişte işlenir ve test edilirken, expression 3 her geçişin sonunda işlenir. Bu yüzden for ifadesi aşağıdakiyle aynıdır:
expression1;
while (expression2)
{
ifade
expression3;
}
expression2’nin değeri sıfır olmadıkça, yani, expression2 tarafından belirtilen mantıksal koşul doğru oldukça, döngüye girilmeye devam edilecektir.
Örnek 3.13. Sıralı Tam Sayı Değerler. for ifadesini kullanarak, 0, 1, 2,.., 10 sayılarını her biri bir satırda olacak şekilde ekranda gösteren bir program yazalım.
/* 0’dan 10’a kadar olan sayıları yaz*/
#include <stdio.h>
main()
{
int i;
for (i = 0; i <= 10; ++i)
printf(“%d \n”, i);
}
for ifadesinde, ilk anlatım i tam sayı değişkenine 0 değerini atar, ikinci anlatım i değeri 10’u geçene kadar döngünün tekrarlanacağını söyler, üçüncü anlatım i’nin değerinin döngüden her geçişte bir arttırır. Ayrıca, i değerinin döngünün başında test edildiğine dikkat ediniz.
For döngüsünde birinci ve üçüncü ifadeler, değişkene başlangıç değeri atanması ve değişkenin değerinin başka şekilde değiştirilmesi sağlanırsa, kullanılmayabilirler. Fakat, eğer ikinci anlatım yazılmazsa, break veya return ifadeleriyle durdurulmadıktan sonra,, değeri hep 1 (doğru) olarak kalacağından, döngü sonsuza kadar devam etme eğiliminde olacaktır.
Pratikte, for ifadesinin çoğu uygulamasında üç anlatım da yer alır.
Örnek 3.14. Örnek 3.13’ü for ifadesindeki üç anlatımdan ikisi yazılmadan düşünelim.
/* 0’dan 9’a kadar olan sayıları yaz*/
#include <stdio.h>
main()
{
int i = 0;
for (; i <= 9;)
printf(“%d \n”, i++);
}
Programın bu versiyonu, daha anlaşılmaz olduğundan pek tercih edilmez.
Örnek 3.15. Metnin küçük harften büyük harfe çevrilmesi. Burada yine küçük harfleri
büyük harflere çeviren bir C programı görülmektedir. Bu sefer, while ya da do-while ifadeleri
yerine for ifadesini kullanacağız.
/* Küçük harfli bir metnin bir satırını büyük harfe çevir*/
#include <stdio.h>
main()
{
char line[80];
int tag, i;
/* metni al */
for (i = 0; (line[i]= getchar())!=’\n’; ++i) ;
tag = i;
/* metni yaz */
for (i = 0; i < tag; ++i)
putchar(toupper(line[i]));
}
Bu programı örnek 6.6ve 6.9’daki programlarla karşılaştırdığımızda, bu örnekteki döngülerin çok daha kısa ve öz olduğunu görüyoruz. Bu yüzden, for ifadesi, döngü sayısının önceden bilindiği bu tip örneklerde while ve do – while ifadelerine göre daha çok tercih edilmektedir.
Örnek 3.16. Verilen sayıların ortalamasını bulma. Verilen sayıların ortalamasını hesaplayan bir önceki programı, döngüyü for ifadesiyle yapacak şekilde değiştirelim. Mantık aynı kalmakla beraber, bazı adımlar biraz farklı olacaktır.
/* n sayının ortalamasını al */
#include <stdio.h>
main()
{
int n, count;
float x, average, sum = 0;
/*sum’a ilk değeri ata ve n için bir değer oku*/
printf(“Kaç sayı? “);
scanf(“%d”, &n);
/*sayıları al */
for (count =1; count <= n; ++count)
{
printf(“x = “); scanf(“%f”, &x);
sum += x;
}
/*ortalamayı hesapla ve cevabı ekrana yaz */
average = sum/n;
printf(“\n Ortalaması %f \n”, average);
}
Bu programı daha önceki örneklerdeki programlarla karşılaştırdığımızda, for ifadesinin while
veya do – while ifadelerine göre daha kısa ve öz yazılabildiğini görüyoruz.
3.5. İÇ İÇE DÖNGÜLER
Döngüler iç içe (gömülü) olabilirler. İçerdeki ve dışarıdaki döngülerin aynı kontrol yapısıyla
oluşturulmuş olmaları gerekmez. Yalnız, döngülerden birinin diğerinin içine tamamıyla
gömülü olması gerekmektedir, üst üste binme olmamalıdır. Ayrıca, her döngü farklı bir
indeksle (değişkenle) kontrol edilmelidir.
Örnek 3.18. Dikdörtgenlerin alanlarını hesaplama. Dikdörtgenlerin kenarlarını belirten a
ve b sayıları verilmiştir. a + b < 25 iken, bütün dikdörtgenlerin alanlarını hesaplayan program
şöyledir:
/* Verilen dikdörtgenlerin alanlarını hesapla*/
#include <stdio.h>
#define N 25
main()
{
int a, b, alan;
for (a = 1; a <= N; ++a) /* iç döngü */
for (b =a+1; b <= N; ++b) /*dış döngü */
{
alan= a*b;
printf(“a=%d b=%d alan=%d \n”,a,b,alan);
}
}

Senin bu konuya yorumun ne olacak?

Gerekli *

HAKKIMIZDA

facebook twitter youtube flickr ENOTLAR TV LOGOSU_Artboard 13 - ENOTLAR TV LOGO

Arşivler

KAREKOD-umuz

Lower-Third-(Enotlar)