Quello dei contalettere in C è un tipico esercizio per le superiori o per l’università. A prima vista sembra molto complesso, ma in realtà il C offre una caratteristica molto semplice in ciò: Le lettere sono numeri, e sono pure sequenziali. Quindi, una volta noto come scorrere un Array, e in C le stringhe lo sono, è semplice produrre software del genere. Vediamolo insieme.
In generale
Bisogna ricordarsi che in C le stringhe sono degli array qualunque, potete dunque scorrerli con un semplice ciclo while o for e da li potete dunque usare l’indice per ottenere il carattere in questione ed elaborarlo.
Contamaiuscole
Il contamaiuscole (o minuscole) è l’esercizio più semplice e quello solitamente proposto all’inizio. Ricordando che le lettere sono sequenziali basta avere una struttura if che controlla gli intervalli in questione. Cioè, voi potete fisicamente dire al computer if (lettera < “Z” && lettera > “A”) e fargli così aumentare il contatore. Idem vale per le minuscole, basta usare gli intervalli giusti.
Contavocali
A seconda che sia un contatore generale, particolare o che distingua anche tra maiuscole e minuscole servono semplicemente dall’una alle dieci variabili. In questi casi vanno bene un tanto al kg di if: Se la lettera è una vocale somma al contatore, se invece serve la distinzione si fa un if su ogni singolo caso da analizzare.
Contatore preciso
Si potrebbe, per un contatore di occorrenze di ogni lettera, fare molto semplicemente una variabile per lettera. Bellissimo, no?
No. Una volta provai a dare l’esame di programmazione prima di aver finito il programma, per sport, e feci proprio così. Inutile dire che venni bocciato. In tal caso si fa un array di dimensioni alfabetiche, solitamente uno per le maiuscole e uno per le minuscole (purtroppo in ASCII ci sono delle parentesi tra i due intervalli…) e si fa il test per poi sommare uno in posizione del carattere iniziale sottratto al carattere usato. Difficile, vediamo il codice semplice e commentato:
#include
#include
char stringa[] = "Io amo Computer Blog!"; //stringa da analizzare
int min[26];
int mai[26];
int main() {
int intervallo = strlen(stringa); // lunghezza della stringa
int i = 0; //indice
while (i < intervallo) { if (stringa[i] >= 'a' && stringa[i] <= 'z') { //controlla che il carattere sia minuscolo int worknum = stringa[i] - 'a'; //ottiene l'ordine alfabetico del carattere min[worknum] = min[worknum]+1; //aggiunta all'indice } if (stringa[i] >= 'A' && stringa[i] <= 'Z') { //controlla che il carattere sia maiuscolo
int worknum = stringa[i] - 'A'; //ottiene l'ordine alfabetico del carattere
mai[worknum] = mai[worknum]+1; //aggiunta all'indice
}
i++; //incrementa indice
}
int j = 0;
int k = 0;
while (j < 26) { if (min[j] > 0) { //stampa solo se maggiore di zero
printf("%c\t%d\n",(j+'a'),min[j]);
}
j++;
}
while (k < 26) { if (mai[k] > 0) { //stampa solo se maggiore di zero
printf("%c\t%d\n",(k+'A'),mai[k]);
}
k++;
}
}
Maiuscolatore
E se invece volessimo manipolarle? Ecco un piccolo codice che trasforma una data stringa in maiuscolo con i dovuti commenti per comprenderlo:
#include
#include
char stringa[] = "Evviva Computer Blog e gli esercizi in C!"; //stringa da analizzare
int main() {
int intervallo = strlen(stringa); // lunghezza della stringa
int i = 0; //indice
while (i < intervallo) { if (stringa[i] >= 'a' && stringa[i] <= 'z') { //controlla che il carattere sia minuscolo
stringa[i] = stringa[i]-('a'-'A'); //crea la maiuscola
}
i++; //incrementa indice
}
printf("%s\n",stringa); //stampa la stringa finale
}