Código C:
Ver original
#include <stdlib.h> #include <stdio.h> #include <string.h> struct client{ char nom[10]; char cognom[30]; char adreca[30]; int dia; int mes; int any; long int next; /* Punter al seguent registre */ }; main(){ int op, i; /* Operacio del menu a excutar */ void crear(); /* Modul de creacio del fitxer */ void escriu(); /* Modul que escriu nous registres al fitxer*/ void cerca(); /* Modul per a cercar clients en el fitxer */ int n=12; int ordenar(); struct client *c; /* Variable per a llegir les dades */ do{ /* Bucle del programa principal, segons valor de op */ do{ }while( (op < 1) && (op > 5) ); switch(op){ case 1: {crear(); break;} case 2: { escriu(); break;} case 3: {cerca(); break;} case 4: { /*for(i=1; i <= n; i++) printf("%s\t%s\n", (c+i)->nom, (c+i)->cognom);*/ break;} } }while(op != 5); } /* fi main */ int ordenar(); void crear() { int i; /* Control de bucle */ char f; /* Indica la fi del bucle de entrada de dades */ struct client c; /* Variable per a llegir les dades */ FILE *pf; /* Punter al fitxer a crear */ void escriu();/* Llegeix els nous registres al fitxer */ /* Creacio del fitxer */ } /* Escriptura dels registre primaris amb valors buits */ c.nom[0]='b';/* Valor inicial del nom, sera buit el registre */ //} c.nom[1]='u'; //}} c.nom[2]='i'; //}}}}esto es igual strcpy(c.nom,"buit"); c.nom[3]='t'; //}}} c.nom[4]='\0'; //}} c.next=-1; //} for (i=1; i<=12; i++){ /* Crea buits els registres primaris */ } do{ escriu(); }while((f != 'n') && (f != 'N')); } /* Fi de crear */ void hueco(FILE *p, /* Punter al fitxer persona*/ int x, /* Resultat del hash */ struct client y /* Dades del nou registre */ ){ int j; /* Per a veure si el registre triat pel hash es buit */ long int k,m; /* Guarda a posicio de l'ultim registre de la llista */ struct client c1; /* Valors dels registre anteriors al nou */ char buit[5]; buit[0]='b'; buit[1]='u'; buit[2]='i'; buit[3]='t'; buit[4]='\0'; if (j == 0) /* Registre buit */ { } else { /* El registre primari no es buit */ /* Ha de buscar l'ultim de la cadena */ while(c1.next != -1){ /* Situa el punter al seguent de la llista */ si es l'ultim */ /* LLegeix el registre */ } /* Guardar el nou registre */ fitxer per guardar el nou registre */ llista */ /* A d'assignar la posicio del l'ultim a seu predecessor */ c1.next=m; /* Posicio del registre predecessor per a sobrescriure'l */ } } void cerca(){ struct client c1; /* Llegeix el registres fins trobar el que volem */ int x; /* Resultat del hash */ char n[30]; /* Nom del client a cerca */ int d,m,a; /* Data de neiximent del client a cerca */ int j; /* Resultat de comparar les cadenes de noms de clinets */ FILE *pf; /* Punter al fitxer */ char f; /* Permet aturar el programa al mostrar les dades */ void leelin(); /* Llegix cadenes amb espais en blanc dintre */ int fhash(); /* Modul que calcula la funcio hash aplidar */ } leelin(&n,29); x=fhash(d,m,a); /* Calcula el hash */ do{ if(j == 0) {/* Trobat */ } }while ((c1.next != -1) && (j != 0 )); if (j != 0){ } } /* fi de cerca */ int fhash(int day, int month, int year){ /* Calcula el hash en funcio de la data de neiximent */ int res; /* Resultat del hash */ res=(day + month + year) % 12; /* Formula del hash */ return(res); /* Torna al modul cridant el resultat del hash */ } /* Fi de fhash */ void escriu(){/*Modul que llegeix els nous registres i crida a hueco*/ struct client c; /* Variable per a llegir les dades */ FILE *pf; /* Punter al fitxer a personacrear */ int i; /* Pren el valor tornat per la funcio fhash */ int fhash(); /* Modul que calcula la funcio hash aplidar */ void leelin(); /* Llegix cadenes amb espais en blanc dintre */ void hueco(); /* Escriu el nou registre al fitxer */ } leelin(&c.nom,9); leelin(&c.cognom,29); leelin(&c.adreca,29); c.next=-1; /* No apunta a cap registre,es l'ultim*/ i=fhash(c.dia,c.mes,c.any); /*Calcula el hash*/ hueco(pf,i,c); /* Modul que escriu al fitxer els nous registres */ } /* Fi de escriu */ void leelin(char *linia,int lon){ /* Funcio que llegeix linies amb qualsevol caracter menys el LF, caracter 10 taula ASCII de 7 bits */ /* Permet llegir linies amb espais en blanc */ int i; /* Caracter d'entrada com a sencers */ int j; /* Comtador del nombre de caracters llegits */ j=0; do{ /*Filtrat de LF o blancs inicials */ } while((i==10) || (i==32)); *(linia+j)=i; /* Assigna el 1er caracter llegit */ j++; /* S'incrementa despres de llegir el 1er caracter */ while((i!=10) && (j<=lon)){ /* Fins llegir el caracter LF o superar la longitud del vector */ if((i!=10) && (j <= lon)) *(linia+j)=i; /* Assigna el caracters llegits */ else *(linia+j)='\0'; /* Marca la fi de la cadena */ j++; /* Incrementa el comptador de caracters llegits */ } } /* fi de leelin */ int ordenar(struct client *c1, struct client *c2){ }
Cuando le doy a la opción de ordenar me da fallo de segmentación, ¿por qué?