Standart C Programlama Dili


2.12. Bir Örnek—Sayı Sıralama

#include <stdio.h>
#define GOZCU 0
#define LIMIT 25

int main (void)
{
  int i, j, k;
  int sayi, gecici;
  int sayilar[LIMIT];

  /* girdi */
  i = 0;
  while (i<LIMIT) {
    scanf("%d", &sayi);
    if (sayi==GOZCU)
      break; /* girdi sonu */
    sayilar[i++] = sayi;
  }

  /* sıralama */
  i--;
  for (j=0; j<i; j++)
    for (k=j+1; k<=i; k++)
      if (sayilar[j]>sayilar[k]) {
        gecici = sayilar[k];
        sayilar[k] = sayilar[j];
        sayilar[j] = gecici;
      }

  /* çıktı */
  k=0;
  do
    printf("%d ", sayilar[k++]);
  while (k<=i);
  return 0;
} /* main */

Girilen tamsayıları artan sıraya göre sıralayan, yukarıdaki program, if, while, do, for ve break deyimlerini örneklemek için verilmiştir. En başta tanımlanmış olan iki değişmez, sırasıyla, girdi için gözcü bir değer ve içinde sayıların saklanacağı dizinin boyudur. Gözcü, girdi akışında karşımıza çıktığında, daha fazla girdi olmayacağını belirten bir değerdir. Örnekteki durumda, sıfır rastlandığında program girdi okumayı bitirecektir.

Program, sırasıyla, girdi, sıralama ve çıktı yapan üç bölümden oluşmuştur. İlk bölüm (Satır 12-18) klavyeden tamsayılar okur ve bunları sıfırıncı elemandan başlayarak sayilar adlı diziye yerleştirir. while deyimindeki (i<LIMIT) ifadesi en fazla LIMIT sayıda tamsayının okunup sayilar dizisine konulmasını temin eder. Sıralamak istediğimiz sıfırdan farklı tamsayıların sayısı LIMIT’ten azsa, girdi sonunda GOZCU değerini, yani 0, veririz. while bloğunun içindeki if deyimi, sayilar dizisine koymadan önce girilen değeri kontrol eder ve eğer sıfırla karşılaşırsa, break’le while döngüsünün dışına atlar. İlk bölümü, if ve break kullanmadan, bir while ile yazmaya çalışın.

İlk bölümün sonunda, i’de, sayilar dizisinin son dolu elemanının indisinin bir fazlası bulunur. Bundan dolayı, ikinci bölüm (Satır 21-28) i’yi bir azaltarak başlar. Arkadan gelen for deyimi, sıralamayı sağlamak için, i ile beraber j ve k adında iki sayaç kullanır. Dıştaki (yukarıdaki) for, sayilar dizisinin ilk i-1 elemanına bakar. Dıştaki for tarafından sayilar dizisinin bakılan her j’inci eleman için, içteki for, j+1’den i’ye kadar indislenmiş elemanlara bakar. Yani, if deyiminin yürütüldüğü her sefer sayilar dizisinin iki farklı elemanı, sayilar[j] ve sayilar[k], karşılaştırılır ve j<k’dır. İşimiz bittiğinde sayilar dizisinde girilmiş sayıların artan sıraya göre sıralanmasını istediğimize göre, eğer sayilar[j]>sayilar[k] ise iki elemanın değerlerini değiş tokuş ederiz. Bu işlemin yapıldığı yer Satır 25-27’dir.

Üçüncü bölüm (Satır 31-34), bir do kullanarak, (artık sıralanmış sayıları içeren) dizideki ilk i+1 elemanı basar. Eğer, en başta, ilk (ve son) değer olarak sıfır girersek, bu bölüm gereksiz ve ilgisiz bir sayı basacaktır. (Bunun nedenini söyleyebilmemiz gerekir.) Bu, en kısa ve basit gibi görünen programların bile, en beklenmeyen zamanda kendini gösteren, hatalar içerebileceğini gösterir.