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
Bonjour
salut ,j'ai un exercice de programmation en C
j'ai écrit le programme,puis quand je compile il n'y a pas d'erreurs mais le probleme à l'execution il ne donne aucune résultats et il s'arrête d'executer
voilà le travail :


#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)
{
char nf[20];
printf("saisir nom fichier ");
gets(nf);
*fe=fopen(nf,"w+");
}


void ouverture2(FILE **fi)
{
char ni[20];
printf("saisir nom fichier ");
gets(ni);
*fi=fopen(ni,"w+");
}


int saisir_etudiants(ETUDIANT *e)
{
int j;float *notes;
printf("\n saisir cin \n");
scanf("%i",&e->cin);
if(e->cin<0)return 0;
scanf("%i %s %i",e->cin,e->nom,e->nb);
notes=(float*)malloc((e->nb)*sizeof(float));
for(j=0;j<(e->nb);j++)
{
printf("donner une note de l'etudiant:\n");
scanf("%f",&e->notes[j]);
}
e->rang=0;
void moyenne(ETUDIANT *e,int nb);

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<5;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;
}

void main()
{
int p;
FILE *fe;
int n;
FILE *fi;
ETUDIANT *tab;
ouverture(&fe);
ouverture(&fi);
remplir(fe,fi);
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);
}

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
Qu'as tu constaté avec ton debuggeur favori ?
0
walloula Messages postés 1 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 27 avril 2008
27 avril 2008 à 20:55
je n'ai pas compris qu'est ce que tu veux dire?
0
tatou_38 Messages postés 1928 Date d'inscription vendredi 21 avril 2006 Statut Membre Dernière intervention 5 août 2015 121 > walloula Messages postés 1 Date d'inscription dimanche 27 avril 2008 Statut Membre Dernière intervention 27 avril 2008
27 avril 2008 à 21:00
Quand on a un problème à l'exécution d'un programme, on utilise un debuggeur pour voir en pas à pas où se trouve le problème. Ainsi on résout 95% des soucis.
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.
0
walamefteh Messages postés 35 Date d'inscription lundi 10 mars 2008 Statut Membre Dernière intervention 14 septembre 2009
27 avril 2008 à 20:57
je n'ai pas compris qu'est ce que tu veux dire?
0
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
merci j'ai compris
0
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
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?
0
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
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 !
0
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
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
0

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;
}
0
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
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
0
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;
}
0
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
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
0
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.
0
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
merci bien pour votre aide
et moi j'ai essayé mais le même probleme
et je vais essayer encore
merci
0