C Döngü ve Koşul Deyimleri

S
  • Kullanıcı stonecypher
  • Başlangıç tarihi Başlangıç tarihi
  • - C / C++ / C#
Programlar (algoritmalar) üç temel blok kullanılarak gerçekleştirilebilirler. Bunlar; ardarda, bir koşula bağlı olarak ve sonlu sayıda yineleme (döngü) dir.

3.1 Koşul Deyimleri

Birkaç seçenekten birini seçmek veya bir deyimin bir koşula bağlı olarak işlemek için kulanılır.


3.1.1 if-then-else Deyimi

if (<mantıksal ifade>)
blok_doğru;
else
blok_yanlış;

Mantıksal ifade doğru ise blok_doğru, yanlış ise else sözcüğünden sonraki blok_yanlış yürütülür. else kısmı seçimlidir, gerekmiyorsa kullanılmayabilir.


Örnek 3.1. 1.1 Girilen sayının tek/çift olduğunu yazan program
#include <stdio.h>
main()
{
int i;
scanf("%d", &i);
if ( i % 2 == 1)
printf("Tek");
else
printf("Çift");
}

Bileşik (Compound) Deyimler

{ ve } karakterleri ile sınırlandırılmış bir dizi deyimden oluşur.
{
i = 5;
j = i/2;
k = i+1;
}

Eğer bloklarda birden fazla deyim kullanmak gerektiğinde bileşik deyim kullanılır.

if (yil % 4 == 0) {
subat =29;
gunyil = 366;
}
else {
subat =28;
gunyil = 365;
}
Örnek 3.1.1.2 : İkinci dereceden denklemin köklerinin bulunması.

if (delta<0)
printf("Gerçel kök yoktur.\n");
else
{
x1 = (-b + sqrt(delta)) / (2 * a);
x2 = (-b - sqrt(delta)) / (2 * a);
printf("Birinci kök = %f\n" , x1);
printf("ikinci kök = %f\n" , x2);
}


Örnek 3. 1.1.3 : Klavyeden girilen karakterin rakam olduğunun tesbiti.

