Esercizio stringhe in C
Buongiorno a tutti!:)
Ho un problema riguardo alla risoluzione del seguente esercizio:
"Si scriva un programma che acquisisca utilizzando la funzione gets un astringa composta da un massimo di 5 parole separate da spazi, per un totale di massimo 60 caratteri. Il programma deve:
a. Stabilire quante sono le parole contenute effettivamente nella stringa
b. Calcolare la media della lunghezza delle parole"
Ho provato a risolvere nel modo seguente ma non funziona. Per quanto riguarda il punto b invece non saprei proprio come fare
Consigli? Grazie!
Ho un problema riguardo alla risoluzione del seguente esercizio:
"Si scriva un programma che acquisisca utilizzando la funzione gets un astringa composta da un massimo di 5 parole separate da spazi, per un totale di massimo 60 caratteri. Il programma deve:
a. Stabilire quante sono le parole contenute effettivamente nella stringa
b. Calcolare la media della lunghezza delle parole"
Ho provato a risolvere nel modo seguente ma non funziona. Per quanto riguarda il punto b invece non saprei proprio come fare

#include <stdio.h> #include <stdlib.h> #include <string.h> #define N 60 int main() { char s[N+1]; int len,i; int n_parole=0; int somma=0; float media; printf("inserisci una stringa di caratteri separata da spazi:\n"); gets(s); len=strlen(s); for(i=0;i<len;i++){ if( (s[i]==' ') && (s[i+1]!=' ' || s[i+1]!='\0' ) ) n_parole++; } printf("parole=%d",n_parole); return 0; }
Risposte
So che è richiesto espressamente dal testo dell'esercizio, ma gets NON VA MAI UTILIZZATA. Nella più recente versione dello standard (del 2011) è in effetti stata rimossa, mentre già nello standard del 1999 era stata deprecata e il suo uso è sconsigliata da sempre. La funzione corretta da usare è fgets, presente da sempre nello standard e più sicura. E' leggermente più complicata da usare ma il gets(s) del tuo codice verrebbe sostituito da fgets(s, N+1, stdin) .
Nel codice che hai scritto stai in pratica contando le sequenze di spazi all'interno della stringa. Il principale problema di questo approccio è che non è necessariamente uguale al numero di parole. Supponiamo ad esempio di avere la stringa "ciao pippo". C'è un solo spazio nella stringa ma due parole. Se prendiamo però qualcosa come " ciao" allora il calcolo viene effettivamente corretto. Un altro problema è la possibilità di avere altri tipi di spazi come la tabulazione '\t'.
Una possibile soluzione potrebbe essere quella di usare una "macchina a stati". Mentre scorri la stringa ti puoi insomma trovare in uno dei seguenti stati: SPAZIO, PAROLA. Inizi nello stato SPAZIO e se se incontri qualcosa che non sia uno spazio passi allo stato PAROLA e incrementi di uno il numero di parole. Mentre sei invece nello stato PAROLA incrementi un contatore in modo da contare il numero di lettere in ogni parola. La lunghezza media sarà infatti uguale al numero totale di lettere diviso il numero di parole. Se incontri uno spazio torni allo stato SPAZIO.
Nel codice che hai scritto stai in pratica contando le sequenze di spazi all'interno della stringa. Il principale problema di questo approccio è che non è necessariamente uguale al numero di parole. Supponiamo ad esempio di avere la stringa "ciao pippo". C'è un solo spazio nella stringa ma due parole. Se prendiamo però qualcosa come " ciao" allora il calcolo viene effettivamente corretto. Un altro problema è la possibilità di avere altri tipi di spazi come la tabulazione '\t'.
Una possibile soluzione potrebbe essere quella di usare una "macchina a stati". Mentre scorri la stringa ti puoi insomma trovare in uno dei seguenti stati: SPAZIO, PAROLA. Inizi nello stato SPAZIO e se se incontri qualcosa che non sia uno spazio passi allo stato PAROLA e incrementi di uno il numero di parole. Mentre sei invece nello stato PAROLA incrementi un contatore in modo da contare il numero di lettere in ogni parola. La lunghezza media sarà infatti uguale al numero totale di lettere diviso il numero di parole. Se incontri uno spazio torni allo stato SPAZIO.
Grazie mille!!