Amiga C

10. Bölüm

Cenker Özkurt

Bu ay, C dilinde program akış kontrollerini sağlayan cümleleri, blokları ve kontrol komutlarını göreceğiz.

C dilinin diğer dillerde de olduğu gibi, kendine göre bir yazılım şekli (syntax'ı) vardır. Amiga C'yi öğrenen arkadaşlara önceden şunu belirtmek isterim ki: C dilinin bu yazılım şeklini uygulamak, programın anlaşılırlığı bakımından oldukça yararlı olacaktır. Örneğin bir satırda ne kadar az komut kullanılırsa, programımızın hatalarını çözmek o kadar kolay olmaktadır.

C dilinde noktalı virgül işareti, bize bir cümlenin bitmiş olduğunu belirtmektedir. Basic dilindeki ':' gibi. İstendiğinde bir satıra birden fazla cümle yazılabilir.

x=0; 
i++; 
printf("x=%d, i=%d",x,i);
Buradaki örnekte üç cümle (ya da komut, işlem, fonksiyon... olabilir) vardır.

Küme işaretleri, { ve } C dilinin temelini oluşturmaktadır. Bilindiği gibi, C dili yapısal bir dildir.

Birden fazla komutu veya ifadeyi bu küme işaretleri içerisinde kullanarak programımızın yapısını oluştururuz. Şimdi ise programımızın akışını etkileyen kontrol komutlarına geçmek istiyorum. İlk olarak IF-ELSE ikilisini inceleyelim.

IF-ELSE

If-Else ikilisi, C dilinde karar vermek için kullanılır. Kullanım şekli ise şöyledir;

IF (ifade)
  1.Cümle 
ELSE
  2.Cümle
If komutundaki ifadeye göre 1. cümle veya 2. cümle islenmektedir. İfade doğru ise 1. cümle, yanlış ise 2. cümle aktif hale geçer. Burada Else komutunu bazı durumlarda kullanmayabiliriz. Bu durumda ifadenin yalnız doğruluğunu kontrol etmiş oluruz. Ayrıca ifadenin değerine göre sıfır yanlış, sıfırdan farklı bir sayı ise doğru anlamına gelmektedir.

Aşağıdaki yazılım şekline dikkat edin,

IF(a>b)
  z=a; 
ELSE
  z=b;
İfadenin doğruluğuna göre z, büyük sayıya eşitlenecektir.

Burada birden fazla işlem yapılabilmektedir. Bu durumda küme işareti kullanılır.

if (a>b) {
  z=a;
  printf("z=%d",z); 
  } ELSE {
  z=b;
  printf("z=%d",z); 
  }
Aşağıdaki örnekte, ikilik sisteme göre arama rutini verilmiştir (Binary Search).
binary(x,v,n) 
intx, v[], n;
{
 int low, high, mid; 
 low=0;
 high=n-1;
 while(low<=high) {
   mid=(low+high) 2;
   if(xv[mid])
     low=mid+1;
   else return(mid);
}
return(-1);
}
Buradaki rutinde x aranan sayı, v aranacağı dizi, n dizinin uzunluğunu belirtmektedir. V dizisi, sıralanmış bir dizidir.

SWITCH

Switch komutu, ifadenin değerine göre birden fazla satıra dallanabilmektedir. Aşağıdaki örneği inceleyerek bu komutun kullanım şeklini daha rahat anlayabiliriz.

 
#define EOF 
-1

 main()
 {
   int c,i,diger,digit[10];

   diger=0;
   for(i=0;i<10;i++) 
     digit[i]=0;

   while((c=getchar()) !=EOF)
     switch (c) {
     case '0': 
     case '1':
     case '2':
     case '3':
     case '4':
     case '5':
     case '6':
     case '7':
     case '8':
     case '9':
       digit[c-'0']++;
       break; 
     default:
       diger++;
       break;
     }
     for(i=0;i<10;i++)
     printf("digit %d=",digit[i]);
   printf("diger=%d",diger);
}
Yukarıdaki program, basılan nümerik sayıların ve diğer tışların adedini vermektedir. Switch kümesinin içinde ise 'case', 'default' ve 'break' komutlarının kullanımına dikkat edin. Burada switch'ten sonraki ifadeye göre 'case' satırlarına geçilir. 'case' den sonraki ifade, switch'ten sonraki ifadeye eşit ise o satır işlenir, 'break" ise bir sonraki 'case' satırına geçilmemesi için kullanılır, 'default'a ise switch'ten sonraki ifade ile 'case'lerden sonraki ifadeler, birbirlerinden farklı ise geçilir. Yani diğer bir deyişle, hiçbir 'case' satırına geçilmezse bu satır işlenmektedir.

Programımızın genel çalışma prensibi şöyledir: İlk olarak 'EOF' bir sembolik sabit olarak tanımlanmaktadır. Daha sonra bütün değişkenler sıfırlanır. c=getchar() ile klavyeden bir tuşa basılması için while döngüsü başlar. Basıldığı anda, yukarıda anlattığımız gibi switch komutu işler. Eğer RETURN tuşuna basarsak c=EOF olacağından program döngüden çıkar ve basılan nümerik sayıların sayısı ile diğer basılan tuşların sayısını yazar. Görüldüğü gibi programımız oldukça basit.

Yeni başlayan arkadaşlara, programımızı çalıştırmak için yapılması gerekenleri tekrar hatırlatmak istiyorum. İlk olarak Aztec C derleyicinizi hazırlayın. Daha sonra yukarıdaki listeyi bir editör programı ile yazarak ramdisk'e deneme.c ismi ile kaydedin. Burada örnek olarak 'deneme' ismi verilmiştir. Bu ismin yerine başka bir isim kullanabilirsiniz. Fakat sonuna '.c' uzantısını eklemeyi unutmayın. Daha sonra 'cc deneme.c' yazarak programınızı compile edin. Compile işleminin sonunda ramdisk'e 'deneme.o' adı alında yeni bir dosya açılır. Bu dosyayı da. 'ln deneme.o -lc' ile link ettikten sonra, 'deneme' yazarak programınızı çalıştırabilirsiniz.

WHILE VE FOR

Bu iki komut, program içerisinde döngü kurmak için kullanılır. While ve for C dilinin en kullanışlı komutlarmdandır. Kullanım şekilleri şöyledir:

while (ifade) 
  cümle

for(ifade1;ifade2;ifade3)
  cümle
While'dan sonraki ifade doğru ise, 'cümle' işlenmeye başlar. Burada birden fazla cümle kullanmak mümkündür. Bu cümleler bittiğinde, ifade tekrar gözden geçirilir. İfade yanlış olana kadar while döngüsü devam eder.

For komutu da üç ifade istemektedir. 1. ifade ile 3. ifade eşitleme ya da fonksiyon, 2. ifade ise parantezler içindeki ana ifadeyi belirlemektedir. Yani 2. ifade doğruluğunu korudukça, for döngüsü devam eder. Eğer 1. ifade ile 2. ifade kullanılmazsa, for döngüsü genişlemeye kapanır, fakat döngü 2. ifadenin doğruluğuna bağlı olarak devam eder. Eğer 2. ifade kullanılmazsa, for sonsuz döngüye girer.

for(;;) {
  ...
}

For ile kurulmuş bir sonsuz (infinite) döngü.

while (ifade) {
  1.cümle 
  2.cümle
  .
  .
} 

for(ifade1;ifade2;ifade3) {
  1.cümle 
  2.cümle
  .
  .
}

Yukarıda, birden fazla cümle kullanılmıştır.

main()
{
int i=0;

while(i<=100) 
  printf("i=%d",i++);
}
Görüldüğü gibi while'ın kullanımı oldukça pratik. Burada dikkat edilecek nokta, ifadeyi doğru kullanmaktır. Aksi takdirde programınız sonsuz döngüye girebilir.
 
main()
{
int i;

for(i=0;i<=100;i++) 
  printf("i=%d",i++);
Her iki örnek, i değişkeni vasıtasıyla 0'dan 100'e kadar sayar. İçiçe for döngüleri kullanırken de, küme işaretleri ile döngüleri birbirinden ayırın. Ayrıca cümleleri yazarken içinde bulunduğu döngünün bir tab tuş ilersine atarak diğer cümleleri de alt alta yazın. Bu size programın anlaşılırlığı bakımından oldukça kolaylık sağlayacaktır. Aynı zamanda bu yazım şekli C dilinin syntax'ını belirlemektedir. Bir örnekle açıklarsak;
main()
{
int k=0;
int i,j;

for(i=0;i<10;i++) { 
  for(j=0;j<10;j++) { 
    k++; 
    printf("k=%d",k);
  }
}
}
İçice kullanımda yazılım şekline dikkat edin.

DO-WHILE

Kullanımı while komutuna benzer. Program bir defalık döngüye girerek cümleyi işler ve daha sonra while'dan sonraki ifadenin doğruluğuna göre döngüye devam eder. Eğer ifade yanlışsa, sonuç olarak do'dan sonraki cümleler bir defalık bile olsa işlenmiş olur. Yazılım formatı;

do {
  1.cümle
  2.cümle 
} while (ifade);
Örnek;
main()
{
int i=0;
do printf("i=%d",i++); while(i<=100);
}

BREAK

Bazen program içerisinden ifadeye bakılmaksızın çıkmak gerekir. Bu durumda break komutu sık sık kullanılır. Break komutu for, while, do ve switch komutlarında etkilidir.

for(;;) {
  i++; 
  if(i==10) break;
for ile sonsuz bir döngü kurulmuştur. i=10 olduğunda break komutu etkisiyle döngüden çıkılır. Burada dikkat edilecek husus, break komutundan sonraki komutların tamamen küme işareti sonuna kadar gözardı edileceğidir.

CONTINUE

Break komutunun tersine, döngünün devamlılığını sağlamak için kullanılır. Fakat break komutu kadar gerekli değildir.

for(i=0;i<N;i++) { 
  if(a[i]<0) 
     continue;
  ...
continue komutu işlendiğinde, for komutunun sonuna sıçranmış olur. Bunun dışında döngü normal seyrinde devam eder.

GOTO VE LABEL

Program içerisinde herhangi bir ifadeye bağlı olmadan sıçramamızı sağlar. C dilinde diğer dillerde de olduğu gibi bir label (etiket) ismi ile kullanılır.

for(...) 
  for(...) {
    ...
    if(...)
      goto error;
  }
...

error:
  ...
Burada 'error' etiket ismidir ve goto komutunun sıçrayacağı satırı belirlemektedir. Bu etiket goto'nun altında veya üstünde olabilir.

Şimdilik bu kadar. Bu ayki konularımızı daha rahat anlayabilmeniz için oldukça basit örnekler vermeye çalıştım. Bu sayede kendi örneklerinizi geliştirmeniz daha kolay olacaktır. Gelecek ay Fonksiyonlar ve program structure'ları üzerinde duracağız. Hepinize iyi günler....