#include <stdio.h>
#include <stdlib.h>
int menu();
int annoNuovo();
void InserisciStudente();
void StampaStudenti();
void EliminaStudente();
void CercaStudente();
void EsamiNonSostenuti();
void StatisticaEsami();
typedef struct struttura
{
char nome[20];
char cognome[20];
long int matricola ;
int analisi;
int programmazione ;
int algebra_e_geometria ;
int algoritmi_e_strutture_dati ;
int inglese ;
struct struttura *next ;
}studente;
typedef struct Struttura
{
int annoCorrente ;
int bocciati[5];
studente *primoStudente ; /* puntatore di testa al primo studente di ogni anno accademico */
struct Struttura *next ;
}anno ;
anno *T = NULL ;
int anniTot = 0 ; /* contatore degli anni */
int num_studenti = 0 ;/* Variabile contatore per contare il numero di studenti inseriti */
int AnnoAttuale = 0 ;
main()
{
printf("\n\n\n\n\n\n\n\n\t\tBENVENUTO NEL PROGRAMMA DI GESTIONE STUDENTI !");
getche();
system("cls");
annoNuovo(&T);
int k = 0 ;
do
{
k = menu(); /* Richiamo la funzione "menu", dalla quale poi accederò a tutte le altre sottofunzioni */
}while( k != 0 );/* Utilizzo il valore "0" per uscire dal programma */
return 0;
}
int menu()/* Funzione menu , dalla quale richiamo tutte le altre funzioni */
{
int n ;
system("cls");
printf("Anno Accademico %d\t\t\t\t Studenti nel Database : %d\n\n",T->annoCorrente,num_studenti);
printf("\t\tSOFTWARE DI GESTIONE ISCRITTI ALLA FACOLTA DI I.S.I\n\n");
printf("\t\t\t - MENU' PRINCIPALE -\n\n");
printf("1 - Aggiungi Studente.\n");
printf("2 - Visualizza TUTTI gli Studenti di ogni Anno.\n");
printf("3 - Elimina uno Studente.\n");
printf("4 - Ricerca Studente ( E relativi voti ).\n");
printf("5 - Visualizza la Situazione Esami dell'anno %d per ogni singolo Studente.\n", T->annoCorrente);
printf("6 - Visualizza la Statistica degli Esami non superati per ogni Anno Accademico.\n");
printf("7 - Nuovo Anno Accademico.\n");
printf("0 - Exit.\n");
printf("\nInserire il numero corrispondente alla scelta desiderata : ");
scanf("%d",&n);
while( n > 7 || n < 0 )/* Controllo su eventuali errori di input sulla scelta nel menu principale */
{
printf("Errore! VALORE NON CONSENTITO!\n");
printf("\nInserire il numero corrispondente alla scelta desiderata : ");
fflush(stdin);
scanf("%d",&n);
}
if ( n == 1 )
{
system("cls");
InserisciStudente( &T );
}
if ( n == 2 )
{
system("cls");
int scelta, k ;
if( num_studenti == 0 )
{
printf("\t\t NON CI SONO STUDENTI PRESENTI NEL DATABASE !\n\n");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta -->");
k = scanf("%d",&scelta);
while( k == 0 || scelta != 1 && scelta != 0 )
{
system("cls");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta-->");
fflush(stdin);
k = scanf("%d", &scelta);
}
if( scelta == 1 )
{
system("cls");
InserisciStudente( &T );
return;
}
else
{
system("cls");
return;
}
}
StampaStudenti( &T );
}
if ( n == 3 )
{
system("cls");
int scelta, k ;
if( num_studenti == 0 )
{
printf("\t\t NON CI SONO STUDENTI PRESENTI NEL DATABASE !\n\n");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta -->");
k = scanf("%d",&scelta);
while( k == 0 || scelta != 1 && scelta != 0 )
{
system("cls");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta-->");
fflush(stdin);
k = scanf("%d", &scelta);
}
if( scelta == 1 )
{
system("cls");
InserisciStudente( &T );
return;
}
else
{
system("cls");
return;
}
}
EliminaStudente( &T );
}
if ( n == 4 )
{
system("cls");
int scelta, k ;
if( num_studenti == 0 )
{
printf("\t\t NON CI SONO STUDENTI PRESENTI NEL DATABASE !\n\n");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta -->");
k = scanf("%d",&scelta);
while( k == 0 || scelta != 1 && scelta != 0 )
{
system("cls");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta-->");
fflush(stdin);
k = scanf("%d", &scelta);
}
if( scelta == 1 )
{
system("cls");
InserisciStudente( &T );
return;
}
else
{
system("cls");
return;
}
}
CercaStudente( &T );
}
if ( n == 5 )
{
system("cls");
int scelta, k ;
if( num_studenti == 0 )
{
printf("\t\t NON CI SONO STUDENTI PRESENTI NEL DATABASE !\n\n");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta -->");
k = scanf("%d",&scelta);
while( k == 0 || scelta != 1 && scelta != 0 )
{
system("cls");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta-->");
fflush(stdin);
k = scanf("%d", &scelta);
}
if( scelta == 1 )
{
system("cls");
InserisciStudente( &T );
return;
}
else
{
system("cls");
return;
}
}
EsamiNonSostenuti( &T );
}
if ( n == 6 )
{
system("cls");
int scelta, k ;
if( num_studenti == 0 )
{
printf("\t\t NON CI SONO STUDENTI PRESENTI NEL DATABASE !\n\n");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta -->");
k = scanf("%d",&scelta);
while( k == 0 || scelta != 1 && scelta != 0 )
{
system("cls");
printf("Premere 1 --> INSERISCI NUOVO STUDENTE\nPremere 0 --> TORNARE AL MENU' PRINCIPALE\nScelta-->");
fflush(stdin);
k = scanf("%d", &scelta);
}
if( scelta == 1 )
{
system("cls");
InserisciStudente( &T );
return;
}
else
{
system("cls");
return;
}
}
StatisticaEsami( &T ) ;
}
if ( n == 7 )
{
AnnoAttuale = annoNuovo(&T);
}
if ( n == 0 )
{
return 0;
}
}
int annoNuovo(anno **testa)/* funzione per andare avanti con gli anni scolastici */
{
system("cls");
int k ;
anno *nuovo ;
nuovo = (anno*)malloc(sizeof(anno));
nuovo->primoStudente = NULL ;
nuovo->next = *testa ;
*testa = nuovo ;
do
{
fflush(stdin);
printf("Inserire l'anno accademico sul quale si vuol lavoare( Dal 2000 al 2020 ) : ");
k = scanf("%d",&nuovo->annoCorrente);
if ( nuovo->annoCorrente < 2000 || nuovo->annoCorrente > 2020 || nuovo->annoCorrente <= AnnoAttuale )
{
printf("\n\nErrore di Input! Inserimento non valido!");
getche();
system("cls");
}
}while( k != 1 || nuovo->annoCorrente < 2000 || nuovo->annoCorrente > 2020 || nuovo->annoCorrente <= AnnoAttuale );
anniTot++ ;
system("cls");
return nuovo->annoCorrente;
}
void InserisciStudente(anno **testa)
{
system("cls");
int k ;
studente *Nuovo, *tmpS ;
anno *tmpA ;
tmpA = *testa ;
Nuovo = (studente*) malloc( sizeof(studente));
Nuovo->next = tmpA->primoStudente ;
tmpA->primoStudente = Nuovo ;
printf("Inserire il Nome dello Studente : ");
fflush(stdin);
gets(Nuovo->nome);
printf("Inserire il Cognome dello Studente : ");
fflush(stdin);
gets(Nuovo->cognome);
do
{
rifare:
printf("Numero di Matricola : ");
fflush(stdin);
k = scanf("%d", &Nuovo->matricola );
tmpA = *testa ;
while( tmpA != NULL )
{
if( tmpA->primoStudente != NULL )
{
tmpS = tmpA->primoStudente ;
while( tmpS != NULL )
{
tmpS->matricola;
if(tmpS->matricola == Nuovo->matricola && tmpS != Nuovo )
{
printf("Matricola gia' esistente!!!");
getche();
system("cls");
goto rifare;
}
tmpS = tmpS->next ;
}
}
tmpA = tmpA->next ;
}
}while( k == 0 || Nuovo->matricola < 0 || Nuovo->matricola > 1E6 );
printf("\nInserire ora i Voti dello Studente\n\n");
do
{
printf("Voto di Analisi : ");
fflush(stdin);
k = scanf("%d",&Nuovo->analisi);
}while( k == 0 || Nuovo->analisi < 0 || Nuovo->analisi > 30 );
do
{
printf("Voto di Programmazione : ");
fflush(stdin);
k = scanf("%d", &Nuovo->programmazione );
}while( k == 0 || Nuovo->programmazione < 0 || Nuovo->programmazione > 30 );
do
{
printf("Voto di Algebra e Geometria : ");
fflush(stdin);
k = scanf("%d", &Nuovo->algebra_e_geometria );
}while( k == 0 || Nuovo->algebra_e_geometria < 0 || Nuovo->algebra_e_geometria > 30 );
do
{
printf("Voto di Algoritmi e Strutture Dati : ");
fflush(stdin);
k = scanf("%d", &Nuovo->algoritmi_e_strutture_dati ) ;
}while( k == 0 || Nuovo->algoritmi_e_strutture_dati < 0 || Nuovo->algoritmi_e_strutture_dati > 30 );
do
{
printf("Voto di Inglese : ");
fflush(stdin);
k = scanf("%d", &Nuovo->inglese );
}while( k == 0 || Nuovo->inglese < 0 || Nuovo->inglese > 30 );
num_studenti++ ;
system("cls");
printf("\n\n\n\n\n\n\t\t\tSTUDENTE INSERITO CORRETTAMENTE");
getche();
}
void StampaStudenti( anno **testa )
{
studente *tmpS ;
anno *tmpA ;
int k, cont = 0 ;
tmpA = *testa ;
while( tmpA != NULL )
{
printf("\t\t\t\tANNO ACCADEMICO %d\n\n", tmpA->annoCorrente );
if( tmpA->primoStudente != NULL )
{
tmpS = tmpA->primoStudente ;
while( tmpS != NULL )
{
printf("Studente n.%d\n", ++cont);
printf("Nome : %s\n", tmpS->nome);
printf("Cognome : %s\n", tmpS->cognome);
printf("Matricola : %d\n",tmpS->matricola);
tmpS = tmpS->next ;
}
}
puts("");
tmpA = tmpA->next ;
}
printf("\n\n\t\t\t\t FINE STAMPA!");
getche();
system("cls");
}
void EliminaStudente( anno **testa )/* funzione per l'eliminazione di uno studente */
{
anno *tmpA ; /* puntatore alla struttura anno */
studente *tmpP/* puntatore al precedente*/, *tmpCanc/* tmp dello studente da eliminare */ , *tmpS /* tmp del successivo */ ;
int k, Cercato ;
do
{
printf("Inserire la matricola dello Studente da Eliminare : ");
fflush(stdin);
k = scanf("%d", &Cercato );
}while( k != 1 || Cercato < 0 || Cercato > 1E6 );
tmpP = NULL ;
tmpA = *testa ;
while( tmpA != NULL )/* scorro gli anni */
{
if( tmpA->primoStudente != NULL ) /* verifico che nell'anno in cui m trovo c siano studenti inseriti */
{
tmpS = tmpA->primoStudente ;
while( tmpS != NULL )/* scorro la lista studenti del tal anno fino alla fine */
{
if( Cercato == tmpS->matricola ) /* quando trovo la matricola cercata */
{
tmpCanc = tmpS ;
if ( tmpP == NULL ) /* nel caso l'elemento da eliminare sia in testa */
{
tmpA->primoStudente = tmpS->next ;
tmpS = tmpA->primoStudente ;
}
else
{
tmpP->next = tmpS->next ;
tmpS = tmpP->next ;
}
tmpCanc->next = NULL ;
free(tmpCanc);/* eliminazione dello studente */
system("cls");
num_studenti--;
printf("\t\t\t\tSTUDENTE ELIMINATO!");
return ;
}
else /* avanzo allo studente successivo nel caso non abbia trovato quello cercato */
{
tmpCanc = tmpP ;
tmpP = tmpP->next ;
}
tmpS = tmpS->next;
}
}
tmpA = tmpA->next ; /* avanzo la ricerca all'anno successivo */
}
}
void CercaStudente( anno **testa )/* funzione per la ricerca studente */
{
anno *tmpA ; /* puntatore alla struttura anno */
studente *tmpP/* puntatore al precedente*/, *tmpCanc/* tmp dello studente da eliminare */ , *tmpS /* tmp del successivo */ ;
int k, Cercato ;
do
{
printf("Inserire la matricola dello Studente da Cercare : ");
fflush(stdin);
k = scanf("%d", &Cercato );
}while( k != 1 || Cercato < 0 || Cercato > 1E6 );
tmpP = NULL ;
tmpA = *testa ;
while( tmpA->next != NULL )/* scorro gli anni */
{
if( tmpA->primoStudente != NULL ) /* verifico che nell'anno in cui m trovo c siano studenti inseriti */
{
tmpS = tmpA->primoStudente ;
while( tmpS != NULL )/* scorro la lista studenti del tal anno fino alla fine */
{
if( Cercato == tmpS->matricola ) /* quando trovo la matricola cercata */
{
system("cls");
printf("\t\t\tDATI RELATIVI ALLO STUDENTE CERCATO\n\n");
printf("Nome : %s\n",tmpS->nome);
printf("Cognome : %s\n",tmpS->cognome);
printf("Matricola : %d\n",tmpS->matricola);
printf("Voto Analisi : %d\n",tmpS->analisi);
printf("Voto Programmazione : %d\n",tmpS->programmazione);
printf("Voto Algebra e Geometria : %d\n",tmpS->algebra_e_geometria);
printf("Voto Algoritmi e Strutture dati : %d\n",tmpS->algoritmi_e_strutture_dati);
printf("Voto Inglese : %d",tmpS->inglese);
getche();
system("cls");
return;
}
else /* avanzo allo studente successivo nel caso non abbia trovato quello cercato */
{
tmpCanc = tmpP ;
tmpP = tmpP->next ;
}
tmpS = tmpS->next;
}
}
tmpA = tmpA->next ; /* avanzo la ricerca all'anno successivo */
}
if( tmpA->next == NULL )
{
printf("\n\n\n\n\n\n\t\tLO STUDENTE CERCATO NON E' PRESENTE NEL DATABASE!");
getche();
system("cls");
return;
}
}
void EsamiNonSostenuti( anno **testa )
{
anno *tmpA ;
studente *tmp ;
int ctrl ;
tmpA = *testa ;
while( ctrl != 1 )
{
tmp = tmpA->primoStudente ;
if( tmpA->primoStudente == NULL )
{
printf("\n\n\n\n\n\n\tNON SONO ANCORA STATI INSERITI STUDENTI IN QUESTI ANNO ACCADEMICO!");
getche();
return ;
}
while( tmp != NULL )
{
printf("Studente %s %s :\n\n",tmp->nome,tmp->cognome);
if( tmp->analisi < 18 )
printf("Non ha superato, o deve ancora sostenere, l'esame di ANALISI.\n");
if( tmp->programmazione < 18 )
printf("Non ha superato, o deve ancora sostenere, l'esame PROGRAMMAZIONE.\n");
if( tmp->algebra_e_geometria < 18 )
printf("Non ha superato, o deve ancora sostenere, l'esame di ALGEBRA E GEOMETRIA.\n");
if( tmp->algoritmi_e_strutture_dati < 18 )
printf("Non ha superato, o deve ancora sostenere, l'esame di ALGORITMI E STRUTTURE DATI.");
if( tmp->inglese < 18 )
printf("Non ha superato, o deve ancora sostenere, l'esame di INGLESE.\n\n");
if( tmp->algebra_e_geometria > 17 && tmp->algoritmi_e_strutture_dati > 17 && tmp->analisi > 17 && tmp->programmazione > 17 && tmp->inglese > 17)
printf("Ha superato con successo tutti gli esami!\n\n");
tmp = tmp->next;
}
ctrl = 1 ;
}
getche();
system("cls");
return ;
}
void StatisticaEsami(anno **testa)
{
anno *tmpA ;
studente *tmp ;
int Analisi, Programmazione, Algebra_Geometria, Algoritmi_StruttureDati, Inglese ,
controllo, ctrl = 0, materia = 0, posizione ;
printf("\t\tSTATISTICA ESAMI NON SOSTENUTI PER OGNI ANNO ACCADEMICO!\n\n");
tmpA = *testa ;
while( tmpA != NULL )
{
if( tmpA->primoStudente != NULL )
{
tmp = tmpA->primoStudente ;
/* contatori per ogni singola materia che prenderanno il valore del numero degli studenti che non hanno superato l'esame in questione*/
Analisi = 0 ;
Programmazione = 0 ;
Algebra_Geometria = 0 ;
Algoritmi_StruttureDati = 0 ;
Inglese = 0 ;
while( tmp != NULL )
{
if( tmp->analisi < 18 )
Analisi++ ;
if( tmp->programmazione < 18 )
Programmazione++ ;
if( tmp->algebra_e_geometria < 18 )
Algebra_Geometria++ ;
if( tmp->algoritmi_e_strutture_dati < 18 )
Algoritmi_StruttureDati++ ;
if( tmp->inglese < 18 )
Inglese++ ;
tmp = tmp->next ;
}
tmpA->bocciati[0] = Analisi ;
tmpA->bocciati[1] = Programmazione ;
tmpA->bocciati[2] = Algebra_Geometria ;
tmpA->bocciati[3] = Algoritmi_StruttureDati ;
tmpA->bocciati[4] = Inglese ;
materia = 0 ;
while( ctrl <= 4 )
{
controllo = tmpA->bocciati[ctrl];
materia++ ;
if( materia == 1 )
{
printf("Nell'anno %d :\n\n",tmpA->annoCorrente);
}
if( materia == 1)
printf("- %d studenti non hanno superato l'esame di ANALISI\n", controllo);
if( materia == 2)
printf("- %d studenti non hanno superato l'esame di PROGRAMMAZIONE\n", controllo);
if( materia == 3)
printf("- %d studenti non hanno superato l'esame di ALGEBRA E GEOMETRIA\n", controllo);
if( materia == 4)
printf("- %d studenti non hanno superato l'esame di ALGORITMI E STRUTTURE DATI\n", controllo);
if( materia == 5)
printf("- %d studenti non hanno superato l'esame di INGLESE", controllo);
ctrl++ ;
}
}
tmpA = tmpA->next ;
}
getche();
system("cls");
return ;
}
Ho una domanda,se qualcuno di buon cuore ne ha voglia,visto che l'esercizio in questione è abbastanza lungo, vorrei sapere come mai l'ultima funzione "StatisticaEsami", non mi stampa le statistiche per tutti gli anni accademici ma solamente per l'ultimo anno inserito !!! Questo programma simula un programma d gestione studenti,e l'ultima funzione ha il compito di stampare a video quanti studenti per ogni anno accademico inserito nel programma, non hanno superato un determinato esame( sono 5 le materie )...se qualcuno vede l'errore glie ne sarei piu che grato...io ormai non ci vedo piu...