PDA

Visualizza la versione completa : [c] stringhe ricerca vocali


abbax
21-03-2009, 16:08
Devo inserire una stringa di lettere minuscole, vedere quante vocali ci sono e dire qual'è la più frequente. Allore mi sono detto: uso lo switch case:


n_a=0;
n_e=0;
n_i=0;
n_o=0;
n_u=0;
for(i=0;i<lenght;i++){
switch(frase[i]){
case 'a': n_a+=1;
break;
case 'e': n_e+=1;
break;
case 'i': n_i+=1;
break;
case 'o': n_o+=1;
break;
case 'u': n_u+=1;
break;
}}
voc=n_a + n_e + n_i + n_o + n_u;
printf("\nCi sono %d vocali", voc);

Però adesso come si fa a vedere quella che compare più volte?

YuYevon
21-03-2009, 16:29
In che senso non funziona? Qual è il problema? La stringa che dai in input contiene qualsiasi lettera (anche consonanti) ? Se è così, devi prevedere anche il caso in cui il carattere i-esimo non sia una vocale... cioè, se è una 'a', incrementa il contatore delle 'a', se è una 'e' incrementa il contatore delle 'e' e così via... ma se è una 'f', una 'g' o altro?

abbax
21-03-2009, 16:34
nono funziona... avevo fatto anche con le maiuscole durante la prova e ovviamente non me le contava... però adesso devo determinare quella che compare più volte ed in questo ho un po' di difficoltà... cioè è semplicissimo se facessi un vettore di 5 elementi (n° di vocali) i cui elementi sono quante volte compare ogni vocale... però vorrei evitare di fare il vettore, ma non mi viene nulla in mente.Inoltre mi direbbequante volte compare e non chi compare più volte...

YuYevon
21-03-2009, 17:43
Così senza pensarci troppo non vedo altre possibilità se non quella di dichiarare un vettore di 5 elementi. Tra l'altro, qual è la differenza tra dichiarare 5 variabili intere e un vettore di 5 interi? Se vogliamo, la seconda è una soluzione anche un po' più ordinata.

Per quanto riguarda questo:



Inoltre mi direbbe quante volte compare e non chi compare più volte


puoi semplicemente stabilire che nel primo elemento del vettore ci va la frequenza di 'a', nel secondo quella di 'e' e così via... quindi, quando vai a fare la ricerca del massimo nell'array, una volta trovato il massimo ti memorizzi pure l'indice dell'elemento dell'array in cui lo hai trovato e, a seconda del suo valore (0, 1, 2...) concludi qual è la vocale presente più volte (a, e, i...).

abbax
21-03-2009, 18:02
Perfetto... speravo che ci fosse un metodo un po' meno laborioso... per fare una cavolatina ci sono volute un bel po' di righe. Comunque grazie mille. Dovrai sopportarmi fino a lunedì e poi ti lascerò in pace dato che avrò l'esame.. se andrà bene lo dovrò soprattutto a te :ciauz:

abbax
21-03-2009, 19:32
Occhio che domani farò un altro esercizio e ti rimanderò domande... ora tregua :)
l'esercizio dice: dato un array ordinato levare gli elementi che si ripetono e aggiungere tanti 0 in coda per tornare alla lunghezza iniziale. Immagino che sia tutto di malloc e realloc giusto?

abbax
22-03-2009, 15:26
Come promesso sono tornato. Avevo letto maluccio l'esercizio: praticamente ho un vettore orninato e devo creare un nuovo vettore dove levo i doppioni del primo e metto tanti zeri quanti doppioni ho tolto. Purtroppo nella sostituzione c'è qualcosa che non torna. Il vettore si chiama v con indice i, il vettore nuovo è w con indice j e la lunghezza è n:


count=0;
for(i=1, j=1; i<n; i++, j++){
if(v[i]!=v[i-1]){
w[j]=v[i];
count+=1;}
else
;
}
for(j=count; j<n; j++)
w[j]=0;
printf("\n\n\n Vettore finale: ");
for(j=0; j<n; j++){
printf("%3d", w[j]);}

abbax
22-03-2009, 16:29
non lo leggere nemmeno sopra... ho trovato l'errore (incrementavo sempre la j anche quando non allocavo nulla)...
però giusto per completezza vorrei mettere un controllo che dica se il vettore è ordinato o no... non so però se c'è un comando che mi faccia uscire dal programma se il vettore non è ordinato
Ho fatto così, però non fa nulla....

cont=0
for (i=(n-2); i=0; i--){
if(v[i]>v[i+1])
cont+=1;
else
;}
if (cont!=0){
printf("\nVettore non ordinato");
exit(0);}
else;

YuYevon
22-03-2009, 17:04
abbax ci sono un paio di cose che non vanno (non dico nell'esercizio); non spetta a me fare il moderatore, ma poiché la cosa mi riguarda in prima persona te lo dico:

1) rivolgersi ad un determinato utente quando si scrive su un forum non sta bene. Fin quando uno prende in esame il tuo problema, allora ha senso rivolgersi a lui in prima persona come interlocutore (ciò non toglie, comunque, che chiunque può entrare nella discussione in un secondo momento), ma se vieni qui a proporne un altro non è detto che debba essere lo stesso utente a risponderti... io non faccio tutorato online, e poi ci sono un bel po' di utenti molto più capaci di me;

2) se hai un esercizio diverso su cui hai problemi, devi aprire un nuovo topic. Questo thread non si intitola "i problemi di abbax", ma "[c] stringhe ricerca vocali".

Comunque, per arrestare il programma potresti ricorrere alla funzione exit() definita in stdlib.h

http://www.cplusplus.com/reference/clibrary/cstdlib/exit.html
http://digilander.libero.it/uzappi/C/librerie/funzioni/exit.html

abbax
22-03-2009, 17:06
ok, pardon. Comunque come vedi l'ho messa nel ciclo e ho detto che non fa nulla

Loading