Entra

View Full Version : OCCORRENZA CARATTERI PLEASE!!!


Lo_Straniero2003i
17-06-2006, 13:34
Salve ragazzi, mi serve un altro aiuto, nella speranza che mi arrivi l'altro :D

Mi trovo d'avanti ad una piccola difficoltà secondo me ma che per qualcosa non riesco ad individuare. Il mio problema è che data una stringa di caratteri, devo visualizzare a video tutti i caratteri, tranne quelli che si ripetono e visualizzare quante volte si ripetono. Es.

Alessandro

l =1, e=1, s=2, a=1, n=1, d=1, r=1, 0=1, A=1

a tal proposito:
int conta_caratteri(char str[], int conta[]) {
int x;
int contatore = 0;
int lunghezza = strlen(str);
int stracomodo[lunghezza];
for(int i=0; i<lunghezza; i++) {
x = (int)str[i];
conta[i] = x;
}

dove str è la stringa e conta sarebbe il numero di volte che si ripete un caratte; la dimensione di conta deve essere 128 dato un opportuno indice ch perchè la ricerca viene fatta tramite confroto numerico=ASCII. Con la porzione di codice sopra, semplicemente creo un array di num dove ad ogni lettere corrisponde un codice ASCII corrispondente. Spero mi aiuterete. Saluti!! :D

andbin
17-06-2006, 14:03
int conta_caratteri(char str[], int conta[]) {
int x;
int contatore = 0;
int lunghezza = strlen(str);
int stracomodo[lunghezza];
for(int i=0; i<lunghezza; i++) {
x = (int)str[i];
conta[i] = x;
}

dove str è la stringa e conta sarebbe il numero di volte che si ripete un caratte; la dimensione di conta deve essere 128 dato un opportuno indice ch perchè la ricerca viene fatta tramite confroto numerico=ASCII. Con la porzione di codice sopra, semplicemente creo un array di num dove ad ogni lettere corrisponde un codice ASCII corrispondente. Spero mi aiuterete. Saluti!! :DNo, così non va bene. Dovresti fare così: all'inizio azzeri tutto l'array in modo che i valori siano tutti 0. Successivamente, per ogni carattere, incrementi di 1 la cella dell'array con l'indice corrispondente al codice del carattere. Alla fine, le celle con valore diverso da 0 indicano quali caratteri sono presenti e in quale quantità.

Lo_Straniero2003i
17-06-2006, 14:46
Perdonami, potresti scrivermelo?

Lo_Straniero2003i
17-06-2006, 15:41
fatto. Grazie Mille!!!!

Lo_Straniero2003i
17-06-2006, 16:18
Anzi...credevo di avercela fatta. Ho creato l'array che mi hai detto. Ci sono all'inizio 128 seri per poi modificarsi. Ora però come faccio a stampare a video quello di sopra?? :muro:

int conta_caratteri(char str[], int conta[]) {
int lunghezza = strlen(str);
int ch = 0;
int x = 0, g = 0;
int contatore;
int comodo[lunghezza];
for (int i=0; i<lunghezza; i++) {
x = (int)str[i];
comodo[i] = x;
for(int j=0; j<128; j++) {
if(comodo[i]==j)
conta[j] +=1; }
}

scorpion89
17-06-2006, 16:43
Qualcosa del genere dovrebbe andare

for( int i=0 ; i<128 ; i++ ){
if( comodo[i] != 0 ) printf("%c = %d",str[i],comodo[i]);
}

Ciao

PS
comodo contiene le ripetizioni delle lettere??

Lo_Straniero2003i
17-06-2006, 16:48
si, ma quando stampo devo fare in modo che le stampi una volta sola e poi mettere accanto il relativo numero di frequenza.

andbin
17-06-2006, 17:02
Anzi...credevo di avercela fatta. Ho creato l'array che mi hai detto. Ci sono all'inizio 128 seri per poi modificarsi. Ora però come faccio a stampare a video quello di sopra?? :muro:

int conta_caratteri(char str[], int conta[]) {
int lunghezza = strlen(str);
int ch = 0;
int x = 0, g = 0;
int contatore;
int comodo[lunghezza];
for (int i=0; i<lunghezza; i++) {
x = (int)str[i];
comodo[i] = x;
for(int j=0; j<128; j++) {
if(comodo[i]==j)
conta[j] +=1; }
}No, non ci siamo ancora ...
Quindi:
1) All'inizio di conta_caratteri() azzeri tutto l'array conta. Fai un bel ciclo for (o usi la memset, se ne sei pratico) e azzeri tutto l'array.
2) Per ogni carattere della stringa ottieni il suo codice ... lo fai già con (int)str[i]. Questo valore deve essere l'indice all'interno dell'array conta. A quel punto l'elemento dell'array lo incrementi di 1.

Nota: ovviamente prima di chiamare la funzione conta_caratteri dovrai aver allocato adeguatamente l'array da passare alla funzione in modo che possa contenere 128 interi.

Lo_Straniero2003i
17-06-2006, 17:12
Ma io gli passo come parametro già un array vuoto, con 128 zeri...

andbin
17-06-2006, 17:20
Ma io gli passo come parametro già un array vuoto, con 128 zeri...Ah ... ok. La scelta di azzerare l'array fuori o dentro la funzione dipende da te, ovviamente! ;)
Comunque dentro la funzione, dato il valore (int)str[i] devi usarlo come indice dell'array conta e incrementare di 1 il valore della cella. Tutto qua. Basta 1 for per scansionare i caratteri della stringa e (dentro il ciclo) 1 istruzione di incremento del valore della cella.