S
stonecypher
Ziyaretçi
Ziyaretçi
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
, <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_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”, ¬);
while (not >= 0) {
not_top = not_top + not;
ogr_say = ogr_say + 1;
printf”Sıradaki öğrencinin notu = “); scanf(“%d”, ¬);
}
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.
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
Ö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_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”, ¬);
while (not >= 0) {
not_top = not_top + not;
ogr_say = ogr_say + 1;
printf”Sıradaki öğrencinin notu = “); scanf(“%d”, ¬);
}
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.