Oppure

Loading
04/09/09 11:35
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:

#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
if (c >= '0' && c <= '9')
	++ndigit[c - '0']


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

Delucidazioni?
Ultima modifica effettuata da 04/09/09 11:41
04/09/09 12:04
manvb.net
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:

#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
if (c >= '0' && c <= '9')
	++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:
it.wikipedia.org/wiki/…
aaa
04/09/09 12:07
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?
04/09/09 14:44
manvb.net
No, c non è un numero, è un carattere(char) ottenuto con getchar()! Per questo occorre trasformarlo in numero tramite c - '0'!
aaa
04/09/09 14:47
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:
04/09/09 16:27
manvb.net
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 04/09/09 16:30
aaa
04/09/09 16:33
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 04/09/09 16:40
04/09/09 16:47
manvb.net
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'
aaa