Ĺ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
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ł?