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!!