PDA

Visualizza la versione completa : [C] Ricerca e cancellazione di strutture


bodale
27-04-2010, 18:29
ciao a tutti per fare un'esercizio di programmazione per l'esame di informatica 2 ho provato a fare una specie di anagrafe con menù.. il compilatore non mi da errori però quando vado ad eseguire il programma, mi fa immettere i dati degli utenti ma quando eseguo la ricerca e/o cancellazione di un utente, mi dice sempre "non presente in anagrafe".. potete dare uno sguardo al codice e dirmi dove sbaglio?!

grazie in anticipo



//Capitolo 14 - Esercizio 3

// Scrivere un programma che offra tramite menu le funzioni di inserimento,
// ricerca e cancellazione di un archivio studenti

//GESTIONE ANAGRAFICA

#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 dat {
int giorno;
int mese;
int anno;
};
typedef struct dat Data;
struct student {
char cogStud[80];
char nomStud[80];
char indStud[80];
int eta;
Data datNasc;
};

//Vettore persone
struct student anag[MAXELE];

//Numero elementi allocati nel vettore anag
int index = 0;

//funzioni esterne al main
int menPer(void);
int insPer(int);
struct student * cerPer(char *, char *, int);
void eliPer(struct student *);
void canPer(void);
void ricPer(void);
void visPer(struct student *);
void visAnagrafe(void);

//Presenta il menu' e lancia la funzione scelta
int main(void)
{
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");
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. Visualizzazione Anagrafe");
printf("\n\n\n\t\t\t 0. Fine");
printf("\n\n\n\t\t\t\t Scegliere un'opzione: ");
scanf("%d", &scelta);
scanf("%c", &invio);
printf("\n\n\n\n\n\n\n\n\n");

switch (scelta)
{
case 0:
case 1:
case 2:
case 3:
case 4:
return (scelta);
break;
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\t\tINSERIMENTO PERSONA");
printf("\n\t\t-------------------------------------------");
printf("\nCognome : ");
gets(anag[pos].cogStud);
printf("\nNome : ");
gets(anag[pos].nomStud);
printf("\nIndirizzo : ");
gets(anag[pos].indStud);
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 student *ps;

printf("\n\t\tCANCELLA PERSONA");
printf("\n\t\t-------------------------------------");
printf("\nCognome : ");
gets(cognome);
printf("\nNome : ");
gets(nome);
printf("Eta' : ");
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;
}
//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 student *p)
{
strcpy(p->cogStud, "");
strcpy(p->nomStud, "");
strcpy(p->indStud, "");
p->eta = 0;
}

//Ricerca persona se presente nell'anagrafe
void ricPer(void)
{
char pausa;
char cognome[DIM], nome[DIM];
int eta;
struct student *ps;

printf("\n\t\tRICERCA PERSONA");
printf("\n\t\t-------------------------------------");
printf("\nCognome : ");
gets(cognome);
printf("\nNome : ");
gets(nome);
printf("Eta' : ");
scanf("%d", &eta);
scanf("%c", &pausa);

//Invoca la funzione di ricerca 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 eta'
struct student *cerPer(char *cg, char *nm, int et)
{
int i;
for(i=0; i<=index; i++)
{
if (strcmp(cg, anag[i].cogStud) == 0)
if (strcmp(nm, anag[i].nomStud) == 0)
if ((et == anag[i].eta) == 0)
return (&anag[i]);
}
return(NULL);
}

//Visualizza persona
void visPer(struct student *p)
{
printf("\n\n-------------------------------------------------");
printf("\n\t\tCognome : %s", p->cogStud);
printf("\n\t\tNome : %s", p->nomStud);
printf("\n\t\tIndirizzo : %s", p->indStud);
printf("\n\t\tEta' : %d", p->eta);
printf("\n\n-------------------------------------------------");
}

//Visualizza l'anagrafe completa
void visAnagrafe(void)
{
int i;
char pausa;
struct student *ps = &anag[0];
for (i=0; i<index; i++)
{
visPer(ps++);
scanf("%c", &pausa);
}
}

oregon
27-04-2010, 18:59
Devi usare i tag CODE quando invii un codice, altrimenti non si capirà nulla.

Dato che utilizzi il forum per la prima volta, leggine il regolamento ...

rebelia
28-04-2010, 14:52
Originariamente inviato da oregon
Devi usare i tag CODE quando invii un codice

inserito
saluti

MrX87
30-04-2010, 00:42
Ehi...ho dato uno sguardo al codice...e pensi sia stato solo un errore di distrazione, o dovuto al copia e incolla, perhcè bastava andare a guardare nella funzione cerPer()! ti posto qua sotto solo la funzione con evidenziato la piccola correzione apportata:


struct student *cerPer(char *cg, char *nm, int et)
{
int i;
for(i=0; i<=index2; i++)
{
if (strcmp(cg, anag[i].cogStud) == 0)
if (strcmp(nm, anag[i].nomStud) == 0)
if ( et == anag[i].eta )
return (&anag[i]);
}
return(NULL);
}
avevo messo un altro == che nn serviva a niente quando controlli le età!
Per adesso la persona la trova nell'anagrafe...se c'è qualche altra cosa che non va...fammi sapere, ciao!!

bodale
05-05-2010, 16:30
grazie mille.. forse errore dovuto a copia incolla..!

son contento che cmq il codice è giusto, ho solo fatto qualche errore di distrazione!

Loading