24.1 Versione modificata del programma che conta i caratteri
Il programma che conta i caratteri visto inizialmente, viene modificato per contare le occorrenze di un determinato tipo di carattere. Si vuole sapere quanti spazi, quante cifre e quanti caratteri diversi dagli spazi e dalle cifre sono contenuti in input. Per spazi si intende qualsiasi carattere di tipo spazio, newline e tabulazione. Per contare le cifre viene utilizzato un vettore. Un vettore (o array) e' un insieme contiguo di oggetti dello stesso tipo. E' un tipo di oggetto derivato, in quanto composto da piu' oggetti fondamentali (quali gli int, i char, i long e via dicendo). In particolare le stringhe vengono considerate come vettori di caratteri. In C non esiste un tipo fondamentale stringa e non esistono istruzioni di supporto alle stringhe. Quindi le stringhe sono una tipologia derivata di oggetti (i vettori di char). Una stringa e' un vettore di char terminato dal carattere '\0'. Un vettore puo' essere gestito tramite un indice. L'indice e' un valore di tipo intero che definisce la posizione dell'oggetto all'interno di una struttura di tipo vettore. Ogni posizione della struttura viene definita elemento. La prima posizione all'interno di un vettore e' individuata da un indice con valore 0. La seconda posizione e' individuata da un indice con valore 1, la terza dall'indice con valore 2 e cosi' via. Per individuare un oggetto all'interno di un vettore alla posizione i-esima, viene utilizzata l'espressione: 'vettore[i-1]' dove 'vettore' e' il nome del vettore e 'i' e la i-esima posizione. Ad esempio nell'espressione:
"ciao" e' una stringa che in realta' in memoria corrisponde alla sequenza di caratteri "ciao\0", quindi 'vett' e' un vettore lungo 5 caratteri (i 4 delimitati dai doppi apici piu' il carattere '\0'). Per individuare il carattere 'c' all'interno del vettore, occorre usare l'espressione 'vettore[0]', in quanto la prima posizione e' individuata dall'elemento con indice 0 (posizione 1 - 1 = elemento con indice 0). Per individuare il carattere 'o' occorre usare l'espressione 'vettore[3]' in quanto il valore 3 identifica il quarto elemento del vettore (posizione 4 - 1 = elemento con indice 3). Quindi occorre fare attenzione che vettore[4] non contiene il carattere 'o' ma il carattere '\0' in quanto con il valore 4 viene in realta' individuata la quinta posizione (posizione 5 - 1 = elemento con indice 4). Nel programma seguente verra' usato un vettore di 10 interi, cioe' una struttura composta da 10 interi contigui dove ogni posizione e' un contatore della cifra evidenziata dall'indice stesso (l'indice 0 conta gli zeri, l'indice 1 conta le cifre 1, l'indice 2 le cifre 2 e via dicendo):
Il primo ciclo di for inizializza a zero tutti gli elementi del vettore ndigit. Una cosa importante da sapere riguarda l'inizializzazione delle variabili numeriche. Poiche' una variabile e' situata in un punto qualsiasi della memoria RAM che non si puo' conoscere a priori, puo' darsi che tale punto sia stato precedentemente utilizzato da qualche altro programma (ad esempio un editor di testi). Quindi puo' darsi che tale spazio di memoria sia stato utilizzato da altre variabili e che possa contenere qualsiasi valore. Potrebbe contenere numeri, caratteri, spazi, qualsiasi cosa. Ora, poiche' un computer (cosi' come gli umani) e' in grado di effettuare calcoli utilizzando solo oggetti dello stesso tipo, trovandosi tra oggetti di natura eterogenea non sa come comportarsi e termina l'esecuzione del programma con un errore (nella migliore delle ipotesi). Infatti sommare '4' a '5' e' semplice, ma e' impossibile sommare '4' a ' '. E' un po' come cercare di sommare 4 ciliegie ad 1 litro di latte...quanto viene? ;o) Ecco perche' una variabile numerica deve contenere sempre numeri e se non e' mai stata usata prima deve essere inizializzata preventivamente a zero. Cio' e' quanto effettua il ciclo di for appena visto. Il ciclo di while successivo e' il cuore del programma e sfrutta una caratteristica comune dei vari set di caratteri (ASCII, EBCDIC etc): quella di codificare le cifre numeriche in modo consecutivo e senza salti. Cio' significa che in ASCII ad esempio, '0' corrisponde alla cifra decimale 48, '1' alla cifra 49, '2' alla cifra 50 e cosi' via ('9' corrisponde alla cifra decimale 57). Quindi, poiche' qualsiasi carattere corrisponde ad un numero e poiche' qualsiasi espressione quando viene valutata corrisponde ad un numero, l'espressione '[c - '0']' se valutata produce un numero. Tale numero viene calcolato sottraendo '0' (che in ASCII corrisponde a 48) alla corrispondente cifra numerica del set di caratteri ASCII del carattere contenuto nella variabile 'c'. Ad esempio, supponendo che 'c' contenga il carattere '3', l'espressione '[c - '0']' diventerebbe '['3' - '0']'. Poiche' il carattere '3' in ASCII viene codificato con il numero decimale 51, l'espressione '['3' - '0']' diventa '[51 - 48]' che guarda caso corrisponde a '[3]'. L'espressione '(c >= '0' && c <= '9')' permette l'incremento dell'elemento del vettore ndigit solo se il carattere contenuto nella variabile 'c' e' compreso tra 0 e 9, ossia e' maggiore o uguale a 0 e contemporaneamente minore o uguale a 9. Il carattere '/' ad esempio, in ASCII corrisponde al numero 47 che e' minore di 48. Analogamente il carattere ':' in ASCII corrisponde al numero 58. Sono entrambi dei caratteri non numerici che non 'entrano' nella if, cioe' rendono la condizione all'interno della if falsa e pertanto non permettono l'esecuzione dell'istruzione di incremento successiva. Inizio della guida Input ed Output Indice le funzioni Copyright (c) 2002-2003 Maurizio Silvestri |