char c;
c = getch();
if ((c>='0') && (c<='9')
printf("Rakam girdiniz.");


Örnek 3. 1.1.4 : Girilen üç sayıdan en küçüğünün bulunması (İçiçe IF kullanımı).

scanf("%d%d%d", &s1, &s2, &s3);
if ((s1<s2) && (s1<s3))
ek =s1;
else
if (s2<s3)
ek =s2;
else
ek = s3;
printf('En küçük olanı = %f", ek);

II. yol :
scanf("%d%d%d", &s1, &s2, &s3);
ek = s1;
if (ek>s2)
ek =s2;
if (ek>s3)
ek =s3;
printf('En küçük olanı = %f", ek);


Örnek 3. 1.1.5: Fonksiyonun girilen t değeri için aldığı değeri hesaplayıp yazan program.


main()
{
float y, x;

printf(“x değerini giriniz”);
scanf(“%f”, &x);
if (x > -1 && x<2)
y = 2/3 * (x + 1);
else
if (x>2 && x<=3)
y = 2;
else
y = 0;

printf(“Fonksiyonun değeri = &f”, y);
}






Örnek 3. 1.1.6: Vergi iadesini hesaplan programı yazınız. (elseif yapısı)
(0-60 bin : %10, 60-120 bin : %,120-200 bin : %12,>200 bin : %5)

main()
{
float fat_top, vergi_iade;
printf("Fatura toplamlarını giriniz ");
scanf("%f", &fat_top);
if (fat_top < 60000)
vergi_iade = fat_top * 0.10;
else if (fat_top < 120000)
vergi_iade = 6000 + (fat_top - 60000) * 0.20;
else if(fat_top < 200000)
vergi_iade = 18000 + (fat_top - 120000) * 0.12;
else
vergi_iade = 27600 + (fat_top - 200000) * 0.05;

printf("Ödenecek vergi iadesi = %f\n", vergi_iade);

}


Örnek 3. 1.1.7: Girilen tarihteki günün adını veren programı yazınız.

#include <studio.h>
main ( )
{
int gun, ay, yıl ;
long gt ;
printf(“Tarihi gir”) ; scanf ( “%d %d %d “,&gun)

/* oncekı yıllardakı gun sayısını hesapla */

gt=( yıl*1)*365 + yıl/4;

/* bu yildaki aylardaki gunleri ekle */

if (ay==2)
gt = gt + 31 ;
else if (ay ==3)
gt = gt + 31 + 28 ;
else if (ay ==4)
gt = gt + 31 + 28 +31;
else if (ay ==5)
gt = gt + 31 + 28 +31+ 30 ;
else if (ay ==6)
gt = gt + 31 + 28 +31+ 30 +31;
else if (ay ==7)
gt = gt + 31 + 28 +31+ 30 +31+ 30 ;
else if (ay ==8)
gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31 ;
else if (ay ==9)
gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 ;
else if (ay ==10)
gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31;
else if (ay ==11)
gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 ;
else if (ay ==12)
gt = gt + 31 + 28 +31+ 30 +31+ 30 + 31+30 + 31+ 30 +31;

/*Bu ayı ekle */
gt = gt+ gun;
if(yıl%4==0 && ay>2),
gt =gt+1;
gt=gt %7,
if(gt==1)
printf(“Pazar”);
else if(gt==2)
printf(“Pazartesi”);
else if(gt==3)
printf(“Salı”);
else if(gt==4)
printf(“Carsamba”);
else if(gt==5)
printf(“Persembe”);
else if(gt==6)
printf(“Cuma”);
else if(gt==7)
printf(“Cumartesi”);
}


3.1.2 switch Deyimi

switch(<seçici>) {
case seçenek1 : Deyim;
case seçenek2 : Deyim;
.
.
.
default : Deyim;
}

Seçicinin aldığı değere eşit seçeneğin olup olmadığına bakar. Var ise o noktadan sonraki deyimler yürütülür. switch deyiminin sonuna gelindiğinde veya break deyimi ile karşılaşıldığında yürütme işlemi durur ve programın akışı switch deyimini izleyen deyim ile devam eder.

switch(i) {
case 1 : printf("Bir");
case 2 : printf("İki");
default : printf("Hiçbiri");
}

i=1 ise çıkış BirİkiHiçbiri
i=2 ise çıkış İkiHiçbiri

Sorunu ortadan kaldırma için her durum için break deyimi eklenmeli.

. Seçici Ordinal tiplerden biri olmalıdır (Ordinal tip: tüm değerleri listelenebilinen veri tipleri - integer, char).
. Seçici ile seçenekler aynı tipte olmalıdır.
. default kısmı seçimliktir. Seçeneklerin hiçbiri uygun değil ise yürütülür.



#include <stdio.h>
main()
{
char islem;
int s1, s2, s3;
printf("Önce işlemi sonra sayıları girin ");
scanf("%c%d%d",&islem, &s1, &s2);
switch (islem) {
case '+' : s3 = s1 + s2; break;
case '-' : s3 = s1 - s2; break;
case '*' : s3 = s1 * s2; break;
case '/' : s3 = s1 / s2; break;
default : printf ("Hatalı işlem");
}
printf("\nSonuç = %d",s3);
}

Örnek 3.1.2.1: Mevsimleri yaz.

scanf("%d", &ay);
switch (ay) {
case 3:
case 4:
case 5: printf("ilkbahar"); break;
case 6:
case 7:
case 8: printf("yaz"); break;
case 9:
case 10:
case 11: printf("sonbahar"); break;
case 12:
case 1:
case 2: printf("kış"); break;
}
switch deyimi yerine if deyimi kullanılabilir. Ancak switch deyimi programı daha okunabilir kıldığı için gerekli olduğu durumlarda kullanılmalıdır.

Örnek 3.1.2.2 : 16'lık sistemdeki rakamın 10'luk sistemdeki karşılığı (char tipinin sayı gibi davranışı).
switch(c) {
case '0':
case '1':
. . .
case '9': i = c - '0'; break;
case 'a':
case 'A': i = 10; break;
. . .
case 'f':
case 'F': i = 15; break;
}


Örnek 3.1.2.3: Sınav notunu harfe dönüştüren programı yazınız.
( >=90 :AA, 85-89:BA, 80-84:BB, 75-79:CB, 70-74:CC, 60-69:D, <60 :F )

Örnek 3.1.2.4: Belirtilen tarihin hangi güne denk geldiğini bulan programı yazınız.
else if yapısı yerine switch kullanarak

3.2 Döngü Deyimleri (Yineli)

Bir ya da birden fazla deyimin tekrar edilemesini sağlarlar. C dilinde while, for ve do-while deyimleri döngü işlevini saşlar. Tekrar edilen deyimlere döngü gövdesi denir.


3.2.1 while Deyimi

while <mantıksal ifade>
Deyim

Mantıksal ifade doğru olduğu sürece Deyim yürütülür. Eğer yanlış ise kontrol bir sonraki deyime geçer.




Örnek 3.2.1.1 : 1'den 100'e kadar olan sayıların toplamı.


1. i =1
2. j = 0
3. i < 101 olduğu sürece
3.1 j = j + i
3.2 i = i + 1
4. Toplam j ‘ yi yaz
main()
{
int i, j;
i =1;
j = 0;
while (i<101) {
j =j+i;
i =i+1
}
printf("Toplam = %d",j);
}



Örnek 3.2.1.2: Toplama ve çarpma kullanarak çarpma işmeini gerçekleyiniz.

1. a ve b sayılarını oku
2. c =0
3. b>0 olduğu sürece tekrarla
.3.1. c=c + a
3.2. b = b-1
4. c değerini yaz ve dur main()
{
int a, b, c;
printf (“iki sayıyı giriniz “); scanf(“%d%d”, &a, &b);
c = 0;
while (b > 0) {
c = c + a;
b = b - 1;
}
printf(“Sonuç = &d\n”, c);
}


Örnek 3.2.1.3: Girilen sayının faktoriyelini hesaplayan programı yazınız.

1. n değerini oku
2. F=1
3. n >1 olduğu sürece tekrarla
.3.1. F=F*n
3.2. n= n-1
4. F değerini yaz
main()
{
int n;
long f;
printf (“sayıyı giriniz “); scanf(“%d”, &n);
f = 1;
while (n > 1) {
f = f * n;
n = n - 1;
}
printf(“Sonuç = &d\n”, f);
}

Örnek 3.2.1.4: Klavyeden girilen sayıları oku. Sayıların toplamı 21'den büyük veya eşit olduğu zaman dur.
main()
{
int i, j = 0;
while (j<21) {
scanf("%d",&i);
j =j+i;
}
printf("Toplam = %d",j);
}
Örnek 3.2.1.5: 1993 yılı itibarı ile ülke nüfüsu 60 milyondur. Yıllık nüfüs artış oranı %2.3 tür. Sonraki 10 yılda ülke nüfüsunu yıllara göre listeleyen program.

/* Nufus Tablosu */
#include <stdio.h>
main()
{
int i; /* sayac */
int yil; /* yillar */
float nufus; /* nufus miktari */
float artis; /* artis orani */

artis = 0.023;
yil = 1993;
nufus = 60000000;
printf("%d - %10.0f\n",yil,nufus);
i = 1;
while (i < 11)
{
nufus = nufus * (1 + artis);
printf("%d - %10.0f\n",yil + i,nufus);
i = i + 1;
}
}

Örnek 3.2.1.6 : Girilen tamsayının mükemmel sayı olup olmadığının söyleyen programı yazınız.
(mükemmel sayı = tam bölenlerin toplamı sayının kendisine eşit)

Örnek 3.2.1.7 : Girilen tamsayının kaç basamaktan oluıştuğunu söyleyen programı yazınız.

Örnek 3.2.1.8 : Girilen tamsayı içerisinde kaç tane 1 olduğunu söyleyen programı yazınız.

Örnek 3.2.1.9: Girilen tamsayının son üç basamağını yuvarlayan programı yazınız.
son üç basamağı >=500 > 1000 e, <500 ise 0 a yuvarlayacak
(2560 à 3000, 2490 à 2000 )

Örnek 3.2.1.10: Sınavın ortalamasını hesaplayan programı yazınız.
Durum : sınava giren öğrenci sayısı belli

main()
{
int i, ogr_say, not_top, not;
float ort;
not_top = 0;
i = 0;
printf(“Öğrenci sayısını giriniz “); scanf(“%d”, &ogr_say);
while (i < ogr_say) {
printf”Sıradaki öğrencinin notu = “); scanf(“%d”, &not);
not_top = not_top + not;
i = i + 1;
}
ort = float (not_top) / ogr_say;
printf(“Ortalama = &f\n”, ort);
}
Durum : sınava giren öğrenci sayısı belli değil

Bu durumda girişin bittiğini gösterir bir bilgiye (işarete) ihtiyaç vardır. Sınav notu için 0 dan küçük bir değer girildiğinde girme işleminin sona erdiğinin varsayalım.

ogr_say = 0;
printf”Sıradaki öğrencinin notu = “); scanf(“%d”, &not);
while (not >= 0) {
not_top = not_top + not;
ogr_say = ogr_say + 1;
printf”Sıradaki öğrencinin notu = “); scanf(“%d”, &not);
}


