C'de Akış Kontrolü ve Döngüler....

Başlatan mistrafantastic, 30 Mart 2009 - 16:09:37

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

mistrafantastic

Akış Kontrolü ve Döngüler
'WHILE' DÖNGÜSÜ

C dilinde, bircok tip dongu vardir. While dongusu, herhangi bir test, dogru kaldigi surece, bir program parcasini tekrarlar. Bu testin sonucu yalnis cikarsa, while dongusu sona erer, ve program normal akisina devam eder.
ExampleWhile.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

main() /* while dongusunun bir ornegi */
{
int count;

count = 0;
while (count<6)
{
  printf("count'un degeri: %d oldu. ",count);
  count = count + 1;
}
}


Bu programda, count isimli bir degiskeni tanimliyoruz, ve sifira esitliyoruz. while dongusunun kullanimi, gorundugu gibi, 'while' sozcugu, ve parantez icinde bir test'den olusur. Parantezlerin icindeki deyim dogru kaldigi surece, bu program tekrarlar. Bu programda, degiskenin degeri teker teker arttirildigindan, eninde sonunda degeri altiya varacaktir, ve bu durumda program donguden cikacaktir.

Parantezlerin icinde yer alan deyimleri, bundan sonraki konuda isleyecegiz. O zamana kadar, bunlarin dusundugunuz seyleri yaptigini kabul ediniz.

Birkac onemli nokta:

    * Sayet 'count' un baslangic degeri 5 den buyuk birseye atanmis olsa idi, dongunun icindekiler hic yapilmayacakti
    * Eger 'count = count + 1' komutu ile degerini bir arttirmasa idik, bu program hic durmazdi.
    * Son olarak, eger dongude tek bir komut varsa, kume isaretlerine gerek yoktur.

DO-WHILE DONGUSU

Buna benzeyen bir baska komut ise, 'do-while' komutudur. Su program, daha once gordugumuz programa cok benzer:
ExampleDoWhile.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

main() /* Do-While dongusu ornegi */
{
int i;

i=0;
do
{
  printf("I nin degeri simdi: %d oldu.\n",i);
  i = i + 1;
} while (i<5);
}


Yegane farkin, dongunun bir 'do' komutu ile yapilmasi ve denkligin kontrolunun sona birakilmasidir. Bu durumda, parantezlerin arasinda deyim dogru kaldigi surece, dongu tekrarlanir.

Burada onemli noktalar: Kontrol, dongunun sonunda yapildigindan, kume isaretlerinin arasindaki deyimler daima en az bir kere islenir. Ayrica yine, sayet i nin degeri degismez ise, program donguden cikmaz. Son olarak, sayet dongunun icinde bir tek komut varsa, kume isaretlerine gerek yoktur.

Ayrica, dilediginiz miktarda donguyu ic ice de koymaniz mümkündür.
FOR DONGUSU

For dongusu, yeni birsey degildir. Sadece, 'while' dongusunun bir baska seklidir:
ExampleFor.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

main() /* Bir for dongusu */
{
int index;
for(index=0;index<6;index = index + 1)
printf("index'in degeri simdi %d oldu.\n",index);
}


'For' dongusu, uc parcadan olusmustur. Her kesim birbirinden ; ile ayrilir. Ilk kesimi, baslangic kesimi (initalization) dir. Burada bulunan islemler, dongu baslamadan once, ve bir kere yapilir. Aslinda buraya yazilacak seyler icin bir sinir yoktur, fakat basit tutmakta fayda vardir. Bu kesime birden fazla islem yazilabilir, bunlari da birbirinden ',' virgul ile ayirmak gerekir.

Ikinci kesimde, "index<6" diyen parcada, bu dongunun her turunda kontrol edilmesi gereken deyim yer alir. Bu deyim dogru oldugu surece, dongu devam eder. Dogru * ya da yalnis sonuc veren herhangi bir deyim, bu kesimde yer alabilir.

