Amiga Dünyası sayı 5, sayfa 40

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 40

Selam! Bu ayki yazıma, baskıdan kaynaklanan bir sorunu size aktararak başlıyorum. Baskının yapıldığı karakter setinde ters bölü işareti olmadığından, geçen sayılardaki birkaç yerde hatalar olmuştu. Dördüncü sayıdaki düzeltmelerde bunu belirtmiş ve doğrusunu yazmıştım. Fakat bu ters bölü '\' karakterinin bulunmayışı hata düzeltme satırlarında da hata yaratmış ve yazıda bazı boş karakterler ortaya çıkmış. Dolayısıyla bir yerde boşluk fark ettiyseniz, oraya ters bölü işaretinin geleceğini varsayın.

Geçen ay, bu ayki konumuzun diziler ve fonksiyonlara giriş olacağını belirtmiştim. O halde haydi dizileri incelemeye başlayalım.

DİZİLER

Basic'ten hatırlayacağınız gibi diziler, aynı türden birçok değişkeni bir tablo halinde bellekte tutmaya ve gerektiğinde, bu tablodan bazı parametreler (satır ve sütun numarası) verilerek değişkenleri kullanabilmeye yaramaktadır. Hemen hemen aynı dizi kavramı C dilinde de bulunmaktadır. Dizileri incelemek amacıyla geçen aylarda yaptığımız programların tümü gibi olan bir program yazalım. Bu program, girişindeki her rakamı, boşluk, tab, yeni satır karakterlerini ve bunların dışındaki karakterlerin sayısını saymaya yarayan bir program. Programın yazımı için lütfen birinci kutudaki adımları izleyin.

Programdaki;

int nba| I0|;

satırı, nba değişkeninin 10 elemandan oluşan veya boyutu 10 olan bir dizi olduğunu belirtir. C dilinde dizi indisleri sıfırdan başlar. Bu durum Basic ve Fortran gibi dillerin indis başlangıç değeri olan birden farklıdır. Yani nba dizisinin elemanları nba[0], nba[1], nba[2],...., nba[9] adlı elemanlardır. Zaten for döngüsünden de bu durum anlaşılabilmektedir. Çünkü for döngüsü sıfırdan ona kadar (on hariç) için çalışmaktadır.

Bir indis herhangi bir tamsayı değer olabilir. Dolayısıyla indis herhangi bir sabit sayı olabileceği gibi (nba[1]), herhangi bir tamsayı değişken de olabilir (nba[i]).

yapılır. Bu demektir ki, karakterler aritmetik işlemlerde birer tamsayıdan başka bir şey değildir. Bu oldukça doğal ve kullanışlıdır. Örneğimizdeki c-'0' aslında değeri sıfır ile dokuz arasında oynayan ve c karakterinin aldığı rakama göre değişen bir tamsayıdır. Böylece bir dizi indisinin sadece tamsayı olabileceği kuralı da sağlanmış olur. Çünkü, c-'0' değeri daha sonra nba dizisine indis olarak verilmektedir. Girişteki karakterin türü:

Program büyük ölçüde rakamların karakter olarak ifade edilmelerine bağlıdır. Örneğin:

if(c>='0'&&c<='9')

++nba[c-'0']; else if(c==' '||c=="||c=='\t')

++nb; if(c>='0'&&c<='9') satırı, girişteki karakterin rakam olup olmadığını belirler. Eğer karakterse, nümerik değer karakterin değerinden '0' karakterinin değeri çıkarılarak bulunur. Böylece dizideki gerekli indis hesaplanmış olur ve program bu indisdeki sayıyı bir artırma işlemini gerçekleştirmek için kullanır. Doğal olarak bu, ancak '0','1' v.b. karakter değerlerinin pozitif ve birbirlerini izler şekilde olmaları sayesinde gerçekleşebilir. Bu varsayımlar, hemen hemen kullanılan bütün karakter setleri için doğrudur.

else ++nd;

testinde belirlenmektedir.

Yazılış biçimi olarak:

if (koşul)

komutlar else if (koşul) komutlar else komutlar C dilinde tanım olarak, eğer karakterler ve tamsayılar arasında bir aritmetik işlem yapılıyorsa, bütün karakterler tamsayı kodlarına çevrilir ve işlem ondan sonra yapılır. Bu yazım, programlarda birkaç yönden test edilmesi gereken durumlarda oldukça sık kullanılmaktadır. Bu tür bir yazımın çalış-

--------------------------------------------- KUTU 1 --------------------------------------------------- 1> Aşağıdaki programı yazıp RAM Diske kaydedin.

/* K&R'ın kitabından alınarak Amiga ya uyarlanmıştır. V

#define EOF -1

main() {

int c,i,nb,nd; int nba[10]:

nb=nd=0; for(i=0;i<10;++i) nba[i]=0;

while((c=getchar())!=EOF)

if(c>='0'&&c<='9')

++nba[c-'0']; else if(c==* '||c==M||c==,\r)

++nb; else

++nd;

Printf(basamaklar =");

for(i=0;i<10;++i)

printf(" %d",nba[i]); printf("beyaz karakterler = %d",nb); printf(", diğerleri = %d",nd);

}

2> Şimdi programı "cc ram:program-ismi.c" ile compile edin. 3> Şimdi de "ln ram:program-ismi.o -lc" ile link edin. 4> Programı çalıştırmak için ram:program-ismi yazın. Bu durumda program sizin klavyeden girdiğiniz karakterler üzerinde işlem yapacaktır. Bu moddan çıkmak için Ctrl-\ (Control ve ters bölü tuşlarına birlikte) tuşlarına basmalısınız. Eğer programa bir text dosyasından redirection (Türkçe: yeniden yönlendirme) verirseniz program text dosyasının bitimiyle beraber size yaptığı işlemlerin sonuçlarını yazacaktır.

Klavyeyle gezinmek için ← ve → tuşları.