File di testo, parola piu' lunga...

di il
16 risposte

File di testo, parola piu' lunga...

Buona sera , sono alle prese con questo programma:
/* Si scriva una funzione che prenda come parametro il nome di un ?le e restituisca,
nel modo che si ritiene piu` opportuno, i seguenti quattro valori:
1. il numero totale di caratteri presenti nel ?le (inclusi spazi bianchi e ritorno a capo)
2. il numero di parole totali presenti nel ?le,dove per parola si intende qualsiasi sequenza non nulli di caratteri saparati da spazi bianchi o ritorno a capo;
3. il numero di righe totali del ?le.
4. la lunghezza della parola piu` lunga presente nel ?le
*/
I primi tre punti sono riuscita a farli senza problemi e a video mi danno un risultato corretto, il 4° punto invece no. L'ho elabarato nel seguente modo:
int lunghezza_parola_massima(char *nome){
FILE *fp;
int res, conta=0, max=0;
char buf[200];

 fp=fopen(nome, "r");
  while((res=fgetc(fp))!=EOF){
   if(res!=' ' && res!='\n'){
    conta++;
   }
   if(conta>max){
    max=conta;
    conta=0;
   }
   else{
    conta=0;
   }
 }

fclose(fp);

return max;
}

16 Risposte

  • Re: File di testo, parola piu' lunga...

    Potresti usare una semplice LUT per memorizzare la posizione dei vari spazi e newline.Facendo poi la differenza tra le posizioni salvate nella LUT,trovi l'indice del carattere iniziale della parola più lunga nel file,poi con fseek() ti sposti nella posizione appena ricavata e leggi tutti i caratteri fino al successivo spazio o newline.
  • Re: File di testo, parola piu' lunga...

    E si perché quando conta < max tu con l'else

    else{
    conta=0;
    }

    riazzeri la variabile, quindi il tuo max è sempre 1, cioè il valore del primo conta
  • Re: File di testo, parola piu' lunga...

    Ercules76 ha scritto:


    quindi il tuo max è sempre 1, cioè il valore del primo conta
    Si infatti compilando mi da sempre valore 1. Ma non capisco come cambiarlo perche' azzerare la variabile cont mi sembrava una giusta decisione, ma a quanto pare non e' efficiente
  • Re: File di testo, parola piu' lunga...

    random_95 ha scritto:


    Ercules76 ha scritto:


    quindi il tuo max è sempre 1, cioè il valore del primo conta
    Si infatti compilando mi da sempre valore 1. Ma non capisco come cambiarlo perche' azzerare la variabile cont mi sembrava una giusta decisione, ma a quanto pare non e' efficiente
    devi togliere quell'else
  • Re: File di testo, parola piu' lunga...

    Ercules76 ha scritto:


    devi togliere quell'else
    Ho tolto l'else e mi stampa come valore 11 quando dovrebbe stampare 8
  • Re: File di testo, parola piu' lunga...

    Che parola hai inserito?
  • Re: File di testo, parola piu' lunga...

    Ho scelto come esempio il seguente:

    Ognuno sta solo sul cuor della terra,
    trafitto da un raggio di sole:

    ed `e subito sera.

    La funzione deve restituire i valori (91,17,4,8)
  • Re: File di testo, parola piu' lunga...

    La soluzione con la LUT non va bene?
  • Re: File di testo, parola piu' lunga...

    Piccola correzione
    
    	while((res=fgetc(fp))!=EOF)
    	{
    		if(res!=' ' && res!='\n')
    			conta++;
    		else
    		{
    			if(conta>max) 
    				max=conta;
    		
    			conta=0;
    		}
    	}
    
    da correggere se vuoi includere o escludere i segni di interpunzione.
  • Re: File di testo, parola piu' lunga...

    loopunrolling ha scritto:


    La soluzione con la LUT non va bene?
    Ho preferito capire cosa erravo nel mio codice per capire meglio il concetto
  • Re: File di testo, parola piu' lunga...

    Ti ringrazio oregon
  • Re: File di testo, parola piu' lunga...

    Hai provato a debuggare e vedere se entra nel ciclo while?
  • Re: File di testo, parola piu' lunga...

    Si ho modificato il codice e funziona correttamente, dandomi appunto il risultato corretto che è 8.
  • Re: File di testo, parola piu' lunga...

    Bravissimo, giustamente come era impostato prima ogni volta che trovare count maggiore di max azzeravi e tornavi a contare da zero anche sulla stessa parola e quindi sballava i conti, come hai corretto è giusto perché lui conta solo dentro la stessa parola e quando trova lo spazio o il \n va a fare il confronto. Complimenti
Devi accedere o registrarti per scrivere nel forum
16 risposte