Lunghezza media delle parole

streghettaalice
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;
}

Risposte
vict85
Hai presente vero che i commenti in C si fatto chiudendo il testo in /* */ ?
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ù.

streghettaalice
quindi dovrei utilizzare ch= getchar() in modo che mi considera il singolo carattere?

vict85
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.

apatriarca
@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.

streghettaalice
     #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..

vict85
Il ch = getchar() nel if non va, l'hai già inserito al di fuori del if-else.

streghettaalice
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..)

Obidream
#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)

streghettaalice
mi sfugge perchè quel tot++ prima della media(quando esce dal while)

Obidream
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

streghettaalice
è 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?

apatriarca
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..

streghettaalice
/* 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;
	 
	 }

apatriarca
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:
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.

streghettaalice
Vero! grazie!!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.