Programmation en c
Fermé
walamefteh
Messages postés
35
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
14 septembre 2009
-
27 avril 2008 à 20:27
walamefteh Messages postés 35 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 14 septembre 2009 - 2 mai 2008 à 00:39
walamefteh Messages postés 35 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 14 septembre 2009 - 2 mai 2008 à 00:39
A voir également:
- Programmation en c
- Application de programmation - Guide
- Mettre en veille un programme - Guide
- Programmation logo tortue télécharger - Télécharger - Études & Formations
- Programmation télécommande porte de garage brico depot - Forum Matériel & Système
10 réponses
tatou_38
Messages postés
1928
Date d'inscription
vendredi 21 avril 2006
Statut
Membre
Dernière intervention
5 août 2015
121
27 avril 2008 à 20:48
27 avril 2008 à 20:48
Qu'as tu constaté avec ton debuggeur favori ?
walamefteh
Messages postés
35
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
14 septembre 2009
27 avril 2008 à 21:08
27 avril 2008 à 21:08
merci j'ai compris
walamefteh
Messages postés
35
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
14 septembre 2009
27 avril 2008 à 21:26
27 avril 2008 à 21:26
vraiment je n'arrive à rien
il commence l'éxecution :j'éecris le nom des deux fichiers et le cin et le nom de la personne puis il s'arrête
je veux savoir quelles sont mes fautes?
il commence l'éxecution :j'éecris le nom des deux fichiers et le cin et le nom de la personne puis il s'arrête
je veux savoir quelles sont mes fautes?
tatou_38
Messages postés
1928
Date d'inscription
vendredi 21 avril 2006
Statut
Membre
Dernière intervention
5 août 2015
121
27 avril 2008 à 22:51
27 avril 2008 à 22:51
Déjà dans ta fonction ouverture :
void ouverture(FILE **fe)
{
char nf[20];
printf("saisir nom fichier ");
gets(nf);
*fe=fopen(nf,"w+");
}
==> Tu demandes la saisie d'un nom de fichier dans un buffer de 20 caractères. Que se passe t'il si l'utilisateur saisit un nom de fichier de plus de 19 caractères (+1 zéro de fin fait 20) ? et bien PLANTAGE. Donc merci de gérer le problème.
==> Que se passe t'il si fopen() ne réussit pas à ouvrir le fichier ? *fe va être égal à NULL, ce qui peut faire des dégats si pas géré dans le reste du programme.
Il serait bien que ouverture() retourne un code d'erreur, par exemple un entier, 0 si ok, une autre valeur en fonction de l'erreur, de façon à ce que l'appelant sache si c'est ok ou pas !
plutôt que de déclarer un petit buffer dans la pile, il vaudrait mieux allouer dynamiquement un buffer plus large, tout en assurant qu'il ne déborde pas, le minimum syndical en C.
Le reste de ton programme est à revoir si tu veux avoir quelque chose de viable.
Et utilise un DEBUGGUEUR, m'enfin !
void ouverture(FILE **fe)
{
char nf[20];
printf("saisir nom fichier ");
gets(nf);
*fe=fopen(nf,"w+");
}
==> Tu demandes la saisie d'un nom de fichier dans un buffer de 20 caractères. Que se passe t'il si l'utilisateur saisit un nom de fichier de plus de 19 caractères (+1 zéro de fin fait 20) ? et bien PLANTAGE. Donc merci de gérer le problème.
==> Que se passe t'il si fopen() ne réussit pas à ouvrir le fichier ? *fe va être égal à NULL, ce qui peut faire des dégats si pas géré dans le reste du programme.
Il serait bien que ouverture() retourne un code d'erreur, par exemple un entier, 0 si ok, une autre valeur en fonction de l'erreur, de façon à ce que l'appelant sache si c'est ok ou pas !
plutôt que de déclarer un petit buffer dans la pile, il vaudrait mieux allouer dynamiquement un buffer plus large, tout en assurant qu'il ne déborde pas, le minimum syndical en C.
Le reste de ton programme est à revoir si tu veux avoir quelque chose de viable.
Et utilise un DEBUGGUEUR, m'enfin !
walamefteh
Messages postés
35
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
14 septembre 2009
28 avril 2008 à 21:44
28 avril 2008 à 21:44
merci de votre aide mais je fais ce que vous m'avez dis mais rien ,toujours l'éxecution se bloque dés que j'affiche cin,le nom et le nombre des notes
je ne sais pas quelles sont mes fautes
merci de m'aider encore
je ne sais pas quelles sont mes fautes
merci de m'aider encore
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
j'en ai déboué une partie jusqu'a remplir(fe,fi);
à toi de continuer
#include<stdio.h>
#include<stdlib.h>
struct etudiant
{
int cin;
char nom[20];
float moy;
int rang;
int nb;
float notes[20];
};
typedef struct etudiant ETUDIANT;
struct index
{
int cin;
long taille;
};
typedef struct index INDEX;
void ouverture(FILE **fe);
void ouverture2(FILE **fi);
int saisir_etudiants(ETUDIANT *e);
void remplir(FILE *fe,FILE *fi);
void afficher_etudiants(FILE *fe);
void afficher_index(FILE *fi);
ETUDIANT *allocation(int n);
void afficher_etudiant(FILE *fe, FILE *fi,int p);
int nb_etudiants(FILE *fe);
void tri_moyenne_dec(ETUDIANT *tab,int n);
void moyenne(ETUDIANT *e);
void permuter(ETUDIANT* i,ETUDIANT* j);
void main()
{
int p;
FILE *fe;
int n;
FILE *fi;
ETUDIANT *tab;
ouverture(&fe);
if (fe==NULL) {printf("ERREUR OUVERTURE FICHIER ETUDIANTS\n"); exit(1);}
ouverture2(&fi);
if (fi==NULL) {printf("ERREUR OUVERTURE FICHIER INDEX\n"); exit(1);}
remplir(fe,fi);
// je me suis arrete ici
// si j'ai un peu de temps je continuerai
afficher_etudiants(fe);
afficher_index(fi);
printf("\n donner la position à modifier: ");
scanf("%i",&p);
afficher_etudiant(fe,fi,p);
printf("le nombre des etudiants est %i",nb_etudiants(fe));
n=nb_etudiants(fe);
fread(&tab,n*sizeof(ETUDIANT),1,fe);
tri_moyenne_dec(tab, n);
fclose(fe);
fclose(fi);
}
void ouverture(FILE **fe)
{
char nf[20];
printf("saisir nom fichier Etudiants ");
gets(nf);
*fe=fopen(nf,"w+");
}
void ouverture2(FILE **fi)
{
char ni[20];
printf("saisir nom fichier Index");
gets(ni);
*fi=fopen(ni,"w+");
}
int saisir_etudiants(ETUDIANT *e)
{
int j;float *notes;
printf("\nsaisir cin ou -1 pour terminer : ");
scanf("%d",&e->cin);
//printf("cin = %d\n",e->cin);
if(e->cin<0)return 0;
printf("\nsaisir Nom et Nbre de Notes : ");
scanf("%s %d",e->nom,&e->nb);
//printf("nom=%s nbre=%d\n",e->nom,e->nb);
notes=(float*)malloc((e->nb)*sizeof(float));
for(j=0;j<(e->nb);j++)
{
printf("\nentrer la note %d :",j+1);
scanf("%f",&e->notes[j]);
}
//printf("notes de l'etudiant:");
//for(j=0;j<(e->nb);j++)
//{
//printf("%0.2f\t",e->notes[j]);
//}
//printf("\n");
e->rang=0;
moyenne(e);
return 1;
}
void remplir(FILE *fe,FILE *fi)
{
ETUDIANT e;int l;
while(saisir_etudiants(&e))
{
fwrite(&e,sizeof(ETUDIANT),1,fe);
l=sizeof(ETUDIANT);
fwrite(&e.cin,sizeof(int),1,fi);
fwrite(&l,sizeof(long),1,fi);
}
}
void afficher_etudiants(FILE *fe)
{
ETUDIANT e;int j;
fread(&e,sizeof(ETUDIANT),1,fe);
while(!feof(fe))
{
printf("\n donner le cin :");
printf("%i",e.cin);
printf("\n donner son nom: ");
printf("%l",e.nom);
for(j=0;j<(e.nb);j++)
printf("%f\t",e.notes[j]);
fread(&e,sizeof(ETUDIANT),1,fe);
}
}
void afficher_index(FILE *fi)
{
INDEX in;
fread(&in,sizeof(INDEX),1,fi);
while(!feof(fi))
{
printf("\n donner le cin :%i",in.cin);
printf("\n donner la taille:%l ",in.taille);
fread(&in,sizeof(INDEX),1,fi);
}
}
ETUDIANT *allocation(int n)
{
ETUDIANT *tab;
tab=(ETUDIANT*)malloc(n*sizeof(ETUDIANT));
return tab;
}
void afficher_etudiant(FILE *fe, FILE *fi,int p)
{
ETUDIANT e;
rewind(fe);
rewind(fi);
fseek(fe,(p-1)*sizeof(ETUDIANT),SEEK_SET);
fseek(fe,(p-1)*sizeof(INDEX),SEEK_SET);
fwrite(&e,sizeof(ETUDIANT),1,fe);
fwrite(&e,sizeof(INDEX),1,fe);
}
int nb_etudiants(FILE *fe)
{
long p;
int nb;
fseek(fe,0,SEEK_END);
p=ftell(fe);
nb=p/sizeof(ETUDIANT);
return nb;
}
void tri_moyenne_dec(ETUDIANT *tab,int n)
{
void moyenne(ETUDIANT *i);
void permuter(ETUDIANT* i,ETUDIANT* j);
ETUDIANT* i;
ETUDIANT* j;
for(i=tab;i<tab+n-1;i++)
for(j=tab+1;j<tab+n;j++)
{
moyenne(i);
moyenne(j);
if((j->moy)>(i->moy))
{
permuter(i,j);
}
}
printf("les noms des etudiants classés selon leurs moyennes ds l'ordre decroissant est:\n");
for(i=tab;i<tab+n;i++)
printf("%s a une moyenne %f\n",i->nom,i->moy);
}
void moyenne(ETUDIANT *e )
{
int k;
float moy=0;
for(k=0;k<(e->nb);k++)
moy=moy+e->notes[k];
e->moy=moy/(e->nb);
//printf("\nmoyenne = %0.2f",e->moy);
}
void permuter(ETUDIANT* i,ETUDIANT* j)
{
ETUDIANT x;
x=*j;
*j=*i;
*i=x;
}
j'en ai déboué une partie jusqu'a remplir(fe,fi);
à toi de continuer
#include<stdio.h>
#include<stdlib.h>
struct etudiant
{
int cin;
char nom[20];
float moy;
int rang;
int nb;
float notes[20];
};
typedef struct etudiant ETUDIANT;
struct index
{
int cin;
long taille;
};
typedef struct index INDEX;
void ouverture(FILE **fe);
void ouverture2(FILE **fi);
int saisir_etudiants(ETUDIANT *e);
void remplir(FILE *fe,FILE *fi);
void afficher_etudiants(FILE *fe);
void afficher_index(FILE *fi);
ETUDIANT *allocation(int n);
void afficher_etudiant(FILE *fe, FILE *fi,int p);
int nb_etudiants(FILE *fe);
void tri_moyenne_dec(ETUDIANT *tab,int n);
void moyenne(ETUDIANT *e);
void permuter(ETUDIANT* i,ETUDIANT* j);
void main()
{
int p;
FILE *fe;
int n;
FILE *fi;
ETUDIANT *tab;
ouverture(&fe);
if (fe==NULL) {printf("ERREUR OUVERTURE FICHIER ETUDIANTS\n"); exit(1);}
ouverture2(&fi);
if (fi==NULL) {printf("ERREUR OUVERTURE FICHIER INDEX\n"); exit(1);}
remplir(fe,fi);
// je me suis arrete ici
// si j'ai un peu de temps je continuerai
afficher_etudiants(fe);
afficher_index(fi);
printf("\n donner la position à modifier: ");
scanf("%i",&p);
afficher_etudiant(fe,fi,p);
printf("le nombre des etudiants est %i",nb_etudiants(fe));
n=nb_etudiants(fe);
fread(&tab,n*sizeof(ETUDIANT),1,fe);
tri_moyenne_dec(tab, n);
fclose(fe);
fclose(fi);
}
void ouverture(FILE **fe)
{
char nf[20];
printf("saisir nom fichier Etudiants ");
gets(nf);
*fe=fopen(nf,"w+");
}
void ouverture2(FILE **fi)
{
char ni[20];
printf("saisir nom fichier Index");
gets(ni);
*fi=fopen(ni,"w+");
}
int saisir_etudiants(ETUDIANT *e)
{
int j;float *notes;
printf("\nsaisir cin ou -1 pour terminer : ");
scanf("%d",&e->cin);
//printf("cin = %d\n",e->cin);
if(e->cin<0)return 0;
printf("\nsaisir Nom et Nbre de Notes : ");
scanf("%s %d",e->nom,&e->nb);
//printf("nom=%s nbre=%d\n",e->nom,e->nb);
notes=(float*)malloc((e->nb)*sizeof(float));
for(j=0;j<(e->nb);j++)
{
printf("\nentrer la note %d :",j+1);
scanf("%f",&e->notes[j]);
}
//printf("notes de l'etudiant:");
//for(j=0;j<(e->nb);j++)
//{
//printf("%0.2f\t",e->notes[j]);
//}
//printf("\n");
e->rang=0;
moyenne(e);
return 1;
}
void remplir(FILE *fe,FILE *fi)
{
ETUDIANT e;int l;
while(saisir_etudiants(&e))
{
fwrite(&e,sizeof(ETUDIANT),1,fe);
l=sizeof(ETUDIANT);
fwrite(&e.cin,sizeof(int),1,fi);
fwrite(&l,sizeof(long),1,fi);
}
}
void afficher_etudiants(FILE *fe)
{
ETUDIANT e;int j;
fread(&e,sizeof(ETUDIANT),1,fe);
while(!feof(fe))
{
printf("\n donner le cin :");
printf("%i",e.cin);
printf("\n donner son nom: ");
printf("%l",e.nom);
for(j=0;j<(e.nb);j++)
printf("%f\t",e.notes[j]);
fread(&e,sizeof(ETUDIANT),1,fe);
}
}
void afficher_index(FILE *fi)
{
INDEX in;
fread(&in,sizeof(INDEX),1,fi);
while(!feof(fi))
{
printf("\n donner le cin :%i",in.cin);
printf("\n donner la taille:%l ",in.taille);
fread(&in,sizeof(INDEX),1,fi);
}
}
ETUDIANT *allocation(int n)
{
ETUDIANT *tab;
tab=(ETUDIANT*)malloc(n*sizeof(ETUDIANT));
return tab;
}
void afficher_etudiant(FILE *fe, FILE *fi,int p)
{
ETUDIANT e;
rewind(fe);
rewind(fi);
fseek(fe,(p-1)*sizeof(ETUDIANT),SEEK_SET);
fseek(fe,(p-1)*sizeof(INDEX),SEEK_SET);
fwrite(&e,sizeof(ETUDIANT),1,fe);
fwrite(&e,sizeof(INDEX),1,fe);
}
int nb_etudiants(FILE *fe)
{
long p;
int nb;
fseek(fe,0,SEEK_END);
p=ftell(fe);
nb=p/sizeof(ETUDIANT);
return nb;
}
void tri_moyenne_dec(ETUDIANT *tab,int n)
{
void moyenne(ETUDIANT *i);
void permuter(ETUDIANT* i,ETUDIANT* j);
ETUDIANT* i;
ETUDIANT* j;
for(i=tab;i<tab+n-1;i++)
for(j=tab+1;j<tab+n;j++)
{
moyenne(i);
moyenne(j);
if((j->moy)>(i->moy))
{
permuter(i,j);
}
}
printf("les noms des etudiants classés selon leurs moyennes ds l'ordre decroissant est:\n");
for(i=tab;i<tab+n;i++)
printf("%s a une moyenne %f\n",i->nom,i->moy);
}
void moyenne(ETUDIANT *e )
{
int k;
float moy=0;
for(k=0;k<(e->nb);k++)
moy=moy+e->notes[k];
e->moy=moy/(e->nb);
//printf("\nmoyenne = %0.2f",e->moy);
}
void permuter(ETUDIANT* i,ETUDIANT* j)
{
ETUDIANT x;
x=*j;
*j=*i;
*i=x;
}
walamefteh
Messages postés
35
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
14 septembre 2009
1 mai 2008 à 22:48
1 mai 2008 à 22:48
merci pour votre aide , à l'execution je fais entrer le cin ,nom et le nb
mais à l'affichage des contenus des fichiers il affiche des grands nombres et les répéte rapidement sans arrêts
j'ai essayé de chercher le probleme mais rien
merci d'essayer et voir le resultat de l'execution et de chercher le probleme
merci pour votre aide
mais à l'affichage des contenus des fichiers il affiche des grands nombres et les répéte rapidement sans arrêts
j'ai essayé de chercher le probleme mais rien
merci d'essayer et voir le resultat de l'execution et de chercher le probleme
merci pour votre aide
bonsoir,
J'ai pu continuer de déboguer le programme mais il reste une erreur d'exécution dans la fonction tri_moyenne_dec
Je ne sais pas ce que essaie de faire avec cette fonction. Je vois bien que tu fais un tri par ordre croissant, mais c'est la manière que je ne comprends pas.
Voici le code corrigé. J'utilise Borland C++ 3.0
#include<stdio.h>
#include<stdlib.h>
struct etudiant
{
int cin;
char nom[20];
float moy;
int rang;
int nb;
float notes[20];
};
typedef struct etudiant ETUDIANT;
struct index
{
int cin;
long taille;
};
typedef struct index INDEX;
void ouverture(FILE **fe);
void ouverture2(FILE **fi);
int saisir_etudiants(ETUDIANT *e);
void remplir(FILE *fe,FILE *fi);
void afficher_etudiants(FILE *fe);
void afficher_index(FILE *fi);
ETUDIANT *allocation(int n);
void afficher_etudiant(FILE *fe, FILE *fi,int p);
int nb_etudiants(FILE *fe);
void tri_moyenne_dec(ETUDIANT *tab,int n);
void moyenne(ETUDIANT *e);
void permuter(ETUDIANT* i,ETUDIANT* j);
void main()
{
int p;
FILE *fe;
int n;
FILE *fi;
ETUDIANT *tab;
ouverture(&fe);
if (fe==NULL) {printf("ERREUR OUVERTURE FICHIER ETUDIANTS\n"); exit(1);}
ouverture2(&fi);
if (fi==NULL) {printf("ERREUR OUVERTURE FICHIER INDEX\n"); exit(1);}
remplir(fe,fi);
afficher_etudiants(fe);
afficher_index(fi);
printf("\ndonner la position a modifier: ");
scanf("%i",&p);
afficher_etudiant(fe,fi,p);
n=nb_etudiants(fe);
printf("\nle nombre des etudiants est %i",n);
getch();
//tab=allocation(n);
tab=(ETUDIANT*)malloc(n*sizeof(ETUDIANT));
rewind(fe);
fread(&tab,n*sizeof(ETUDIANT),1,fe);
// a partir de la ‡a ne marche pas
// tri_moyenne_dec cause une erreur et plante le programme
tri_moyenne_dec(tab, n);
fclose(fe);
fclose(fi);
getch();
}
/*****************************************************/
void ouverture(FILE **fe)
{
char nf[20];
printf("\nsaisir nom fichier Etudiants\n");
gets(nf);
*fe=fopen(nf,"w+");
}
void ouverture2(FILE **fi)
{
char ni[20];
printf("\nsaisir nom fichier Index\n");
gets(ni);
*fi=fopen(ni,"w+");
}
int saisir_etudiants(ETUDIANT *e)
{
int j;float *notes;
printf("\n\nsaisir cin ou -1 pour terminer : ");
scanf("%i",&e->cin);
printf("cin = %i\n",e->cin);
if(e->cin<0)return 0;
printf("\nsaisir Nom et Nbre de Notes : ");
scanf("%s %i",e->nom,&e->nb);
printf("nom=%s nbre=%i\n",e->nom,e->nb);
notes=(float*)malloc((e->nb)*sizeof(float));
for(j=0;j<(e->nb);j++)
{
printf("\nentrer la note %d :",j+1);
scanf("%f",&e->notes[j]);
}
printf("\nnotes de l'etudiant:\t");
for(j=0;j<(e->nb);j++)
{
printf("%0.2f\t",e->notes[j]);
}
//printf("\n");
e->rang=0;
moyenne(e);
printf("\nmoyenne = %0.2f",e->moy);
return 1;
}
void remplir(FILE *fe,FILE *fi)
{
ETUDIANT e;int l;
while(saisir_etudiants(&e))
{
fwrite(&e,sizeof(ETUDIANT),1,fe);
l=sizeof(ETUDIANT);
fwrite(&e.cin,sizeof(int),1,fi);
fwrite(&l,sizeof(long),1,fi);
}
}
void afficher_etudiants(FILE *fe)
{
ETUDIANT e;int j;
rewind(fe);
//fseek(fe, SEEK_SET, 0);
fread(&e,sizeof(ETUDIANT),1,fe);
while(!feof(fe))
{
printf("\n\ndonner le cin :");
printf("%i",e.cin);
printf("\ndonner son nom: ");
printf("%s",e.nom);
printf("\nnotes :\t");
for(j=0;j<(e.nb);j++)
printf("%0.2f\t",e.notes[j]);
printf("\n");
getch();
fread(&e,sizeof(ETUDIANT),1,fe);
}
}
void afficher_index(FILE *fi)
{
INDEX in;
rewind(fi);
//fseek(fi, SEEK_SET, 0);
fread(&in,sizeof(INDEX),1,fi);
while(!feof(fi))
{
printf("\n\ndonner le cin : %i ",in.cin);
printf("\ndonner la taille: %d\n",in.taille);
getch();
fread(&in,sizeof(INDEX),1,fi);
}
}
ETUDIANT *allocation(int n)
{
ETUDIANT *tab;
tab=(ETUDIANT*)malloc(n*sizeof(ETUDIANT));
return tab;
}
void afficher_etudiant(FILE *fe, FILE *fi,int p)
{
ETUDIANT e;int j;
INDEX in;
rewind(fe);
rewind(fi);
fseek(fe,(p-1)*sizeof(ETUDIANT),SEEK_CUR);
fseek(fi,(p-1)*sizeof(INDEX),SEEK_CUR);
fread(&e,sizeof(ETUDIANT),1,fe);
printf("\ndonner le cin :");
printf("%i",e.cin);
printf("\ndonner son nom: ");
printf("%s",e.nom);
printf("\nnotes :\t");
for(j=0;j<(e.nb);j++)
printf("%0.2f\t",e.notes[j]);
printf("\n");
fread(&in,sizeof(INDEX),1,fi);
printf("\ndonner le cin : %i ",in.cin);
printf("\ndonner la taille: %d\n\n",in.taille);
getch();
//fwrite(&e,sizeof(ETUDIANT),1,fe);
//fwrite(&e,sizeof(INDEX),1,fe);
}
int nb_etudiants(FILE *fe)
{
long p;
int nb;
fseek(fe,0,SEEK_END);
p=ftell(fe);
nb=p/sizeof(ETUDIANT);
return nb;
}
void tri_moyenne_dec(ETUDIANT *tab,int n)
{
void moyenne(ETUDIANT *i);
void permuter(ETUDIANT* i,ETUDIANT* j);
int k;
ETUDIANT* i;
ETUDIANT* j;
for(i=tab;i<tab+n-1;i++)
for(j=tab+1;j<tab+n;j++)
{
moyenne(i);
moyenne(j);
if((j->moy)>(i->moy))
{
permuter(i,j);
}
}
printf("les noms des etudiants classés selon leurs moyennes ds l'ordre decroissant est:\n");
for(i=tab;i<tab+n;i++)
printf("%s a une moyenne %0.2f\n",i->nom,i->moy);
}
void moyenne(ETUDIANT *e )
{
int k;
float moy=0;
for(k=0;k<(e->nb);k++)
moy=moy+e->notes[k];
e->moy=moy/(e->nb);
}
void permuter(ETUDIANT* i,ETUDIANT* j)
{
ETUDIANT x;
x=*j;
*j=*i;
*i=x;
}
J'ai pu continuer de déboguer le programme mais il reste une erreur d'exécution dans la fonction tri_moyenne_dec
Je ne sais pas ce que essaie de faire avec cette fonction. Je vois bien que tu fais un tri par ordre croissant, mais c'est la manière que je ne comprends pas.
Voici le code corrigé. J'utilise Borland C++ 3.0
#include<stdio.h>
#include<stdlib.h>
struct etudiant
{
int cin;
char nom[20];
float moy;
int rang;
int nb;
float notes[20];
};
typedef struct etudiant ETUDIANT;
struct index
{
int cin;
long taille;
};
typedef struct index INDEX;
void ouverture(FILE **fe);
void ouverture2(FILE **fi);
int saisir_etudiants(ETUDIANT *e);
void remplir(FILE *fe,FILE *fi);
void afficher_etudiants(FILE *fe);
void afficher_index(FILE *fi);
ETUDIANT *allocation(int n);
void afficher_etudiant(FILE *fe, FILE *fi,int p);
int nb_etudiants(FILE *fe);
void tri_moyenne_dec(ETUDIANT *tab,int n);
void moyenne(ETUDIANT *e);
void permuter(ETUDIANT* i,ETUDIANT* j);
void main()
{
int p;
FILE *fe;
int n;
FILE *fi;
ETUDIANT *tab;
ouverture(&fe);
if (fe==NULL) {printf("ERREUR OUVERTURE FICHIER ETUDIANTS\n"); exit(1);}
ouverture2(&fi);
if (fi==NULL) {printf("ERREUR OUVERTURE FICHIER INDEX\n"); exit(1);}
remplir(fe,fi);
afficher_etudiants(fe);
afficher_index(fi);
printf("\ndonner la position a modifier: ");
scanf("%i",&p);
afficher_etudiant(fe,fi,p);
n=nb_etudiants(fe);
printf("\nle nombre des etudiants est %i",n);
getch();
//tab=allocation(n);
tab=(ETUDIANT*)malloc(n*sizeof(ETUDIANT));
rewind(fe);
fread(&tab,n*sizeof(ETUDIANT),1,fe);
// a partir de la ‡a ne marche pas
// tri_moyenne_dec cause une erreur et plante le programme
tri_moyenne_dec(tab, n);
fclose(fe);
fclose(fi);
getch();
}
/*****************************************************/
void ouverture(FILE **fe)
{
char nf[20];
printf("\nsaisir nom fichier Etudiants\n");
gets(nf);
*fe=fopen(nf,"w+");
}
void ouverture2(FILE **fi)
{
char ni[20];
printf("\nsaisir nom fichier Index\n");
gets(ni);
*fi=fopen(ni,"w+");
}
int saisir_etudiants(ETUDIANT *e)
{
int j;float *notes;
printf("\n\nsaisir cin ou -1 pour terminer : ");
scanf("%i",&e->cin);
printf("cin = %i\n",e->cin);
if(e->cin<0)return 0;
printf("\nsaisir Nom et Nbre de Notes : ");
scanf("%s %i",e->nom,&e->nb);
printf("nom=%s nbre=%i\n",e->nom,e->nb);
notes=(float*)malloc((e->nb)*sizeof(float));
for(j=0;j<(e->nb);j++)
{
printf("\nentrer la note %d :",j+1);
scanf("%f",&e->notes[j]);
}
printf("\nnotes de l'etudiant:\t");
for(j=0;j<(e->nb);j++)
{
printf("%0.2f\t",e->notes[j]);
}
//printf("\n");
e->rang=0;
moyenne(e);
printf("\nmoyenne = %0.2f",e->moy);
return 1;
}
void remplir(FILE *fe,FILE *fi)
{
ETUDIANT e;int l;
while(saisir_etudiants(&e))
{
fwrite(&e,sizeof(ETUDIANT),1,fe);
l=sizeof(ETUDIANT);
fwrite(&e.cin,sizeof(int),1,fi);
fwrite(&l,sizeof(long),1,fi);
}
}
void afficher_etudiants(FILE *fe)
{
ETUDIANT e;int j;
rewind(fe);
//fseek(fe, SEEK_SET, 0);
fread(&e,sizeof(ETUDIANT),1,fe);
while(!feof(fe))
{
printf("\n\ndonner le cin :");
printf("%i",e.cin);
printf("\ndonner son nom: ");
printf("%s",e.nom);
printf("\nnotes :\t");
for(j=0;j<(e.nb);j++)
printf("%0.2f\t",e.notes[j]);
printf("\n");
getch();
fread(&e,sizeof(ETUDIANT),1,fe);
}
}
void afficher_index(FILE *fi)
{
INDEX in;
rewind(fi);
//fseek(fi, SEEK_SET, 0);
fread(&in,sizeof(INDEX),1,fi);
while(!feof(fi))
{
printf("\n\ndonner le cin : %i ",in.cin);
printf("\ndonner la taille: %d\n",in.taille);
getch();
fread(&in,sizeof(INDEX),1,fi);
}
}
ETUDIANT *allocation(int n)
{
ETUDIANT *tab;
tab=(ETUDIANT*)malloc(n*sizeof(ETUDIANT));
return tab;
}
void afficher_etudiant(FILE *fe, FILE *fi,int p)
{
ETUDIANT e;int j;
INDEX in;
rewind(fe);
rewind(fi);
fseek(fe,(p-1)*sizeof(ETUDIANT),SEEK_CUR);
fseek(fi,(p-1)*sizeof(INDEX),SEEK_CUR);
fread(&e,sizeof(ETUDIANT),1,fe);
printf("\ndonner le cin :");
printf("%i",e.cin);
printf("\ndonner son nom: ");
printf("%s",e.nom);
printf("\nnotes :\t");
for(j=0;j<(e.nb);j++)
printf("%0.2f\t",e.notes[j]);
printf("\n");
fread(&in,sizeof(INDEX),1,fi);
printf("\ndonner le cin : %i ",in.cin);
printf("\ndonner la taille: %d\n\n",in.taille);
getch();
//fwrite(&e,sizeof(ETUDIANT),1,fe);
//fwrite(&e,sizeof(INDEX),1,fe);
}
int nb_etudiants(FILE *fe)
{
long p;
int nb;
fseek(fe,0,SEEK_END);
p=ftell(fe);
nb=p/sizeof(ETUDIANT);
return nb;
}
void tri_moyenne_dec(ETUDIANT *tab,int n)
{
void moyenne(ETUDIANT *i);
void permuter(ETUDIANT* i,ETUDIANT* j);
int k;
ETUDIANT* i;
ETUDIANT* j;
for(i=tab;i<tab+n-1;i++)
for(j=tab+1;j<tab+n;j++)
{
moyenne(i);
moyenne(j);
if((j->moy)>(i->moy))
{
permuter(i,j);
}
}
printf("les noms des etudiants classés selon leurs moyennes ds l'ordre decroissant est:\n");
for(i=tab;i<tab+n;i++)
printf("%s a une moyenne %0.2f\n",i->nom,i->moy);
}
void moyenne(ETUDIANT *e )
{
int k;
float moy=0;
for(k=0;k<(e->nb);k++)
moy=moy+e->notes[k];
e->moy=moy/(e->nb);
}
void permuter(ETUDIANT* i,ETUDIANT* j)
{
ETUDIANT x;
x=*j;
*j=*i;
*i=x;
}
walamefteh
Messages postés
35
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
14 septembre 2009
1 mai 2008 à 23:42
1 mai 2008 à 23:42
merci amigo
pour la solution avant la derniere j'ai trouvé qu'il faut dans main rewind(fe);
rewind(fi);
après le remplissage et avant l'affichage et ça marche comme la derniére solution mais le probleme que l'execution s'arrete par l'affichage de nombre des etudiants sitout il n'y a pas de trie
pour la solution avant la derniere j'ai trouvé qu'il faut dans main rewind(fe);
rewind(fi);
après le remplissage et avant l'affichage et ça marche comme la derniére solution mais le probleme que l'execution s'arrete par l'affichage de nombre des etudiants sitout il n'y a pas de trie
C'est bien ce que je te disais, la fonction void tri_moyenne_dec(ETUDIANT *tab,int n) provoque une erreur.
Essaie de trouver une autre solution pour cela. Au lieu de charger le fichier ETUDIANTS au complet, lis les enregistrements un par un et mets en tableau le numero d'enregistrement et la moyenne. C'est plus facile à gérer.
Essaie de trouver une autre solution pour cela. Au lieu de charger le fichier ETUDIANTS au complet, lis les enregistrements un par un et mets en tableau le numero d'enregistrement et la moyenne. C'est plus facile à gérer.
walamefteh
Messages postés
35
Date d'inscription
lundi 10 mars 2008
Statut
Membre
Dernière intervention
14 septembre 2009
2 mai 2008 à 00:39
2 mai 2008 à 00:39
merci bien pour votre aide
et moi j'ai essayé mais le même probleme
et je vais essayer encore
merci
et moi j'ai essayé mais le même probleme
et je vais essayer encore
merci
27 avril 2008 à 20:55
27 avril 2008 à 21:00
Ensuite, on fait appel au forum, en indiquant les observations faites, de façon à ce que les membres n'aient pas à refaire le travail qui a déjà été fait.
Personnellement je me refuse à debugger un programme sans ce préalable.
27 avril 2008 à 20:57