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:

#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).