Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 30
  1. #1

    [C] Programma per contare parole

    Ciao ragazzi!
    Sono alle prese con un programma che tenta di contare quante volte si digitano le parole chiave del C. Tuttavia, ho parecchi problemi, e la versione presentata sul mio libro sembra errata, in quanto conta solo la prima parola (se volete dare un'occhiata al programma originale e smentirmi ecco qui il link.

    In particolare, quindi, ho problemi con la funzione getword()
    codice:
    #include <stdio.h>
    #include <ctype.h>
    #include <string.h>
    
    #define MAX_CHARS 100
    #define MAX_WORDS 1000 
    #define MAX_KEYS (sizeof (keytab) / sizeof (keytab[0]) )
    
    //Ogni struttura di tipo key è caratterizzata dalla parola e dal numero di occorrenze
    struct key
    {
    	char *word;
    	int count;
    };
    //Inizializzo un vettore contenente strutture di tipo key con tutte (si fa per dire :) )
    //le parole chiave del C
    struct key keytab[] =
    {
    	{"auto", 0},
    	{"else", 0},
    	// svariate altre parole chiave
    	{"while", 0},
    };
    
    static int getch (void); //simile a getc(void)
    static void ungetch (int); //simile a ungetc(int)
    struct key *binsearch(char *, struct key *, int);//effettua una ricerca della parola nel vettore
    //di strutture. Restituisce il puntatore alla struttura contenente la parola o NULL.
    int getword(char *, int); //legge la parola successiva in ingresso, dove per parola si 
    //intende una stringa che cominci con un carattere alfanumerico. Restituisce la lunghezza 
    //della parola o -1
    
    
    int main()
    {
    	char word[MAX_CHARS];
    	struct key *p;
    	
    	while (getword(word, MAX_CHARS) > 0)
    		if ( (p = binsearch(word, keytab, MAX_WORDS)) != NULL)
    			p->count++;
    	
    	for (p = keytab; p < keytab + MAX_KEYS; p++)
    		if (p->count > 0)
    			printf("Word: %s appears %d times\n", p->word, p->count);
    	
    	return 0;		
    }
    
    int
    getword(char *word, int limit)
    {
    	int c, i;
    	while ( (c = getchar()) != EOF && !isalnum(c))
    		; //avanza finchè non trova un carattere alfanumerico
    	if (c == EOF) //se abbiamo il segnale di fine file, lo restituiamo
    		return -1;	
    	word[0] = c;
    	for (i = 1; i < limit && (c = getchar()) != EOF && c != '\n' && isalnum(c); i++)
    		word[i] = c;
    	ungetch(c);	
    	word[i] = '\0';
    	return i;
    }
    
    //Ho omesso le altre funzioni per questioni di lunghezza e perchè penso siano scritte bene
    Quando compilo il codice non ho errori, ma quando lo eseguo, dopo l'inserimento di una qualsiasi parola, il programma si blocca dicendomi "Errore di segmentazione".
    Grazie mille a tutti coloro che vorranno darmi una mano

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480

    Re: [C] Programma per contare parole

    Se postassi anche la binsearch, si capirebbe meglio ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3

    Re: Re: [C] Programma per contare parole

    Originariamente inviato da oregon
    Se postassi anche la binsearch, si capirebbe meglio ...
    hai ragione, ora posto anche quella perchè tra tanti sbattimenti mi sembra di capire che l'errore sia proprio in quella funzione, visto che getch, ungetch e getword sembrano funzionare bene. Rispondendo alla tua domanda, si, viene allocato dalla binsearch. Ecco il codice
    codice:
    struct key *
    binsearch(char *word, struct key *tab, int limit)
    {
    	int cond;
    	struct key *low = &tab[0];
    	struct key *high = &tab[limit];
    	struct key *middle;
    	
    	while (low < high)
    	{
    		middle = low + (high - low) / 2;
    //		printf("%s\n", middle->word); //ho inserito questa printf per sapere cosa faceva
    //di volta in volta la funzione e a quanto pare sbaglia
    		if ((cond = strcmp(word, middle->word)) == 0)
    			return middle; 
    		else if (cond > 0)
    			low = middle + 1;
    		else
    			high = middle;
    	}
    
    	return NULL;
    }
    EDIT: c'era qualche parentesi in meno, ma ora sembra funzionare bene anche la binsearch ().

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Non fai prima a usare fgets?

  5. #5
    Originariamente inviato da ramy89
    Non fai prima a usare fgets?
    Non so neanche che sia XD
    Comunque l'impostazione base del problema sul libro è questa, ma siccome non mi sembrava adeguata, volevo modificare leggermente la getword().

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Naturalmente deve essere

    MAX_WORDS 3

    ma fossi in te userei la bsearch di libreria
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Originariamente inviato da oregon
    Naturalmente deve essere

    MAX_WORDS 3

    ma fossi in te userei la bsearch di libreria
    Perchè dovrebbe essere 3?
    Con MAX_WORDS intendo il massimo numero di parole date dal testo in ingresso.
    Se per esempio digito "ciao mondo break pippo break pluto", il programma ha preso 6 parole dall'ingresso, e tra queste trova le occorrenze delle parole chiave del C.

    Se invece ti riferisci al numero massimo di chiavi, l'ho definito partendo qui
    codice:
    #define MAX_KEYS (sizeof (keytab) / sizeof (keytab[0]) )
    Dove sbaglio?

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Allora non deve essere

    binsearch(word, keytab, MAX_WORDS)

    ma

    binsearch(word, keytab, MAX_KEYS)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Giustissimo!! Perfettamente ragione.
    Comunque, visto che le varie funzioni sembrano funzionare bene nei vari test, quello che dovrebbe dare problemi, per esclusione, è il main, che mi genera un errore di segmentazione.

    Ho provato a modificarlo in questo modo
    codice:
    int main()
    {
    /* prova()
    	
    	int prova(void);
    	prova();
    */
    	char *word[MAX_WORDS];
    	struct key *p;
    	
    	while (getword(*word, MAX_CHARS) > 0)
    	{
    		if ( (p = binsearch(*word, keytab, MAX_KEYS)) != NULL)
    			p->count++;
    		word++; //error: lvalue required as increment operand
    	}
    	for (p = keytab; p < keytab + MAX_KEYS; p++)
    		if (p->count > 0)
    			printf("Word: %s appears %d times\n", p->word, p->count);
    	
    	return 0;
    }
    Tuttavia ottengo quell'errore segnalato nel codice quando vado a incrementare word. Perchè?

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma che senso ha fare quell'incremento?

    E poi questa riga

    char *word[MAX_WORDS];

    alloca MAX_WORDS ma non lo spazio per ogni stringa ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.