3.2.2 For Deyimi

for (ifade1 ; ifade2 ; ifade3 )
ifade;

ifade2 doğru ( veya farklı 0) olduğu sürece ifade yürütülür (bitiş koşulu).
Döngünün ilk adımından önce ifade1 yürütülür ( başlangıç adımı).
Döngünün her adımında ifade3 yürütülür (artış miktarı).

for (i = 1; i < 5; i++)
printf("%d ",i);


ifade1, ifade2 ve ifade3 seçimliktir. ifade2 belirtilmez ise herzaman
doğru olduğu ( == 1 ) kabul edilir. Yani sonsuz döngü oluşur.

for (i = 1; ; i++)
printf("%d ",i);


Örnek 3.2.2.1: 1'den 100'e kadar olan sayıların toplamı.

j =0;
for (i=1; i<=100; i=i+1)
j =j+i;
printf("Toplam %d",j);


Örnek 3.2.2.2: Girilen sayının faktöriyelini bulunuz.


fact =1;
for (j=1; j<=i; j++)
fact =fact*j;
printf("Faktöriyel =%f",fact);
}




Örnek 3.2.2.3: Çarpım tablosu. (içi içe döngüler)

main()
{
int i,j;
for (i=1; i<=10; i++) {
for (j =1; j<=10; j++)
printf("%4.0d",i*j);
printf("\n");
}
}


