Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    2

    Programmazione C: ricerca e cancellazione di strutture

    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

    codice:
    //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);
    	}
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Originariamente inviato da oregon
    Devi usare i tag CODE quando invii un codice
    inserito
    saluti

  4. #4
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    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:
    codice:
    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!!
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2010
    Messaggi
    2
    grazie mille.. forse errore dovuto a copia incolla..!

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

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.