Ucuncu kesimde yer alan islemler ise, yine dongunun her turunda yapilir, fakat isleme baslamasi, dongunun icinde yer alan komutlarin islenmesinden sonra yapilir.

'For' komutundan sonra, ya tek bir komut gelir, * ya da kume isaretleri icinde, bir komut bloku.. C de hemen heryerde, tek bir komut yerine, bir komut bloku koymaniz mumkundur.
IF KOMUTU
ExampleIf.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

/* Bu, if-else komutunun bir ornegidir */

main()
{
int data;
for (data=0;data<10;data = data + 1)
{
if (data==2)
printf("Data simdi %d ye esit.\n",data);

if (data<5)
printf("Data simdi %d. Bu da, 5 den azdir. \n",data);
else
printf("Data simdi %d. Bu da, 4 den buyuktur.\n",data);
}
}


Bu programda, ilk once, icinde iki tane if komutu olan bir for dongusu gorunuyor. Bu dongunun on kere tekrarlanacagi, acik bir sekilde goruluyor.

Ilk if satirina bakin: "if" kelimesi ile basliyor, ve sonra bir parantez icinde, sarti goruluyor. Sayet bu parantezin icindeki islemin sonucu dogru (evet) ise, if'den hemen sonra gelen satir islenir. Sayet cevap yalnis ise, if'den sonra gelen komut, atlanir. Burada da, tek bir komut, kume isaretleri ile, bir komut bloku haline getirilebilir.

Burada data==2 islemi, data degiskeninin degerinin ikiye esit olup olmadigini kontrol eder. (Sayet data = 2 olsa idi, tumuyle ayri birsey gerceklesirdi.)
IF-ELSE

Ikinci "if", yine birincisine benziyor. Fakat, ek olarak "else" isimli bir kesimi de iceriyor. Bu da, sayet parantezlerin icindeki islem dogru (EVET) sonuc verirse, "if" den sonra gelen satir islenecektir, sayet yalnis (HAYIR) sonucu verirse, "else" den sonra gelen komut islenecektir. Bu nedenle, iki satirdan biri muhakkak islenecektir.
BREAK ve CONTINUE
ExampleBreakAndContinue.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

main()
{
int xx;

for (xx=5;xx<15; xx=xx+1)
{
  if (xx==8)
  break;
  printf("Break dongusunun icinde, xx in degeri simdi %d\n",xx);
}

for (xx=5;xx<15;xx=xx+1)
{
  if (xx==8)
  continue;
  printf("Continue dongusunun icinde, xx in degeri simdi %d\n",xx);
}
}


Bu programda gordugunuz gibi, sayet xx in degeri 8 e esit ise, break isimli komutu cagiran bir if komutu goruyorsunuz. Break komutu, bizi donguden cikarip, programi dongunun hemen altindaki satirdan devam etmesini saglar.

Bu komut, ornegin dongunun icinde hesaplanan bir degere gore, donguden cikmak istediginizde cok ise yarar. Ornekte, xx in degeri sekize ulasinca, program donguden cikar, ve ekrana yazilmis en son deger, yedi olur.

Programin ikinci parcasindaki dongude ise, Continue komutunu goruyoruz. Burada ise, deger 8 e ulasinca, program donguden cikmaz, fakat program dongunun en son satirina atlayip, aradaki printf satirini islemez.
SWITCH
ExampleSwitch.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

main()
{
int kamyon;

for (kamyon = 3;kamyon<13;kamyon = kamyon + 1)
{
switch (kamyon)
{
case 3: printf("Degeri simdi uc.\n");
break;
case 4: printf("Degeri simdi dort.\n");
break;
case 5:
case 6:
case 7:
case 8: printf("Degeri simdi 5 le 8 arasinda.\n");
break;
case 11:printf("Degeri simdi onbir.\n");
break;
default:printf("Tanimsiz degerlerden biri.\n");
break;
}
}
}


