()
Newbie
Messaggi:
Iscritto:
|
Ok, eccomi di nuovo
Sono alle prese con la guida di Kernighan e Ritchie "C ansi C", e ho riscontrato qualche problema sull'argomento vettori.
Il mio codice è questo:
Codice sorgente - presumibilmente C++ |
#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("Cifre = "); for (i = 0; i < 10; ++i) printf("%d = %d; ", i, ndigit[i]); printf("Spazi bianchi = %d; Altri caratteri = %d\n", nwhite, nother); }
|
E funziona perfettamente, per quello che deve fare: Contare quante volte compare ogni numero nella stringa di input, quanti caratteri bianchi (spazio, tab, newline) e quanti altri caratteri generici.
Solo che non capisco cosa significhi
Codice sorgente - presumibilmente C/C++ |
if (c >= '0' && c <= '9')
++ndigit[c - '0']
|
Perchè [c - '0']? Lasciando solo [c] non funziona, ma non capisco per quale motivo
Delucidazioni? Ultima modifica effettuata da il 04/09/2009 alle 13:41 |
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
Postato originariamente da ilmettiu:
Ok, eccomi di nuovo
Sono alle prese con la guida di Kernighan e Ritchie "C ansi C", e ho riscontrato qualche problema sull'argomento vettori.
Il mio codice è questo:
Codice sorgente - presumibilmente C++ |
#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("Cifre = "); for (i = 0; i < 10; ++i) printf("%d = %d; ", i, ndigit[i]); printf("Spazi bianchi = %d; Altri caratteri = %d\n", nwhite, nother); }
|
E funziona perfettamente, per quello che deve fare: Contare quante volte compare ogni numero nella stringa di input, quanti caratteri bianchi (spazio, tab, newline) e quanti altri caratteri generici.
Solo che non capisco cosa significhi
Codice sorgente - presumibilmente C/C++ |
if (c >= '0' && c <= '9')
++ndigit[c - '0']
|
Perchè [c - '0']? Lasciando solo [c] non funziona, ma non capisco per quale motivo
Delucidazioni? |
c - '0' ottiene il numero corrispondente al carattere contenuto in c. Questo perchè viene effettuata una sottrazione tra i codici ascii dei caratteri c e '0', dai un occhiata quì e capirai:
http://it.wikipedia.org/wiki/ASCII |
|
()
Newbie
Messaggi:
Iscritto:
|
Questo per trasformarlo in codice ASCII senza però modificarlo?
Comunque, a che scopo? c non è già di per se un numero da 0 a 9?
|
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
No, c non è un numero, è un carattere(char) ottenuto con getchar()! Per questo occorre trasformarlo in numero tramite c - '0'!
|
|
()
Newbie
Messaggi:
Iscritto:
|
Oddio! Ma io non lo avevo dichiarato come "int"?? Quindi una variabile "int" diventa "char" se ci caccio dentro qualcosa con getchar()?? Beh, detta così però non suona tanto strana... Grazie!
|
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
No, mi sono spiegato male, la variabile è int ma contiene il codice ascii di un carattere! Nel caso di '1' ad esempio c conterrà 49 e se gli sottraggo '0'(cioè 48) 49 - 48 = 1 e ottengo quindi il valore corretto(non l'ascii), capito?
Ricorda che in C i char sono semplicemente int a 8 bit(1 byte) contenenti un ascii(che il programmatore interpreta come un carattere)!
Ultima modifica effettuata da manvb.net il 04/09/2009 alle 18:30 |
|
()
Newbie
Messaggi:
Iscritto:
|
Ahhh, capito! Io ero convinto che memorizzasse come ASCII solo i caratteri non numerici
Idea, col senno di poi, evidentemente senza senso
Questo spiega tante cose...
È esattamente la risposta che mi serviva, grazie!
Ehm... Vado un secondo , ma proprio solo per una domandina: In C esiste una funzione tipo Chr$() di VB?
Forte davvero "C ansi C"... Come esercizio c'è "Stampa ogni parola della stringa in Input su una riga differente", ma naturalmente è prima di insegnarti come gestire una variabile che possa contenere una parola intera...
Ultima modifica effettuata da il 04/09/2009 alle 18:40 |
|
manvb.net (Member)
Guru
Messaggi: 663
Iscritto: 28/01/2008
|
In C non esiste la funzione Chr come in VB perchè in C non c'è bisogno di conversioni particolari per passare da carattere a ascii, ti basta assegnare il numero alla variabile char:
char a;
a = 48; // a vale '0'
anche se sarebbe meglio utilizzare la conversione esplicita:
char a;
a = (char)48; // a vale '0'
|
|
()
Newbie
Messaggi:
Iscritto:
|
Ah
Impeccabile, direi! Grazie di tutto!
Ultima modifica effettuata da il 04/09/2009 alle 18:58 |
|