Örnek 3.2.2.4: ? işlevini çiziniz(0-8 noktaları arasında).


3.2.3 do-while Deyimi

Bir koşul doğru olana kadar döngü yürütülür.

do
Deyim
while (<mantıksal ifade>)

Mantıksal ifade doğru olduğu sürece döngü tekrar edilir. Yanlış olduğunda while sözcüğünden
sonraki deyim yürütülür.

5 sayısı girilene kadar oku

do
scanf("%d",&i);
while (i!=5);

i =1;
do {
printf("%d",i*i);
i =i+1;
} while (i<=10);


Örnek 3.2.3.1: Sadece +, - kullanarak * işlemini gerçekleştirme.

main()
{
int a, b;
int c;
scanf("%d%d", &a, &b);
c = 0;
do {
c = c + a;
b = b - 1;
} while (b>0);
printf("%d\n", c);
}
Karşılaştırma
while : Koşul başlangıçta test ediliyor. Döngü sıfır veya daha fazla yürütülüyor.
do-while : Koşul sonda test ediliyor. Döngüye en az bir defa kesin giriliyor.

Örnek 3.2.3.2: 0 - 100 arasında tutulan sayının tahmini.
main()
{
int tahmin; /* tahminimiz */
int min; /* Tahminin alt siniri */
int max; /* Tahminin ust siniri */
char cevap; /* Kullanicinin cevabi */
min = 0; max = 100;
do {
tahmin = (max - min) / 2 + min;
printf("Tahminim %d\n",tahmin);
printf("Buyuk / Kucuk / Esit ");
scanf("%c",&cevap);
if (cevap == 'B')
max = tahmin - 1;
else
if (cevap == 'K')
min = tahmin + 1;
} while (cevap != 'E');
}
Örnek 3.2.3.3: Sin(x) fonksiyonun belli bie x için değerini seri açılımı ile hesaplayınız. Serinin ilk 10 terimini kullanınız. n tek sayı.
main()
{
float x; /* fonksiyonun hesaplanacağı değer */
float sinx; /* sin(x) in değeri */
float xt; /* eklenen terimin payı */
float fakt; /* eklenen terimin paydası, faktoriyel */
int isaret; /* terimin +/- olmasını sağlar */
int i;
clrscr();
printf("Hesaplanacak değer : ");
scanf("%f",&x);
sinx = x;
isaret = -1;
fakt = 1;
xt = x;
for (i = 2; i<=10; i++) {
xt = xt * x * x;
fakt = fakt * (2 * i - 2) * (2 * i - 1);
sinx = sinx + isaret * xt / fakt;
isaret = -isaret;
}
printf("Değeri = %f\n",sinx);
}
Örnek 3.2.3.4 : Aynı örneği belli sayıda terim için değil, sonucu 4 basamak hassasiyetle hesaplayınız.
 
Geri