#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct Etudiant
{
int mat;
char nom[41];
char prenom[41];
int niv;
float moy;
char dec;
};
int main()
{
void trquit(char*);
void quit(char*);
void creation(void);
void lecture(void);
void ajout(void);
void recherche(int);
void modif(int);
void suppr(void);
int c;
char rep;
do
{
system("cls");
printf("Que voulez-vous faire?\n\n1- Creer une nouvelle liste d'etudiants.(Attention! Cela supprimera les donnees precedement enregistree)\n2- Afficher la liste d'etudiants.\n3- Ajouter un nouvel etudiant.\n4- Afficher les donnees d'un etudiant.\n5- Modifier un etudiant.\n6- Supprimer un etudiant.\n7- Quitter.\n\n");
scanf("%d",&c);
Restart:
switch(c)
{
case 1:
system("cls");
creation();
quit(&rep);
break;
case 2:
system("cls");
lecture();
quit(&rep);
break;
case 3:
system("cls");
ajout();
quit(&rep);
break;
case 4:
system("cls");
printf("Entrer la matricule de l'etudiant recherche: ");
scanf("%d",&c);
recherche(c);
quit(&rep);
break;
case 5:
system("cls");
printf("Entrer la matricule de l'etudiant dont vous voulez modifier les donnees: ");
scanf("%d",&c);
modif(c);
quit(&rep);
break;
case 6:
system("cls");
suppr();
quit(&rep);
break;
case 7:
return 0;
default:
printf("Vous avez entrer une valeur inexistante dans le menu. Veuillez reessayer: ");
scanf("%d",&c);
goto Restart;
}
}while(rep=='o' || rep=='O');
return 0;
}
void trquit(char *rep)
{
Start:
fflush(stdin);
*rep=getchar();
if(*rep!='n' && *rep!='N' && *rep!='o' && *rep!='O')
{
printf("Vous avez entre un caractere different de O et N. Veuillez reessayer: ");
goto Start;
}
}
void quit(char *rep)
{
printf("\n\nVoulez-vous effectuer une nouvelle operation? (O/N): ");
trquit(rep);
}
void creation(void)
{
FILE *F;
struct Etudiant Etud;
char rep;
F=fopen("Etudiant.dat","wb");
if(F==NULL)
{
printf("Creation de la liste impossible.");
getch();
exit(-1);
}
do
{
printf("\n\tMatricule: ");
scanf("%d",&Etud.mat);
printf("\tNom: ");
fflush(stdin);
gets(Etud.nom);
printf("\tPrenom: ");
fflush(stdin);
gets(Etud.prenom);
printf("\tNiveau: ");
scanf("%d",&Etud.niv);
printf("\tMoyenne: ");
scanf("%f",&Etud.moy);
printf("\tDecision: ");
fflush(stdin);
Etud.dec=getchar();
fwrite(&Etud,sizeof(Etud),1,F);
printf("Voulez-vous ajouter un nouvel etudiant? (O/N): ");
trquit(&rep);
}while(rep=='o' || rep=='O');
fclose(F);
}
void lecture(void)
{
FILE *F;
struct Etudiant Etud;
int i=0;
F=fopen("Etudiant.dat","rb");
if(F=NULL)
{
printf("Ouverture impossible du fichier de donnees.");
getch();
}
else
{
while(fread(&Etud,sizeof(Etud),1,F))
{
i++;
printf("Etudiant %d:\n\tMarticule: %d\n\tNom: %s\n\tPrenom: %s\n\tNiveau: %d\n\tMoyenne: %f\n\tDecision: %c.\n\n",i,Etud.mat,Etud.nom,Etud.prenom,Etud.niv,Etud.moy,Etud.dec);
}
fclose(F);
}
}
void ajout(void)
{
FILE *F;
struct Etudiant Etud;
F=fopen("Etudiant.dat","ab");
if(F==NULL)
{
printf("Ouverture impossible du fichier de donnees.");
getch();
}
else
{
printf("\n\tMatricule: ");
scanf("%d",&Etud.mat);
printf("\tNom: ");
fflush(stdin);
gets(Etud.nom);
printf("\tPrenom: ");
fflush(stdin);
gets(Etud.prenom);
printf("\tNiveau: ");
scanf("%d",&Etud.niv);
printf("\tMoyenne: ");
scanf("%f",&Etud.moy);
printf("\tDecision: ");
fflush(stdin);
Etud.dec=getchar();
fwrite(&Etud,sizeof(Etud),1,F);
fclose(F);
}
}
void recherche(int c)
{
FILE *F;
struct Etudiant Etud;
int trouve=0;
F=open("Etudiant.dat","rb");
if(F==NULL)
{
printf("Ouverture impossible du fichier de donnees.");
getch();
}
else
{
while(!trouve && feof(F))
{
fread(&Etud,sizeof(Etud),1,F);
if(Etud.mat==c) trouve=1;
}
if(trouve==0) printf("Etudiant non trouve.");
else printf("Etudiant recherche:\n\tMarticule: %d\n\tNom: %s\n\tPrenom: %s\n\tNiveau: %d\n\tMoyenne: %f\n\tDecision: %c.\n\n",Etud.mat,Etud.nom,Etud.prenom,Etud.niv,Etud.moy,Etud.dec);
fclose(F);
}
}
void modif(int c)
{
FILE *F;
struct Etudiant Etud;
int trouve=0;
long pos;
char rep;
F=fopen("Etudiant.dat","rb+");
if(F==NULL)
{
printf("Ouverture impossible du fichier de donees.");
getch();
}
else
{
while(!trouve && feof(F))
{
pos=ftell(F);
fread(&Etud,sizeof(Etud),1,F);
if(Etud.mat==c) trouve=1;
}
if(trouve==0) printf("Etudiant non trouve.");
else
{
printf("Donnees actuelles de l'etudiant:\n\tMarticule: %d\n\tNom: %s\n\tPrenom: %s\n\tNiveau: %d\n\tMoyenne: %f\n\tDecision: %c.\n\n",Etud.mat,Etud.nom,Etud.prenom,Etud.niv,Etud.moy,Etud.dec);
printf("Modifier la matricule? (O/N): ");
fflush(stdin);
rep=getchar();
if(rep=='o' || rep=='O')
{
printf("\tMatricule: ");
scanf("%d",&Etud.mat);
}
printf("Modifier le nom? (O/N): ");
fflush(stdin);
rep=getchar();
if(rep=='o' || rep=='O')
{
printf("\tNom: ");
fflush(stdin);
gets(Etud.nom);
}
printf("Modifier le prenom? (O/N): ");
fflush(stdin);
rep=getchar();
if(rep=='o' || rep=='O')
{
printf("\tPrenom: ");
fflush(stdin);
gets(Etud.prenom);
}
printf("Modifier le niveau? (O/N): ");
fflush(stdin);
rep=getchar();
if(rep=='o' || rep=='O')
{
printf("\tNiveau: ");
scanf("%d",&Etud.niv);
}
printf("Modifier la moyenne? (O/N): ");
fflush(stdin);
rep=getchar();
if(rep=='o' || rep=='O')
{
printf("\tMoyenne: ");
scanf("%f",&Etud.moy);
}
printf("Modifier la decision? (O/N): ");
fflush(stdin);
rep=getchar();
if(rep=='o' || rep=='O')
{
printf("\tDecision: ");
fflush(stdin);
Etud.dec=getchar();
}
fseek(F,pos,SEEK_SET);
fwrite(&Etud,sizeof(Etud),1,F);
fclose(F);
}
}
}
void suppr(void)
{
FILE *F,*Ftemp;
struct Etudiant Etud;
char nomEt[41], prenomEt[41];
int i=0;
F=fopen("Etudiant.dat","rb");
Ftemp=fopen("temp.dat","wb+");
if(F==NULL)
{
printf("Ouverture du fichier de donnees impossible.");
getch();
}
else if(Ftemp==NULL)
{
printf("Creation du fichier temporaire impossible.");
getch();
}
else
{
printf("Nom de l'etudiant: ");
fflush(stdin);
gets(nomEt);
printf("Prenom de l'etudiant: ");
fflush(stdin);
gets(prenomEt);
while(fread(&Etud,sizeof(Etud),1,F)) if(strcmp(Etud.nom,nomEt) && strcmp(Etud.prenom,prenomEt)) fwrite(&Etud,sizeof(Etud),1,Ftemp);
fclose(F);
fclose(Ftemp);
remove("Etudiant.dat");
rename("temp.dat","Etudiant.dat");
}
}
Ci-dessus le code du programme qui permet de gérer (créer, ajouter, afficher, modifier, supprimer...) les données d'étudiants (matricule, nom, prenom...) (c'est long oui :/ Désolé je n'ai pas encore appris à découper le fichier de code). J'explique le principe: la fonction main joue le role d'un menu, qui nous affiche des choix, nous permet de choisis puis fait appel à la fonction qui correspond à ce choix. En plus de ces fonctions, on trouve trquit et quit qui permettent de vérifier si l'utilisateur souhaire continuer ou refaire une action ou pas.
Le code ci-dessous se compile et le menu fonction bien. La création du fichier de données (avec saisie des données) semble bien fonctionner (on a bien un fichier qui apparait au disque dur et en l'ouvrant avec .txt on trouve les données écrite en langue extraterrestre. C'est lorsqu'on souhaite rechercher ou modifier un étudiant que le programme beug ou plante (n'affiche rien lorsqu'on choisit l'affichage ou alors l’exécutable est planté comme c'est le cas pour afficher les données d'un etudiant).
J'ai révisé le code mais je n'ai pas pu résoudre ces beugs. Pouvez-vous m'aider? Merci d'avance!
Bonhomme !! | Jeu de plateforme : Prototype.