Lunghezza media delle parole
Ho un esercizio molto semplice (premetto che non abbiamo fatto ancora i vettori a lezione)
ma che nell'esecuzione non esce.
devo determinare la lunghezza media delle parole di una frase.
Io ho svolto così:
#include
int main (void)
{
int l =0; *l serve a determinare lunghezze delle parole
float m; * m è la media
int a;* a serve a dire quante sono le parole
printf("scrivi il tuo messaggio:");
while (getchar() != '\n') {
if (getchar()!=' '){
l++;
}else a++;
}
m=(float)l/(float)a;
printf("le parole del tuo messaggio hanno in media %.f caratteri\n ", m);
return 0;
}
ma che nell'esecuzione non esce.
devo determinare la lunghezza media delle parole di una frase.
Io ho svolto così:
#include
int main (void)
{
int l =0; *l serve a determinare lunghezze delle parole
float m; * m è la media
int a;* a serve a dire quante sono le parole
printf("scrivi il tuo messaggio:");
while (getchar() != '\n') {
if (getchar()!=' '){
l++;
}else a++;
}
m=(float)l/(float)a;
printf("le parole del tuo messaggio hanno in media %.f caratteri\n ", m);
return 0;
}
Risposte
Hai presente vero che i commenti in C si fatto chiudendo il testo in /* */ ?
Perché vedo un
che di sicuro non viene interpretato come un commento.
Il codice corretto è
oppure, in C++,
In ogni caso, in questo pezzo
getchar prende sempre nuovi caratteri, il getchar che è diverso da '\n' non è quello che controlli sia diverso da ' '. Devi memorizzare il carattere nel primo e confrontarlo nell'if.
Non ho comunque controllato che l'algoritmo sia giusto, mi sono soffermato solo sugli errori evidenti. Dimmi se funziona o se devo pensarci su di più.
Perché vedo un
int l =0; *l serve a determinare lunghezze delle parole float m; * m è la media int a;* a serve a dire quante sono le parole
che di sicuro non viene interpretato come un commento.
Il codice corretto è
int l =0; /*l serve a determinare lunghezze delle parole */ float m; /* m è la media */ int a; /* a serve a dire quante sono le parole */
oppure, in C++,
int l =0; // l serve a determinare lunghezze delle parole float m; // m è la media int a; // a serve a dire quante sono le parole
In ogni caso, in questo pezzo
while (getchar() != '\n') { if (getchar()!=' '){ l++; }else a++; } m=(float)l/(float)a;
getchar prende sempre nuovi caratteri, il getchar che è diverso da '\n' non è quello che controlli sia diverso da ' '. Devi memorizzare il carattere nel primo e confrontarlo nell'if.
Non ho comunque controllato che l'algoritmo sia giusto, mi sono soffermato solo sugli errori evidenti. Dimmi se funziona o se devo pensarci su di più.
quindi dovrei utilizzare ch= getchar() in modo che mi considera il singolo carattere?
Beh, si. In realtà sarebbe anche opportuno tenere conto di virgole e simboli simili e che se metti due spazi non devi aumentare il numero di parole. Ma quello lo puoi fare dopo.
@streghettaalice: Inserisci il codice usando il tag Code per renderlo più leggibile.
Il tuo codice dovrebbe funzionare a patto che ci sia sempre e solo uno spazio tra le diverse parole e se chiamiamo parole qualsiasi sequenze di caratteri diversi dallo spazio. Per un esercizio scolastico direi che potrebbe andare bene.
Il tuo codice dovrebbe funzionare a patto che ci sia sempre e solo uno spazio tra le diverse parole e se chiamiamo parole qualsiasi sequenze di caratteri diversi dallo spazio. Per un esercizio scolastico direi che potrebbe andare bene.
#include <stdio.h> int main (void) { int len=0 ; float m=0; int a=0; char ch; printf("scrivi il tuo messaggio:"); ch=getchar(); while (ch!= '\n') { if (ch!=' '){ len++; ch=getchar(); } else a++; ch=getchar(); } m=(float)len/(float)a; printf("le parole del tuo messaggio ha in media %.f caratteri\n ", m); return 0; }
Credo continui a esserci qualcosa che non va..
Il ch = getchar() nel if non va, l'hai già inserito al di fuori del if-else.
l'ho inserito perchè mi serve contare tutti i caratteri di una parola , poi quando finisce la parola passo al carattere della parola successiva ( per questo anche ch = getchar dopo l'else..)
#include <stdio.h> #include <stdlib.h> int main() { char carat; int somma=0,tot=0; float media; printf("Inserisci una frase:( termina col <CR>)\n"); while((carat=getchar())!='\n') { if (carat!=' ') somma++; else tot++; } tot++; media=(float)somma/(float)tot; printf("La lunghezza media delle parole e': %.2f\n",media); return EXIT_SUCCESS; }
Una cosa del genere dovrebbe andare.. Non l'ho testato a fondo, ma a primo impatto gira, se non ti torna qualcosa chiedi pure

