ďťż

Ładny brzuch

#include <stdio.h> 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 == 'n' || c == 't')   ++nwhite;  else   ++nother;  printf("cyfry =");  for(i = 0; i < 10; ++i)   printf(" %d", ndigit[i]); printf(", biale znaki = %d, inne = %dn", nwhite, nother);   }
Nie orzumeim co robi jedna cześć kodu, może mi ktos wyjaśnić ?
if(c >= '0' && c <= '9')   ++ndigit[c-'0'];

I jeszcze jedno może mi ktos wyjaśnic jak dziala getchar ? Bo nie moge skapować. Mam taki programik:
#include <stdio.h> main(){ long nc; nc = 0; while(getchar() != EOF) ++nc; printf("%ldn", nc); }
Myśle że getchar dziala tak. Wpisuje jedna literke i do nc jest dodawane 1, potem natępna literka i do nc dodawane jest 1 czy dobrze mowie ?

--------------------------------------------------
Linux 2.6.9:::Slackware:::Fluxbox 0.9.10:::X.org:::
-------------------------
-------------------------
Use google, folks !



if(c >= '0' && c <= '9')   ++ndigit[c-'0'];

Ad. 1Ten kod robi tyle, sprawdza czy z jest wartością z przedziału '0' - '9'. jeśli tak, to dodaje do tablicy ndigit o indexie równym wpisanej cyfrze 1. Tak, że ndigit[0] wskazuje liczbę wystąpień '0'
Index c-'0' oznacza właśńie daną cyfre. Trzeba pamiętać, że wpisano do chara '0', co ma wartość 48 (w kodzie ascii). Z tego powodu odejmowany jest ten nadmiar 48 poprzez odjęcie '0' (czyli 48):) (wtedy dla '0' index = 0, dla '1', index = 1:) )

Ad.2 getchar() pobiera jeden znak ze stdin.
Twój programik działa tak, że do póki nie wystąpi EOF (end of file), bedzie dodawał 1 dla każdego znaku. Potem wypisuje liczbę znaków na stdout:)

Kodie

W książce, skąd pochodzi ten kod :), czyli w Kernighanie jest to napisane. Sprawdza czy wyrażenie jest cyfrą, anstępnie zwiększa o jeden zawartośdc elementu tablicy o indeksie równym tej cyfrze.
Funkcja getchar pobiera tylko z zewnątrz kolejny znak - w tej pętli, aż nie napotka końca pliku.

Wiem, że w książe było napisane co robi ten kod ale ja chiałem wiedzieć jak on to robi:).
Co do drugiego porgramu. Chodiło mi o to kiedy pętla idze dalej. Czyli tak, opdalam program, wpisuje np. a i w tedy pętla jest już wykonywana czy trzba na wcisisnąć enter ? Wydaje mi sie że pętla jest wykonywana jak wpisze a.

--------------------------------------------------
Linux 2.6.9:::Slackware:::Fluxbox 0.9.10:::X.org:::
-------------------------
-------------------------
Use google, folks !



Było też napisane jak on (kod) to robi .:):) Choć nie ukrywam na początku też tego nie mogłem pojąć.
Co do drugiego pytania - i 'a' i ENTER zostanie policzone, ponieważ program uzna ENTER jako przejscie do następnego wiersza. Spróbuj uruchomic ten program dla dowolnego pliku tekstowego (w trybie tekstowym). Policzy on m. in. każdą spacje i każde przejście do następnego wiersza.
Swoją drogą może ktoś wie jak zatrzymać taką pętle, gdy uruchomimy program w konsoli. Przecież on nie będzie wiedział kiedy otrzymuje koniec pliku (EOF).

W linuksie jest to ctrl + d, wtedy zostaje wysyłany EOF. Jak pdo win to niewiem.

--------------------------------------------------
Linux 2.6.9:::Slackware:::Fluxbox 0.9.10:::X.org:::
-------------------------
-------------------------
Use google, folks !

No właśnie - problem w tym, ze zmuszony jestem pracować pod winem. Może ktoś ma jakiś pomysł?

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •