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.