( Se vuoi puoi aggiungere dei controlli per vedere se il carattere è alfabetico o meno utilizzando le funzioni nella libreria ctype.h)
mi sfugge perchè quel tot++ prima della media(quando esce dal while)
Non riesco a spiegarlo teoricamente quindi provo con un esempio...
Se ad esempio inserisco la parola "ciao" senza quell'incremento quando vado a calcolare la media mi troverei 4/0 e quindi mi darebbe errore, in quanto come puoi vedere dall'if la variabile tot viene incrementata soltanto quando incontro un blank ( spazio bianco).. Se invece provo ad inserire "ciao mondo" mi troverei 9/1, mentre come sappiamo la lunghezza media in questo caso è 4,5.. Invece mettendo quell'incremento a tot risolvo questo problema
Se ad esempio inserisco la parola "ciao" senza quell'incremento quando vado a calcolare la media mi troverei 4/0 e quindi mi darebbe errore, in quanto come puoi vedere dall'if la variabile tot viene incrementata soltanto quando incontro un blank ( spazio bianco).. Se invece provo ad inserire "ciao mondo" mi troverei 9/1, mentre come sappiamo la lunghezza media in questo caso è 4,5.. Invece mettendo quell'incremento a tot risolvo questo problema
è vero!
Un altra domanda anche se non c'entra molto con questo.
A volte mi succede quando al compilatore voglio eseguire il programma che ricevo l'input(esempio"inserisci un numero")
poi faccio invio e "non succede niente" se però inserisco una lettera quasiasi e faccio invio ottengo invece il risultato...
per esempio
inserisci un numero :3(premo invio)
f (premo invio)
risultato
Come mai succede?
Un altra domanda anche se non c'entra molto con questo.
A volte mi succede quando al compilatore voglio eseguire il programma che ricevo l'input(esempio"inserisci un numero")
poi faccio invio e "non succede niente" se però inserisco una lettera quasiasi e faccio invio ottengo invece il risultato...
per esempio
inserisci un numero :3(premo invio)
f (premo invio)
risultato
Come mai succede?
Probabilmente perché, involontariamente o meno, il tuo codice si aspetta due valori in input invece di uno solo. Mostra un codice di esempio in cui questo succede..
/* calcolo della radice quadrata con il metodo di Newton */ #include <stdio.h> #include<math.h> int main(void) { int x; double y=1; double m=0; double a; printf("inserisci un numero positivo:"); scanf("%d ",&x); a=(double)x/y; m=(y+a)/2; while (fabs(y-(m))>=(0.00001)*y){ y=m; a=(double)x/y; m= (y+(a) )/2; } printf("la radice quadrata di %d e': %f\n", x,m); return 0; }
Uno spazio all'interno della stringa di formato di scanf (e funzioni simili) ha il significato di ignorare ogni spazio (compreso i caratteri di a capo) fino ad un carattere che non è uno spazio. Nella seguente riga:
viene quindi letto un numero e legge spazi o caratteri di a capo fino ad incontrarne uno diverso (come avevi già avuto modo di osservare). Togli quello spazio e tutto si risolverà. Di fatto uno spazio nella stringa di formato è quasi sempre inutile (c'è una sola situazione che conosco in cui abbia una qualche utilità), ma di certo non va mai inserito alla fine della stringa di formato.
scanf("%d ",&x);
viene quindi letto un numero e legge spazi o caratteri di a capo fino ad incontrarne uno diverso (come avevi già avuto modo di osservare). Togli quello spazio e tutto si risolverà. Di fatto uno spazio nella stringa di formato è quasi sempre inutile (c'è una sola situazione che conosco in cui abbia una qualche utilità), ma di certo non va mai inserito alla fine della stringa di formato.
Vero! grazie!!