Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Aiuto vettori
Forum - C/C++ - Aiuto vettori

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
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++

  1. #include <stdio.h>
  2.  
  3. main()
  4. {
  5.         int c, i, nwhite, nother;
  6.         int ndigit[10];
  7.  
  8.         nwhite = nother = 0;
  9.         for (i = 0; i < 10; ++i)
  10.                 ndigit[i] = 0;
  11.  
  12.         while ((c = getchar()) != EOF) {
  13.                 if (c >= '0' && c <= '9')
  14.                         ++ndigit[c - '0'];
  15.                 else if (c == ' ' || c == '\n' || c == '\t')
  16.                         ++nwhite;
  17.                 else
  18.                         ++nother;
  19.         }
  20.         printf("Cifre = ");
  21.         for (i = 0; i < 10; ++i)
  22.                 printf("%d = %d; ", i, ndigit[i]);
  23.         printf("Spazi bianchi = %d; Altri caratteri = %d\n", nwhite, nother);
  24. }



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++

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



Perchè [c - '0']? Lasciando solo [c] non funziona, ma non capisco per quale motivo :pat:

Delucidazioni?

Ultima modifica effettuata da il 04/09/2009 alle 13:41
PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 14:04
Venerdì, 04/09/2009
Testo quotato

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++

  1. #include <stdio.h>
  2.  
  3. main()
  4. {
  5.         int c, i, nwhite, nother;
  6.         int ndigit[10];
  7.  
  8.         nwhite = nother = 0;
  9.         for (i = 0; i < 10; ++i)
  10.                 ndigit[i] = 0;
  11.  
  12.         while ((c = getchar()) != EOF) {
  13.                 if (c >= '0' && c <= '9')
  14.                         ++ndigit[c - '0'];
  15.                 else if (c == ' ' || c == '\n' || c == '\t')
  16.                         ++nwhite;
  17.                 else
  18.                         ++nother;
  19.         }
  20.         printf("Cifre = ");
  21.         for (i = 0; i < 10; ++i)
  22.                 printf("%d = %d; ", i, ndigit[i]);
  23.         printf("Spazi bianchi = %d; Altri caratteri = %d\n", nwhite, nother);
  24. }



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++

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



Perchè [c - '0']? Lasciando solo [c] non funziona, ma non capisco per quale motivo :pat:

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

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:07
Venerdì, 04/09/2009
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?

PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 16:44
Venerdì, 04/09/2009
No, c non è un numero, è un carattere(char) ottenuto con getchar()! Per questo occorre trasformarlo in numero tramite c - '0'!

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:47
Venerdì, 04/09/2009
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! :k:

PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 18:27
Venerdì, 04/09/2009
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
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:33
Venerdì, 04/09/2009
Ahhh, capito! Io ero convinto che memorizzasse come ASCII solo i caratteri non numerici :)
Idea, col senno di poi, evidentemente senza senso :D:D

Questo spiega tante cose...

È esattamente la risposta che mi serviva, grazie!
Ehm... Vado un secondo :ot:, 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
PM Quote
Avatar
manvb.net (Member)
Guru


Messaggi: 663
Iscritto: 28/01/2008

Segnala al moderatore
Postato alle 18:47
Venerdì, 04/09/2009
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'

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 18:58
Venerdì, 04/09/2009
Ah :D

Impeccabile, direi! Grazie di tutto!

Ultima modifica effettuata da il 04/09/2009 alle 18:58
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo