PDA

Visualizza la versione completa : [C] problema per contare lettere


vip
14-10-2005, 15:25
ciao ragazzi, ho un problema di una variabile char "nome" dovrei stampare a video quante volte si ripete la lettera a,la b, la c,la d ecc... io avevo pensato ad uno switch, ma dovrei scrivere tutto l'alfabeto.. non c'Ŕ un modo piu veloce?

grazie mille
ciao

X-sPiKe_iT
14-10-2005, 16:35
bah te la puoi cavare benissimo con un paio di cicli. Ogni carattere ha un corrispondente valore decimale o hex come ti pare.. per scoprire a cosa equivale A o a ti rimando a una tabella ascii (ne trovi a milioni su google.. anzi che dico a miliardi !!) cmq in sostanza devi usare una struttura del tipo:
for(int lett=valoreA; lett<=valoreA && lett>=valoreZ; lett++)
{ //abbiamo detto per tutte le lettere dell'alfabeto
for (int i=0; i<strlen(stringaNome); i++)
{ //in sostanza abbiamo detto cicla per tutta la stringa
if(stringaNome[i]==lett)
{
alfabeto[i]++; //dove alfabeto e' un array con un elemento per ogni lettera dell'alfabeto precedentemente inizializzato a 0. In soldoni fa solo da contatore.
}
}
}
Non l'ho provato cmq e' una cosa abbastanza banale, e' inutile dire che avrai due ricerche da fare perche' i caratteri MAIUSCOLI e minuscoli hanno valori diversi (A!=a)
Inoltre cosi' facendo hai un array (alfabeto) che fa da contatore, quindi conseguentemente ad alfabeto[0] corrispondono le presenze di A, alfabeto[1] presenze di B, alfabeto[2] presenze di C ect ect ect

king64
14-10-2005, 18:40
Puoi limitare i cicli ad uno solo usando le funzioni toupper o tolower .Saluti :ciauz:

X-sPiKe_iT
14-10-2005, 19:12
si vero, pero' se gli serve fare distinzione tra maiuscoli e minuscoli ? :P

netarrow
14-10-2005, 21:26
tenendo conto che le lettere ASCI vanno da 65(A) a 90(Z) e le minuscole si creano aggiungendo 32 97(a) 122(z).
Puoi fare un ciclo for che prenda lettera per lettera della parola e faccia la differenza per sapere se Ŕ la prima, la terza, quindi ecc.. lettera dell'alfabeto, es:

tutto

116 117 116 116 111

lettere[25-(122-116)]++;

generalizzando:



per ogni lettera prendi l'ASCI
ottieni l'indice dell'array con:
NumeroLettereAlfabeto-(MaxAsci-Asci)
Incrementa quell'indice


Infatti 25-(122-116) fa 19, 97 + 19 fa 116, quindi tu per stampare la frequenza farai:

(char)(97 + i) compare lettere[i] volte

o simile, se si pensa un attimo si riesce anche a gestire la differenza maiuscole e minuscole.

Sempre l'array inizializzato a 0 ecc...

dimenticavo... 1200 posts :yuppi:


:ciauz:

francylosvitato
14-10-2005, 22:04
PiccolÓ curiositÓ che mi Ŕ venuta mentre leggevo il tread: Per trovare il corrispettivo ascii di un carattere c'Ŕ la funzione toascii() in ctype.h vero?

Shagrat
14-10-2005, 23:35
che io sappia basta castare ad intero il carattere di cui vuoi sapere il codice

se fai


char c = 'r';
printf("codice: %i, carattere: %c",c,c);

ti stampa il codice ascii e il carattere...con un semplice ciclo ti recuperi tutta la tabella...


int i;
for(i=0;i<256;i++)
printf("codice: %i, carattere: %c",i,i);

Loading