Simdiye kadar gordugumuz en buyuk komut olan "switch", aslinda kullanimi kolaydir. Ilk once, "switch" kelimesi ile baslar. Bunun arkasindan, parantez icinde bir deyim gelir. Bundan sonra, dilediginiz kadar 'case' komutlari, kume isaretleri arasinda yer alir. Her degeri sembolize eden 'case' satirlari, degiskenin degeri, iki nokta ust uste, ve bununla ilgili komutlardan olusur.

Bizim ornegimizde, "kamyon" degiskeninin degeri 3 oldugunda, printf satiri, 'Degeri simdi uc' satirinin ekrana yazilmasini, saglar. Daha sonra yer alan 'break' komutu ise, switch in icinde yer alan diger komutlari islenmeden, switch den cikilmasini saglar.

Bir giris noktasi bulunduktan sonra, satirlar bir 'break' komutuna rastlayincaya kadar, * ya da switch'in son kume isaretine varincaya kadar komutlar siradan islenir.

"Kamyon" un degeri 5 e esit ise, program, case 5,6,7 den gecerek 8'de bulunan printf ve break komutlarini isler. Break komutu da, programi son kume isaretine getirir. Sayet degiskenin bir degerine karsilik gelen bir case yoksa, 'default:' isimli secenek secilir.
GOTO KOMUTU
ExampleGoto.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

main()
{
goto leave
printf("Bu satir hic yazilmayacak.\n");
leave:
}


Goto komutunu kullanmak icin, "goto" isminin yanina, atlamak istediginiz yerin sembolik ismini yazmaniz yeterlidir. "goto" ile bir dongunun icine atlamaniza izin yoktur, fakat bir dongunun disina atlayabilirsiniz. Ayrica bir fonksiyondan otekine de "goto" ile gecemezsiniz.

Bazi kimseler, goto nun hicbir yerde kullanilmamasi gerektigini belirtiyorlar. Sayet, goto kullanimi ile, diger metodlara gore daha anlasilir bir program olusacaksa, goto yu kullanmaktan cekinmeyin.
SONUNDA - ISE YARAYAN BIR PROGRAM
ExampleSantigrad.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

main() /* Santigrad'dan Fahrenheite */
{
int count; /* for degiskeni */
int fahr; /* fahrenheit degerini tutar */
int cen; /* Santigrat degerini tutar */

printf("Santigrad -> Fahrenheit karsilik tablosu\n\n");

for (count=-2;count<=12;count=count+1)
{
  cen = 10 * count;
  fahr = 32 + (cen * 9) / 5;
  printf(" C = %4d F = %4d ",cen,fahr);
  if (cen == 0)
    printf(" Suyun donma noktasi");
  if (cen == 100)
    printf(" Suyun kaynama noktasi");
    printf("\n");
}
}


Bu program, santigrad ve fahrenheit derecelerin tablosunu yaratmaktadir. Birden fazla degisken kullanilan ilk programimizdir bu. Degisken taniminda, uc ayri satir kullanilmasi sayesinde, degiskenlerin yanina ne ise yaradiklarini da yazabiliriz.
TAM SAYI ATAMA
ExampleWholeNumber.cIndir Göster Gizle Kopar Satır Gizle Satır Göster

main()
{
int a,b,c;

a = 12;
b = 3;

c = a+b;
c = a-b;
c = a*b;
c = a/b;
c = a%b;

c = 12*a+b/2-a*b*2/(a*c+b*2);

a = a + 1; /* arttirma islemleri */
b = b * 5;

a = b = c = 20; /* Coklu atamalar */
a = b = c = 12*13/4;
}


Bu programda uc tam sayi degiskeni tanimliyoruz (a,b,c), ve bunlara degerler atiyoruz. Ilk iki satirda a ve b ye sayisal degerler veriyoruz. Daha sonraki dort satirda, basit islemler goruyorsunuz.

Besinci satirda ise, modulo operatorunu goruyorsunuz. Modulo, iki degisken birbirine bolundugunde, kalan degeri verir. Modulo, sadece integer ve char degisken tipleri ile kullanilabilir.

