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.