Standart C Programlama Dili


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:

  1. #include <stdio.h>
  2. #include <string.h>
  3. 
  4. #define MAKSR 80                /* islenenler icin maks. rakam sayisi */
  5. #define DTAN  "%80[0123456789]" /* scanf icin donusum tanimlamasi */
  6. 
  7. int main (void)
  8. {
  9.   char x[MAKSR+1], y[MAKSR+1];  /* islenenler */
 10. 
 11.   if (scanf(DTAN "+" DTAN, x, y) == 2) {
 12.     char    t[MAKSR+2];         /* islenenlerin toplami */
 13.     int     top;                /* gecici tek rakam toplami */
 14.     int     elde = 0;           /* elde biti */
 15.     int     xb = strlen(x);     /* ilk islenenin boyu */
 16.     char *  xg = x + xb;        /* ilk islenene gosterge */
 17.     int     yb = strlen(y);     /* ikinci islenenin boyu */
 18.     char *  yg = y + yb;        /* ikinci islenene gosterge */
 19.     int     tb = (xb>yb ? xb : yb) + 1; /* toplamin boyu */
 20.     char *  tg = t + tb;        /* toplama gosterge */
 21.     char *  tig = tg - 1;       /* en soldaki sifirdan farkli  */
 22.                         /* rakami tutmak icin t icine gosterge */
 23.     *tg = '\0';                 /* toplam kar. dizisini sonlandir */
 24.     while (tg > t) {
 25.       top = (xg>x ? *--xg - '0' : 0) +
 26.             (yg>y ? *--yg - '0' : 0) + elde;
 27.       if ((elde = top > 9))
 28.         top -= 10;
 29.       *--tg = (char)(top + '0');
 30.       if (top)
 31.         tig = tg;               /* sifirdan farkli rakam */
 32.     }
 33.     printf("Toplam = %s\n", tig);
 34.   } else
 35.     printf("Girdi hatasi!\n");
 36.   return 0;
 37. } /* 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; sonuç bu gösterde kullanılarak görüntülenir (Satır 33).