Daha sonra gelen iki arttirma islemleri ise, bu sekilde derleyici tarafindan kabul edilir, fakat bunlari yazmanin daha kestirme bir sekli vardir - bunu daha sonra gorecegiz.

Son iki satira gelince, bunlar cok tuhaf gorunebilir goze. C derleyicisi, atama satirlarini, sagdan sola dogru okur. Bunun sayesinde, coklu atamalar gibi, cok faydali islemler yapilabilir. Bu ornekte, derleyici, yirmiyi alip, c ye atiyor. Sola dogru devam ederken, b yi gorup, en son elde edilen sonucu (20) b ye atiyor. Ayni sekilde a ya da, b nin degeri veriliyor.

Bu programi derleyip, calistirmak son derece SIKICI olabilir. Bu programin hicbir ciktisi yoktur. Dilerseniz, ogrendiginiz printf fonksiyonu ile, programin yaptiklarini daha yakindan inceleyebilirsiniz.

C de veri tanimlari, program bloku icinde, islenecek komutlardan once gelir. Sayet tanimlari programin ortasina yerlestirmeye calisirsaniz, derleyici bir hata verecektir.



kolay gelsin...


gcc sen nelere kadirsin... ;) ;) ;)
winston soft
djarum black (mobile) 

jacobs monarch nescafe 3 in 1 (mobile)  iletişim: [email]mistrafantastic@gmail.com[/email]

MTN

Neden c++ değilde c ?
C++ en son çıkan en temiz en düzenli hali değil mi ?
Ben yeniyim de ondan soruyorum bildiğimden değil yani,
Direk c++ ile başladım,
Sizin bu konudaki görüşleriniz nelerdir ?

Sypro

Kod parçalarını {code} (köşeli parantez içinde) etiketi ile verirseniz daha iyi olacaktır.
Bir de eğer yazı size ait değilse kaynak belirtmeniz gerekmekte.
Son olarak Türkçe yazıma dikkat etmenizi de istersek tam olur, okurken zorluyor.

@MTN
C yapısal bir programlama dilidir, C++ ise nesneye dayalı. En basit ifade ile böyle açıklayabiliriz. C++ , C'nin en temiz ve düzenli hali değil, sadece yapılabileceklerin sayısını genişleten bir farklı dil. Öyle olsaydı çok kesin ifade ile C, C++ ve C# 'ı kıyaslamaya giderdik. Fakat kıyaslanamayacak diller:) C++ ile ilgili bir kitap bulursan (özellikle de Herbert Schildt kitabı olursa iyi olur) zaten C ile aradaki farklara az çok değinecektir.


"Milliyetin çok belirgin vasıflarından biri dildir. Türk milletindenim diyen insan, her şeyden evvel ve mutlaka Türkçe konuşmalıdır. Türkçe konuşmayan bir insan, Türk kültürüne, topluluğuna bağlılığını iddia ederse buna inanmak doğru olmaz."

mtilhan

Alıntı yapılan: Sypro - 30 Mart 2009 - 21:19:32
Kod parçalarını {code} (köşeli parantez içinde) etiketi ile verirseniz daha iyi olacaktır.
Bir de eğer yazı size ait değilse kaynak belirtmeniz gerekmekte.
Son olarak Türkçe yazıma dikkat etmenizi de istersek tam olur, okurken zorluyor.

@MTN
C yapısal bir programlama dilidir, C++ ise nesneye dayalı. En basit ifade ile böyle açıklayabiliriz. C++ , C'nin en temiz ve düzenli hali değil, sadece yapılabileceklerin sayısını genişleten bir farklı dil. Öyle olsaydı çok kesin ifade ile C, C++ ve C# 'ı kıyaslamaya giderdik. Fakat kıyaslanamayacak diller:) C++ ile ilgili bir kitap bulursan (özellikle de Herbert Schildt kitabı olursa iyi olur) zaten C ile aradaki farklara az çok değinecektir.
Sypro C#'ın C ile bağlantısı ne ben baktım C#'a C'ye pek benzetemedim daha çok javaya benziyor?
You're beatiful but you will never be mine.
Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul.

