Prosze o pomoc w zrozumieniu części programu z książki "Ansi C"

0

Witam. W rozdziale o tablicach pojawia się program który zlicza wszystkie białe znaki, liczby oraz inne znaki. Wygląda on tak:

#include <stdio.h>

/*zliczanie cyfr, znaków białych i znaków innych*/
int main()
{
    int c, i, nwhite, nother;
    int ndigit[10];
    nwhite = nother = 0;
    for (i = 0; i < 10; ++i)
        ndigit[i] = 0;
    while ((c = getchar()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];
        else if (c == ' ' || c == '\t' || c == '\n')
            ++nwhite;
        else
            ++nother;
     printf("digits =");
     for (i = 0; i < 10; ++i)
        printf("%d",ndigit[i]);
    printf(", white space = %d, other = %d\n", nwhite, nother);
    return 0;
}

W opisie tego programu piszą, że:

W programie wykorzystujemy cechy znakowej reprezentacji cyfr. Warunek: if (c >= '0' && c <= '9') określa, czy znak przechowywany w zmiennej c jest cyfrą. Jeżeli, jest, wartość liczbowa takiej cyfry wynosi c-'0'.

I tu napotkałem problem bo nie rozumiem czemu c-'0' ma być tą liczbą. Czy ktoś z was, bardziej doświadczonych i lepiej to rozumiejących może mi to wytłumaczyć?

1

I tu napotkałem problem bo nie rozumiem czemu c-'0' ma być tą liczbą.

Zwróć uwagę na to, w jaki sposób zliczane są konkretne znaki cyferek; Poniższy warunek:

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

sprawdza, czy wczytany znak to znak cyfry, czyli o kodzie ASCII od 48 do 57; Jeśli warunek zostanie spełniony, zmienna c faktycznie zawiera liczbę z podanego przedziału; Teraz zobacz na deklarację tablicy z licznikami:

int ndigit[10];

Macierz ta zawiera dziesięć komórek na liczby - liczniki cyfr w wejściowym ciągu; W pierwszej pętli zostaje wypełniona zerami, czyli liczniki wszystkich cyferek zostają zainicjowane; Wróćmy do warunku - jeśli znak jest cyfrą, poniższa instrukcja:

++ndigit[c-'0'];

powoduje inkrementację konkretnej komórki tablicy liczników; Indeks tej komórki obliczany jest w taki sposób, że od kodu bieżącego znaku odejmowany jest kod znaku 0, czyli kod 48:

  • jeśli c zawiera znak 0 to '0'-'0', czyli 48 - 48 = 0, czyli ++ndigit[0],
  • jeśli c zawiera znak 9 to '9'-'0', czyli 57 - 48 = 9, czyli ++ndigit[9];
0

Dziękuje za pomoc. Głupio się przyznać ale myślałem, że '9' to po prostu 9 i dlatego nie rozumiałem tego wyrażenia.

0

Tu jest ta różnica - 9 to liczba, a '9' to znak cyfry o kodzie 57.

1 użytkowników online, w tym zalogowanych: 0, gości: 1