| V I S U A L I Z Z A D I S C U S S I O N E |
| ohtar |
Inserito il - 08/07/2004 : 11:24:23 #include <stdio.h> #include <stdlib.h> #include <string.h> #define numeri 24 #define dimensione 29 #define salto 7 #define null 0
struct table { char id[10]; int num; }tabella[dimensione];
void azzera() { int i; for (i=0;i<dimensione;i++) tabella[i].num=null; }
int check (int k) { if (tabella[k].id==null) return 1; else return 0; } int conv(char cod) { switch (cod) { case ('a'): return 10; break; case ('b'): return 11; break; case ('c'): return 12; break; case ('d'): return 13; break; case ('e'): return 14; break; case ('f'): return 15; break; case ('g'): return 16; break; case ('h'): return 17; break; case ('i'): return 18; break; case ('j'): return 19; break; case ('k'): return 20; break; case ('l'): return 21; break; case ('m'): return 22; break; case ('n'): return 23; break; case ('o'): return 24; break; case ('p'): return 25; break; case ('q'): return 26; break; case ('r'): return 27; break; case ('s'): return 28; break; case ('t'): return 29; break; case ('u'): return 30; break; case ('v'): return 31; break; case ('w'): return 32; break; case ('x'): return 33; break; case ('y'): return 34; break; case ('z'): return 35; break;
} int hash(char cod[10]) { int indice,partenza,somma=0; int i=0; do { somma=somma+conv(cod[i]); } while (cod[i]!='\0'); indice=somma%dimensione; if (!(check(indice))) { partenza=indice; do { indice=(indice+salto)%dimensione; }while (!(check(indice))&& indice!=partenza); if ((check(indice))||(indice=partenza)) indice=-1; } if (indice!=-1) strcpy(tabella[indice].id,cod); return indice; }
void ricerca() { char codice[10]; int i=0; int somma; int indice,partenza; printf("Inserisci l'elemento da cercare.\n"); scanf("%s",&codice); do { somma=somma+codice[i]; } while (codice[i]!='\0'); indice=somma%dimensione; if (tabella[indice].id==codice) printf("L'elemento e' stato trovato nella posizione %d.\n",indice); else { partenza=indice; do { indice=(indice+salto)%dimensione; } while (tabella[indice].id!=codice && indice!=partenza && !check(indice)); } if ((indice==partenza)||(check(indice))) printf("L'elemento non e' presente all'interno della tabella.\n"); else printf("L'elemento e' stato trovato alla posizione %d.\n",indice); }
void inserimento() { int i=0,indice,nume,errore; char cod[10]; printf("Tabella hash.\n\n"); printf("L'inserimento si conclude con un asterisco.\n\n"); do { printf("Inserisci il numero negativo per terminare"); scanf("%d",&nume); if (nume>0) { printf("Inserisci il %d° elemento:\n",i+1); scanf("%s",&cod); if (indice=(hash(cod)==-1)) errore=1; i++; } } while (nume>0 && i<=numeri && errore!=1); if (errore==1) printf("Non e' possibile inserire l'elemento perche' la tabella e' gia' piena.\n"); }
void visualizza() { int i; printf("\n\n"); for (i=0;i<dimensione;i++) printf("\t%s",tabella[i].id); printf("\n\n"); }
int main(int argc, char *argv[]) { azzera(); inserimento(); visualizza(); ricerca(); visualizza(); system("PAUSE"); return 0; }
Nella compilazione mi da un parse error at the end of input, cioè all'ultima riga dopo l'ultima }. Qualcuno sa dirmi dove ho sbagliato? Per la funzione hash ho utilizzato una funzione che mi converte i caratteri in interi e poi una volta sommati tutti i caratteri, viene calcolato il modulo. Un'altra cosa: ma nello switch posso considerare più condizioni per ogni case o devo specificare solo una condizione? Mi spiego meglio: io per ogni case ho considerato solo lettere minuscole, se volessi considerare anche le lettere maiuscole come dovrei fare?
|
| 3 U L T I M E R I S P O S T E (in alto le più recenti) |
| ohtar |
Inserito il - 08/07/2004 : 13:28:32 Lo so hai ragione. Ho letto la discussione sul system pause ma non ho fatto in tempo a correggere. Vedrò di allinearmi subito alla vostra lotta. Cmq ti ringrazio davvero per l'aiuto e la disponibiltà. |
| Iddqd |
Inserito il - 08/07/2004 : 11:56:46 Citazione: Messaggio inserito da ohtar
#define numeri 24 #define dimensione 29 #define salto 7
Vediamo vediamo... Allora le macro credo sia buona abitudine scriverle in maiuscolo...
Citazione:
#define null 0
E' un po' brutto fare una macro "null" che verrà confusa di sicuro con "NULL"...
Citazione:
int conv(char cod) { switch (cod) { case ('a'): return 10; break; case ('b'): return 11; break; case ('c'): return 12; break; ... ... ... case ('y'): return 34; break; case ('z'): return 35; break; }
Questo è il punto che fa innervosire il compilatore, c'è una "}" mancante. Ma è quasi sempre colpa di parentesi mancanti quando il compilatore se ne viene fuori con un errore all'ultima riga...
Citazione:
Un'altra cosa: ma nello switch posso considerare più condizioni per ogni case o devo specificare solo una condizione? Mi spiego meglio: io per ogni case ho considerato solo lettere minuscole, se volessi considerare anche le lettere maiuscole come dovrei fare?
Hai parecchie alternative... Le più condizioni nello switch le puoi fare così:
switch(charr) { case a: case A: printf("E' una splendida "a", minuscola o maiuscola"); break; case b: case B: printf("E' una splendida "b", minuscola o maiuscola"); break; ... ... }
Oppure più simpaticamente trasforma prima il carattere in minuscolo/maiuscolo con int toupper(char)/int tolower(char).
Citazione:
system("PAUSE");
NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO!!!!!!! Lo sapevo che non potevo fidarmi di te! Sei un bieco confratello della setta del system("Pause");!          Non avrei dovuto aiutarti!!!! Vai a leggere la discussione sul system("Pause"); e abbandona il lato oscuro della forza!!! |
| n/a |
Inserito il - 08/07/2004 : 11:55:02 senza indentatura non si capisce un caiser, comunque di solito i parse error at end of input significano in italiano: hai messo qualche graffa in più o in meno del previsto, quindi gli darei un'occhiatina più approfondita see you    |
|
|