Sypro

Evet, C# C den çok Java'ya yakın demek doğru olabilir. C -> C++ -> (C++)++ şeklinde bir şey hatırlıyorum hatta:) C++ C'ye oranla Object Oriented ise C# tamamen Object Oriented bir dil diye düşündüğümüzde zaten C'ye değil Java'ya yaklaşması çok normal karşılanır:)


"Milliyetin çok belirgin vasıflarından biri dildir. Türk milletindenim diyen insan, her şeyden evvel ve mutlaka Türkçe konuşmalıdır. Türkçe konuşmayan bir insan, Türk kültürüne, topluluğuna bağlılığını iddia ederse buna inanmak doğru olmaz."

mtilhan

Alıntı yapılan: Sypro - 31 Mart 2009 - 00:24:22
Evet, C# C den çok Java'ya yakın demek doğru olabilir. C -> C++ -> (C++)++ şeklinde bir şey hatırlıyorum hatta:) C++ C'ye oranla Object Oriented ise C# tamamen Object Oriented bir dil diye düşündüğümüzde zaten C'ye değil Java'ya yaklaşması çok normal karşılanır:)
Bir yerde(bu forumda olabilir) C#'ın Java'nın bir kapalı kaynak kodlu bir kopyası gibi tartışmalar vardı da o yüzden sordum :)
You're beatiful but you will never be mine.
Ash nazg durbatulûk, ash nazg gimbatul, ash nazg thrakatulûk agh burzum-ishi krimpatul.

mistrafantastic

Alıntı yapılan: mtilhan - 31 Mart 2009 - 07:51:47
Alıntı yapılan: Sypro - 31 Mart 2009 - 00:24:22
Evet, C# C den çok Java'ya yakın demek doğru olabilir. C -> C++ -> (C++)++ şeklinde bir şey hatırlıyorum hatta:) C++ C'ye oranla Object Oriented ise C# tamamen Object Oriented bir dil diye düşündüğümüzde zaten C'ye değil Java'ya yaklaşması çok normal karşılanır:)
Bir yerde(bu forumda olabilir) C#'ın Java'nın bir kapalı kaynak kodlu bir kopyası gibi tartışmalar vardı da o yüzden sordum :)

c# microsoft un sun a karşı bir java atağı gibi değerlendirelebilir. c# zaten evrensel değil zaten sadece windows tabanlı sistemlerde derlenebiliyor. java ise taşınabilirliği hedefliyor ve kendi sanal makinesi üzerinde çalıştığı için bunu büyük ölçüde başarıyor...
winston soft
djarum black (mobile) 

jacobs monarch nescafe 3 in 1 (mobile)  iletişim: [email]mistrafantastic@gmail.com[/email]

Sypro

Evet, C# sadece .NET ile işbirliği içinde. O yüzden Yukarıdaki tespit de gayet yerinde. Java'dan ayrıldığı nokta ise (bana göre) Java'nın platform bağımsız olmasından ötürü her açılışta onlarca modülü tekrar tekrar yüklemesindense C# 'ın .NET üzerinden hal-i hazırda yüklenmiş modülleri kullanmasından ötürü daha hızlı çalışabilmesi.

Tabi her şey tartışılabilir:)


"Milliyetin çok belirgin vasıflarından biri dildir. Türk milletindenim diyen insan, her şeyden evvel ve mutlaka Türkçe konuşmalıdır. Türkçe konuşmayan bir insan, Türk kültürüne, topluluğuna bağlılığını iddia ederse buna inanmak doğru olmaz."

mistrafantastic

c# ın .net platformu istemesi ve insanları geliştirme yapmak için buna zorlaması bana hiç iyi gelmiyor.. yarattığın dilin taşınabilirliğine microsoft bile inanmıyor bence..
winston soft
djarum black (mobile) 

jacobs monarch nescafe 3 in 1 (mobile)  iletişim: [email]mistrafantastic@gmail.com[/email]