Ecco il codice:
codice:
#include <stdio.h>
#include <string.h>
#define MAXELE 30
#define DIM 31
#define MENU 0
#define INS 1
#define CAN 2
#define RIC 3
#define VIS 4
#define OUT 100
/* Semplice struttura che modella una persona */
struct per {
char cognome[DIM]; /* La dimensione l'abbiamo dichiarata all'inizio con #define DIM 31 */
char nome[DIM];
char ind[DIM];
int eta;
};
/* Vettore persone */
struct per anag[MAXELE]; /* Dovrebbe stabilire il numero massimo di elementi e quindi persone */
/* Numero elementi allocati nel vettore anag */
int index = 0;
int menPer(void);
int insPer(int);
struct per * cerPer(char *,char *, int); /* Capita la funzione, perchè mette *? */
void eliPer(struct per *); /* eliPer si riferisce ad una strutta, perchè deve eliminare tutto */
void canPer(void); /* Questa funzione invece la definiamo noi dopo */
void ricPer(void); /* Questa funzione invece la definiamo noi dopo */
void visPer(struct per *); /* visPer si riferisce ad una strutta, perchè deve eliminare tutto */
void visAnagrafe(void);
/* Presenta il menu e lancia la funzione a scelta */
int main()
{
int scelta = MENU;
while(scelta!=OUT){
switch(scelta){
case MENU:
scelta = menPer();
if(scelta == MENU)
scelta = OUT;
break;
case INS:
index = insPer(index);
scelta = MENU;
break;
case CAN:
canPer();
scelta = MENU;
break;
case RIC:
ricPer();
scelta = MENU;
break;
case VIS:
visAnagrafe();
scelta = MENU;
break;
}
}
}
/* MENU */
int menPer(void)
{
int scelta;
char invio;
int vero = 1;
while(vero){
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("\t\t\t ANAGRAFE");
printf("\n\n\n\t\t\t 1. Immissione Persona");
printf("\n\n\n\t\t\t 2. Cancellazione Persona");
printf("\n\n\n\t\t\t 3. Ricerca Persona");
printf("\n\n\n\t\t\t 4. Visualizza Anagrafe");
printf("\n\n\n\t\t\t 0. Fine");
printf("\n\n\n\t\t\t\t\t. Scegliere una opzione: ");
scanf("%d", &scelta);
scanf("%c", &invio);
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
switch(scelta){
case 0:
case 1:
case 2:
case 3:
case 4:
return(scelta);
default:
break;
}
}
return(0);
}
/* Inserisce persona nell'anagrafe */
int insPer(int pos)
{
char invio;
if(pos>=MAXELE){
printf(" Non si possono inserire altri nomi ");
scanf("%c",&invio);
return(pos);
}
printf("\n\tINSERIMENTO PERSONA"); /* Da dove e' uscito fuori pos? */
printf("\n\t\t------------\n\n");
printf("\nCognome: ");
gets(anag[pos].cognome);
printf("\nNome: ");
gets(anag[pos].nome);
printf("\nIndirizzo: ");
gets(anag[pos].ind);
printf("\nEta':");
scanf("%d", &anag[pos].eta);
scanf("%c", &invio);
pos++;
return(pos);
}
/* Cancella persona dall'anagrafe, se presente */
void canPer(void)
{
char pausa;
char cognome[DIM], nome[DIM];
int eta;
struct per *ps; /* Utilizza un puntatore */
printf("\n\t\t CANCELLA PERSONA");
printf("\n\t\t------\n\n");
printf("\nCognome:");
gets(cognome); /* Perchè qua non compare anag[pos] ? */
printf("\nNome: ");
gets(nome);
printf("\nEta':");
scanf("%d",&eta);
scanf("%c",&pausa);
/* Invoca ricerca persona */
ps = cerPer(cognome, nome, eta);
if(ps == NULL){
printf("\nPersona non presente in anagrafe");
scanf("%c",&pausa);
return; /* A cosa serve questo return e perchè lo usa spesso? */
}
/* Invoca visualizza persona */
visPer(ps);
printf("\nConfermi cancellazione? (S/N)");
scanf("%c", &pausa);
if(pausa=='S' || pausa=='s'){
eliPer(ps);
return;
}
}
/* Elimina persona dall'anagrafe */
void eliPer(struct per *p)
{
strcpy(p->cognome, "");
strcpy(p->nome, "");
strcpy(p->ind, "");
p->eta = 0;
}
/* Ricerca persona se presente nell'anagrafe */
void ricPer(void)
{
char pausa;
char cognome[DIM], nome[DIM];
int eta;
struct per *ps;
/* Inserimento dati persona da ricercare */
printf("\n\t RICERCA PERSONA");
printf("\n\t\t-------\n\n");
printf("\nCognome:");
gets(cognome);
printf("\nNome:");
gets(nome);
printf("\nEta':");
scanf("%d",&eta);
scanf("%c",&pausa);
/* Invoca la funzione di scansione sequenziale */
ps = cerPer(cognome, nome, eta);
if(ps == NULL){
printf("\nPersona non presente in anagrafe");
scanf("%c", &pausa);
return;
}
visPer(ps);
scanf("%c", &pausa);
}
/* Scansione sequenziale del vettore anag alla ricerca di una persona che abbia determinati cognome, nome ed età */
struct per *cerPer(char *cg,char *nm,int et)
{
int i;
for (i=0; i<=index; i++){
if(strcmp(cg, anag[i].cognome) == 0)
if(strcmp(nm, anag[i].nome) == 0)
if(et == anag[i].eta)
return(&anag[i]);
}
return(NULL);
}
/* Visualizza persona */
void visPer(struct per *p)
{
printf("\n\n------------------\n");
printf("\n\t\tCognome: %s", p->cognome);
printf("\n\t\tNome: %s", p->nome);
printf("\n\t\tIndirizzo: %s", p->ind);
printf("\n\t\tEta': %d", p->eta);
printf("\n\n------------------\n");
}
/* Visualizza l'anagrafe completa */
void visAnagrafe(void)
{
int i; char pausa;
struct per *ps = &anag[0];
for(i=0; i<index; i++){
visPer(ps++);
scanf("%c",&pausa);
}
}