3.4. Bir Örnek—Çok Uzun Tamsayı Toplama
Bu örnekte, gösterge aritmetiği ve karakter dizileri
ile ilgileneceğiz. Bu kısımda verilen örnek program, girdi olarak
ile ayrılmış iki uzun tamsayı alır ve
toplamlarını görüntüler. Bu sayıların her biri en fazla 80 rakamlı olabilir;
böylece elde edilecek toplam da en fazla 81 rakam olur. Toplam
görüntülenirken, soldaki gereksiz sıfırlar atlanır. İşte program:+
#include <stdio.h> #include <string.h> #define MAKSR 80 /* işlenenler için maks. rakam sayısı */ #define DTAN "%80[0123456789]" /* scanf için dönüşüm tanımlaması */ int main (void) { char x[MAKSR+1], y[MAKSR+1]; /* işlenenler */ if (scanf(DTAN "+" DTAN, x, y) == 2) { char t[MAKSR+2]; /* işlenenlerin toplamı */ int top; /* geçici tek rakam toplamı */ int elde = 0; /* elde biti */ int xb = strlen(x); /* ilk işlenenin boyu */ char * xg = x + xb; /* ilk işlenene gösterge */ int yb = strlen(y); /* ikinci işlenenin boyu */ char * yg = y + yb; /* ikinci işlenene gösterge */ int tb = (xb>yb ? xb : yb) + 1; /* toplamın boyu */ char * tg = t + tb; /* toplama gösterge */ char * tig = tg - 1; /* en soldaki sıfırdan farklı */ /* rakamı tutmak için t içine gösterge */ *tg = '\0'; /* toplam kar. dizisini sonlandır */ while (tg > t) { top = (xg>x ? *--xg - '0' : 0) + (yg>y ? *--yg - '0' : 0) + elde; if ((elde = top > 9)) top -= 10; *--tg = (char)(top + '0'); if (top) tig = tg; /* sıfırdan farklı rakam */ } printf("Toplam = %s\n", tig); } else { printf("Girdi hatasi!\n"); return 1; } return 0; } /* main */
Program, toplamı alınacak iki işleneni (x
ve
y
) okuyarak başlar. Normalde, bir karakter dizisinin
sonuna fazladan konan boş karakteri (\0
) de saklayabilmek
için, bu işlenenlerin her biri 81 elemanlık karakter dizisi olarak
tanımlanmıştır. Beşinci satırda tanımlanan DTAN
dönüşüm
tanımlaması, sadece rakamlardan oluşan karakter dizileri okumak için
kullanılır. Eğer girdi, m’lerin ve n’lerin
en fazla 80 adet ondalık rakam olduğu
nn…n+mm…m
biçimine uyarsa, scanf
fonsiyonu
2
değerini döndürecektir. Toplamı tutacak
t
ismindeki karakter dizisi 82 karakter boyunda tanımlanmıştır
(80, artı taşma rakamı için 1, artı sondaki boş karakter için 1).
xg
, yg
ve tg
göstergeleri
başlangıçta, sırasıyla x
, y
ve t
dizilerinin sonunu gösterirler.
while
döngüsü sağdan sola doğru rakam, rakam
toplama işlemini yapar. x
ve y
ismindeki
işlenenlerin solunda sıfır rakamlar varmış gibi davranılır; bunu
xg>x
… ve yg>y
… testleri sağlar.
Rakamların karakter olarak saklandığını anımsayın; bu yüzden toplamlarını
almadan önce sayıya çevirmemiz gerekir (Satır 25 ve 26). Bu yüzden,
her birinden '0'
karakterini çıkarırız. elde
değişkeni while
döngüsü içinde toplamda ortaya
çıkan elde bitini tutar. İki rakamın toplamından ortaya çıkan
rakam—'0'
karakteri eklenerek—karaktere
dönüştürülür ve t
dizisine yerleştirilir. tig
göstergesi t
içindeki en soldaki sıfırdan farklı rakamın
yerini tutmak için kullanılır ve sonuç bu gösterge kullanılarak
görüntülenir (Satır 33).