Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2008
    Messaggi
    18

    problema con funzione hash in C

    ciao a tutti!
    Ho estremamente bisogno dell'aiuto di qualcuno!!
    Devo implementare un programma in C con le seguenti modalità:
    Il programma legge coppie di dati nome - email dal file passato come parametro e salvi i dati in una tabella hash(vettore).

    Esempio file con nomi e ind. mail:
    Mario - rossi.mario@tiscali.it
    Nicola - bianchi.nicola@hotmail.it
    Lucia - verdi.lucia@hotmail.it
    Andrea - blu.andrea@libero.it
    Antonio - neri.antonio@tiscali.it
    Rossana - violetti.rossana@gmail.it
    Stefano - galli.stefano@hotmail.it
    Elena - rosetti.elena@tiscali.it
    Erica - giacomini.erica@hotmail.it

    Il programma permette all'utente di specificare un nome sullo standard input e dopo aver premuto il tasto invio , il programma cerca il corrispondente indirizzo mail e lo stampa su standard output. Il prog ripete il comportamento descritto finchè l'utente non preme Ctrl-D.

    E' richiesta una tabella hash che segua la seguente strategia di scansione lineare:
    - per inserire una tupla con chiave e valori viene utilizzata la funzione di hash sulla chiave(nome) per determinare l'indice: se l'indice corrisponde ad una riga libera, la tupla viene salvata, altrimenti viene salvata nella riga libera successiva;
    - per cercare una tupla si usa la funz hash sulla chiave e poi si controlla se la chiave data corrisponde alla chiave della riga con l'indice trovato: se è così si restituiscono i valori, altrimenti si passa a controllare le righe successive.

    La funzione hash utilizzata è:
    funzHash(key) = ((ASCII(car1)+ASCII(car2))mod(DIM_TAB)
    (vedi implementazione in C nel codice)


    Il codice del mio programma è questo:

    codice:
    #include <stdio.h>
    
    #include <stdlib.h>
    #include <string.h>
    
    #define MAX 1024	// lunghezza massima di un array
    #define TABLE_SIZE 50	// dimensione della tabella hash
    #define LENGHT 60	// lunghezza max delle stringhe 
    
    
    
    struct Hash {		// definizione della struttura Hash
    
       char *key;
    
       char *email;
    
    };
    
    
    
    
    
    
    
    // prototipi delle funzioni
    
    void search(char *key);
    
    unsigned funzHash(char *key);
    
    unsigned linearProbing(unsigned entry);
    
    int fileIsEmpty(FILE *fp);
    
    
    typedef struct Hash TAB;	// creo una struttura di tipo Hash e la chiamo TAB	
    
    typedef TAB *TABPTR;		// creo un puntatore alla struttura appena creata
    
    
    char *table[TABLE_SIZE];
    
    
    
    
    // main
    
    
    
    main(){
    
    
    	int c, i, key;
    	char s[MAX], temp[MAX];
    	char file_name[MAX] ;			 // nome del file
    	char s1[MAX], user_name[MAX], temp1[MAX];// vettori per contenere il nome utente letto da file
    	char s2[MAX], data[MAX], temp2[MAX];	// vettori per contenere i dati dell' utente letti da file
    
    	FILE *fp;				// puntatore a file
    
    
    
    	printf("Inserire il nome del file (con estensione):\n");	// lettura del nome del file da stdin
    
    	scanf("%s", file_name);
    
    	fp = fopen(file_name, "r");		// chiamata a fopen
    
    	if (fp == NULL){			// controllo esistenza file specificato 
    
    		printf("Il file '%s' non esiste\n", file_name);	// se non esiste --> errore
    
    	} else if (! fileIsEmpty(fp)) {						// controllo se il file è vuoto
    
    		printf("Attenzione! Il file '%s' è vuoto\n", file_name);	// se è vuoto --> errore
    
    	} else {
    		// ciclo per inserire i dati in una cella libera della tabella hash
    		while((fgets(s1, MAX, fp)) != NULL) {	// lettura delle righe del file
    			i = 0;
    			while (s1[i] != ' ') {		// copia della parola letta
    				user_name[i] = s1[i];
    				i++;
    			}
    			user_name[i] = '\0';		// carattere di terminazione stringa
    			strcpy(temp1,user_name);	// salvataggio della parola letta in un array temporaneo
    			linearProbing(funzHash(temp));	// uso della funzione hash per individuare cella libera dove salvare i dati
    			// ciclo per inserire il nome e l'email dell' utente
    			while((fgets(s2, MAX, fp)) != NULL) {	// lettura delle righe del file
    				i = 0;
    				while ((s2[i] != '\n') && (i < strlen(s2))) {	// copia della riga letta ed eliminazione di '\n'
    					data[i] = s2[i];
    					i++;
    				}
    				data[i] = '\0';		// carattere di terminazione stringa
    				strcpy(temp2,data);	// salvataggio della linea letta in un array temporaneo
    
    			}
    		}
    	}
    	fclose(fp);		// chiusura del file
    
    	printf("\nInserire il nome dell'utente e premete Invio (Ctrl+D per terminare):\n");	//lettura del nome dell'utente da stdin
    	while((c = getchar()) != EOF) {		// lettura di un carattere da stdin
    		s[i] = c;			// inserimento del carattere nell'array della stringa corrente
    		while ((c = getchar()) != ' ') {
    			s[++i] = c;		// inserimento dei successivi caratteri validi nell'array
    		}
    		s[++i] = '\0';			// carattere di terminazione stringa
    	}
    	search(s);		// chiamata alla funzione di ricerca
    
    	return 0;		// uscita con successo
    
    }
    
    
    
    
    
    // funzione che cerca l'indirizzo email dell'utente letto da stdin
    
    void search(char *key){	// key = s
    
    	int i, value1, value2;
    	// nel vettore->s ho il nome dell' utente
    	value1 = funzHash(key);				// uso della funzione hash per la ricerca
    	value2 = linearProbing(funzHash(key));		// uso della funzione hash per la ricerca senza collisione
    	for (i = 0; i < TABLE_SIZE; i++) {		// scorre il vettore
    		if ((i == value1) && (key == table[i])) {  // controlla se il risultato della funzHash corrisponde all'indice della tabella e se la chiave passata come parametro corrisponde alla chiave della riga con l'indice trovato  
    			printf("%s\n",key);		// ritorna i dati dell'utente trovato
    		} else if ((i == value2) && (key == table[i])) {	// controlla nelle posizioni successive
    			printf("%s\n",key);
    		} else {
    			printf("Errore! Valore non trovato!\n");		// non ci sono corrispondenze
    		}
    	}					
    	
    }
    
    
    
    
    // funzione di hash
    unsigned funzHash(char *key) {
    
    	unsigned entry;
    	entry = ((int)key[1] + (int)key[2]) % TABLE_SIZE;
    	if (entry < 0) {
    		entry += TABLE_SIZE;
    	}
    	return entry;
    }
    
    
    // gestione delle collisioni con il metodo di linear probing: qnd si incontra una
    // collisione si utilizza l'indice successivo fino a che non si trova una casella libera
    unsigned linearProbing(unsigned entry) {
    
    	int count = TABLE_SIZE;
    	while (table[entry] != NULL || count--> -1) {
    		entry = (entry + 1) % TABLE_SIZE;
    	}
    	if (count == 0) {
    		printf("Errore! La tabella è piena! \n");
    		return -1;
    	}
    	return entry;
    }
    
    
    
    
    
    
    // funzione che controlla se un file è vuoto (ritorna 0 se il file è vuoto, un intero > 0 altrimenti) 
    
    int fileIsEmpty(FILE *fp){
    
    
    
       int count = 0;						// inizializzazione contatore caratteri
    
       char c;
    
    
    
       while ((c = fgetc(fp)) != EOF){				// lettura dei caratteri fino all'EOF
    
          if ((c != '\t') && (c != ' ') && (c != '\n'))		// è stato trovato un "whitespace" character 
    
             count++;					// --> incremento del contatore
    
       }
    
    
    
       rewind(fp);						// riazzeramento del puntatore a file
    
       return count;					// viene restituito il valore del contatore
    
    }


    Riesco a compilarlo (gcc -o rubrica_mail rubrica_mail.c)
    ed eseguirlo (./rubrica_mail)
    Inserisco il nome del file (rubrica.txt) e il nome di uno degli utenti del file, però il programma non esegue niente; secondo me c'è qualche errore nel codice di search(char *key), probabilmente nell' IF.
    Oppure qualche piccolo errore nel main (ma nn credo)
    QUALCUNO RIESCE AD AIUTARMI??
    Grazie mille in anticipo!
    (vi allego anche il codice in C se vi potesse servire)

  2. #2

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.