Pagina 1 di 1

Gestione archivio studenti C

Inviato: domenica 13 aprile 2014, 21:42
da HalEmK
Salve a tutti, mi trovo davanti un piccolo programma per la gestione di un archivio di studenti. Il testo è il seguente:

"Realizzare un breve programma applicativo che utilizza un vettore di record TStudente, destinato a conservare i dati anagrafici relativi agli studenti di una certa scuola. I campi dei record TStudente devono contenere il nome e il cognome dello studente, la classe di appartenenza, il luogo di nascita, il giorno, il mese e l'anno di nascita.

Il programma deve consentire di caricare e visualizzare i dati di N studenti (N deciso dall'utente, max 1000) in un archivio, attraverso apposite funzioni.

Il programma deve poter individuare, attraverso due apposite funzioni, lo studente più giovane e quello più anziano della scuola.
Il programma deve consentire, attraverso una apposita funzione, la ricerca di un certo studente presente nell'elenco, a partire dal suo nominativo.
Il programma deve consentire, attraverso una apposita funzione, la ricerca di un certo studente presente nell'elenco, a partire dalla sua data di nascita.
Il programma deve consentire, attraverso una apposita funzione, la selezione dell'elenco di tutti gli studenti appartenenti a una certa classe."

Io ho fatto praticamente tutto il programma(ovviamente da correggere qualcosa) ma mi trovo davanti a questa problematica:

Il codice è il seguente:

Codice: Seleziona tutto

#include <stdio.h>
#include <string.h>

// costanti 

#define MAXSTU 1000 // numero max di studenti ammissibile
#define STR 30	    // lunghezza stringa 

//struttura 
typedef struct {
	char nome[STR+1];
	char cognome[STR+1];
	char classe[STR+1];
	char luogonasc[STR+1];
	int g,m,a; // giorno,mese,anno
	
}Tstudente; 

//prototipi 
void acquisisci(int *numeff,int max,int min, const char frase[]);
void carica(Tstudente stud[],int numeff);

void ricercanom(Tstudente ve[],int numeff,int str);
void ricercaclass(Tstudente ve[],int numeff,int str);
void ricercadat(Tstudente ve[],int numeff);
 void visualizza(Tstudente ve[],int numeff);

// main

int main()
{
	int neff; // numero effettivo studenti
	Tstudente ve[MAXSTU];


	acquisisci(&neff,MAXSTU,0,"Inserisci numero alunni da caricare dentro l'archivio: ");
	carica(ve,neff);
	selezione(ve,neff);
	//ricercanom(ve,neff,STR); // funzione che ricerca per nominativo
	//ricercaclass(ve,neff,STR); //funzione che ricerca per classe 
	ricercadat(ve,neff); //funzione che ricerca per data di nascita
	//ricercagiovanz(ve,neff);  studente più giovane e studente più anziano
	//visualizza(ve,neff);

	return 0;
}
//acquisizione del numero effettivo
void acquisisci(int *numeff,int max,int min, const char frase[])
{
	int app;

	printf("%s",frase);
	scanf("%d",&app);

	while((app > max)||(app < min))
		{
			printf("Errore, inserisci un numero compreso tra %d e %d: ",min,max);	
			scanf("%d",&app);
			}

	*numeff=app;
}

// caricamento dell'archivio

void carica(Tstudente stud[],int numeff)
{
	int j;
	
	for(j=0;j<numeff;j++){
	
	printf("Inserisci nome: ");
	scanf("%s",stud[j].nome);
	
	printf("Inserisci cognome: ");
	scanf("%s",stud[j].cognome);
	
	printf("Inserisci classe: ");
	scanf("%s",stud[j].classe);

	printf("Inserisci luogo di nascita: ");
	scanf("%s",stud[j].luogonasc);

	printf("Inserisci giorno: ");
	scanf("%d",&stud[j].g);

	printf("Inserisci mese: ");
	scanf("%d",&stud[j].m);

	printf("\nInserisci anno: "); 
	scanf("%d",&stud[j].a);

}

}

void selezione()
{
	char c;
	printf("Seleziona: \n 1) Se vuoi ricercare il nome di uno studente: \n2)Se vuoi ricercare uno studente in base alla data di nascita: \n 3)Se vuoi ricercare uno studente per anzianità: \n4)Se vuoi ricercare uno studente per classe di appartenenza: ");
	scanf("%c",&c);
	
	if(c==1)
	ricercanom();
	else if(c==2)
		ricercadat();
	else if(c==3)
		ricercagiovanz();
	else if(c==4)
		ricercaclass();

}
void ricercanom(Tstudente ve[],int numeff,int str)
{
	//variabili di appoggio per nome e cognome 

	char n[str+1];
	char c[str+1];
	int j=0; //indice


	printf("Inserisci nome da ricercare all'interno dell'archivio: ");
	scanf("%s",n);
	
	printf("Inserisci cognome da ricercare all'interno dell'archivio: ");
	scanf("%s",c);
	
	while(j<numeff)
	{
		//comparo le due stringhe / == 0 stringhe identiche 

		strcmp(n,ve[j].nome);
		strcmp(c,ve[j].cognome);

		if((strcmp(n,ve[j].nome)==0) && (strcmp(c,ve[j].cognome)==0))  // stringhe identiche 
			{
			//stampo nome e cognome

			printf("\nNome: %s",ve[j].nome);
			printf("\nCognome: %s",ve[j].cognome);
			
			printf("\n\n"); 
			}
			// se non ha trovato nessuna corrispondenza

			else   {
				printf("Nessun elemento corrisponde ai criteri richiesti");
				}
			
	j++;
	
		

	}
			
	}
void ricercaclass(Tstudente ve[],int numeff,int str)
{
	
	int j=0;
	char class[str+1];
	
	printf("Inserisci classe da ricercare: ");
	scanf("%s",class);

	while(j<numeff)
	{
		strcmp(class,ve[j].classe);
		
		if(strcmp(class,ve[j].classe)==0){
			printf("\nNome: %s",ve[j].nome);
			printf("\nCognome: %s",ve[j].cognome);
			}
		j++;
}
}

void ricercadat(Tstudente ve[],int numeff)
{
	int j;
	int appg,appm,appa;

	printf("Inserisci giorno da ricercare: ");
	scanf("%d",&appg);
	
	printf("Inserisci mese da ricercare: ");
	scanf("%d",&appm);

	printf("Inserisci anno da ricercare: ");
	scanf("%d",&appa);

	for(j=0;j<numeff;j++)
	{
		if((appg==ve[j].g)&&(appm==ve[j].m)&&(appa==ve[j].a))
		{
			printf("\nNome: %s",ve[j].nome);
			printf("\nCognome: %s",ve[j].cognome);
			}
		else{
			printf("Nessun elemento corrisponde ai criteri richiesti");
			}
}
		
		
	}

void visualizza(Tstudente ve[],int numeff)
{
	int j;
	for(j=0;j<numeff;j++)
	{
		printf("\nNome: %s",ve[j].nome);
		printf("\nCognome: %s",ve[j].cognome);
		printf("\nClasse: %s",ve[j].classe);
		printf("\nLuogo di nascita: %s",ve[j].luogonasc);
		printf("\nGiorno: %d",ve[j].g);
		printf("\nMese: %d",ve[j].m);
		printf("\nAnno: %d",ve[j].a);

	}
}
Osservate la funzione che ho scritto "selezione" che deve poter far scegliere all'utente un opzione che poi andrà a richiamare una determinata funzione. Cercando su Internet non ho trovato nulla. Qual'è la logica per fare un "selettore" di opzioni? Come richiamo una funzione dentro un'altra funzione? Compilandolo mi dice che le funzioni da me richiamate dentro "selezione" necessitano di più parametri.

Grazie in anticipo

Andrea

Re: Gestione archivio studenti C

Inviato: domenica 13 aprile 2014, 21:58
da ixamit
HalEmK ha scritto: Osservate la funzione che ho scritto "selezione" che deve poter far scegliere all'utente un opzione che poi andrà a richiamare una determinata funzione. Cercando su Internet non ho trovato nulla. Qual'è la logica per fare un "selettore" di opzioni? Come richiamo una funzione dentro un'altra funzione? Compilandolo mi dice che le funzioni da me richiamate dentro "selezione" necessitano di più parametri.
Potresti fare la funzione di selezione che presenta il menu' di scelte, accetta l'input e lo restituisce al chiamante (il main nel tuo caso)
. Quest'ultimo si limita ad una swicth/case con le varie chiamate .

Re: Gestione archivio studenti C

Inviato: domenica 13 aprile 2014, 22:02
da HalEmK
[/quote] accetta l'input e lo restituisce al chiamante (il main nel tuo caso)
[/quote]

Ciao!Grazie per aver risposto. Questo non mi è chiaro. Cosa intendi?


Andrea

Re: Gestione archivio studenti C

Inviato: domenica 13 aprile 2014, 22:08
da ixamit
intendo che la tua funzione selezione deve fare una return c ed il chiamante deve fare una switch/case alle varie funzioni

EDIT esempio:

Codice: Seleziona tutto

#include <stdio.h>

char selezione ()
{
    char c;
    do {
        puts ("1) per FUNZ1\n2) per FUNZ2\n3) per FUNZ3\n");
        scanf ("%c",&c);
    } while (c < '1' || c > '3');
    return c;
}
int main ()
{
    char c;

    c = selezione ();
    switch (c) {
        case '1':
            puts ("FUNZ1");
            break;
        case '2':
            puts ("FUNZ2");
            break;
        case '3':
            puts ("FUNZ3");
            break;
    }

    return 0;        
}

Re: Gestione archivio studenti C

Inviato: lunedì 14 aprile 2014, 14:36
da HalEmK
Ok ora ho capito! Un'altra cosa se posso, ho scritto la funzione che deve ricercare lo studente più giovane.

Codice: Seleziona tutto

void ricercagiovane(Tstudente ve[],int numeff)
{
	int appa=ve[0].a;
	//int appm=ve[0].m;
	//int appg=ve[0].g;
	
	int j=0;
	while(j<numeff)
	{
		if(appa < appa[j+1].a){
		printf("Nome: %s \n Cognome: %s\n",ve[j].a);
		
		else if(appa > appa[j+1].a)
		printf("Nome: %s \n Cognome: %s\n", ve[j].a);
		j++;
}
Ora sto lavorando solo sull'anno, successivamente lavorerò anche sul giorno e sul mese nel caso l'anno sia uguale. Mi chiedevo, la logica che ho seguito è giusta?

Grazie

Andrea

Re: Gestione archivio studenti C

Inviato: lunedì 14 aprile 2014, 18:33
da ixamit
HalEmK [url=http://forum.ubuntu-it.org/viewtopic.php?p=4563004#p4563004][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Ok ora ho capito! Un'altra cosa se posso, ho scritto la funzione che deve ricercare lo studente più giovane.

Codice: Seleziona tutto

void ricercagiovane(Tstudente ve[],int numeff)
{
	int appa=ve[0].a;
	//int appm=ve[0].m;
	//int appg=ve[0].g;
	
	int j=0;
	while(j<numeff)
	{
		if(appa < appa[j+1].a){
		printf("Nome: %s \n Cognome: %s\n",ve[j].a);
		
		else if(appa > appa[j+1].a)
		printf("Nome: %s \n Cognome: %s\n", ve[j].a);
		j++;
}
Ora sto lavorando solo sull'anno, successivamente lavorerò anche sul giorno e sul mese nel caso l'anno sia uguale. Mi chiedevo, la logica che ho seguito è giusta?

Grazie

Andrea
Dovresti iterare su tutto l'array salvando l'indice con valore minore. A fine ciclo mostrare a video il piu' giovane per anno.
Non mi sembra che vada bene...

Supponi di avere 3 numeri 4,3,5.:
inizio -> minimo = 4
elaborazione -> 3 < minimo? SI -> minimo=3
elaborazione-> 5 < minimo? NO
fine -> minimo = 3

Re: Gestione archivio studenti C

Inviato: lunedì 14 aprile 2014, 21:43
da HalEmK
OK! Penso di aver capito. Ho provato a buttarci giù qualcosa

Codice: Seleziona tutto

void ricercagiovane(Tstudente ve[],int numeff)
{
   int appa=ve[0].a; // variabile per il confronto--parte dal primo elemento
   //int appm=ve[0].m;
   //int appg=ve[0].g;
   int indice=0; // conterrà l'indice dello studente più giovane

   int j=1;
   while(j<numeff)
   {
      if(appa < appa[j].a){  // errore
      appa=appa[j];
	indice=j;
      
      
      j++;
}
	

}
Il printf per stampare i campi di nome e cognome relativi all'indice dove lo piazzo?

Re: Gestione archivio studenti C

Inviato: lunedì 14 aprile 2014, 22:49
da ixamit
dovresti indentare meglio il codice per vedere l'errore...
se puo' aiutarti prendi carta e penna e segui i vari step della tua funzione.
non voglio toglierti il gusto di farlo..:)