Erreur Programme en c

Fermé
deadstar - 6 déc. 2007 à 11:21
 deadstar - 6 déc. 2007 à 21:39
Bonjou, à tous!
Voila je débute en programmation, et depuis plusieurs jours je suis sur un programme consistant à etablir une structure de N etudiants contenant leur age, prenom, nom, et note. Jusque là ttva bien. Le programme doit etre capable de calculer la moyenne de la classe, et de trier les etudiants par age. J'ai codé tout ça, je n'ai pas d'erreur, mais au moment de calculer la moyenne j'obtiens un chiffre negative, et le programme plante, quelqu'un veut bien m'aider ? merci d'avance!

#include <stdio.h>

struct etudiant {
char nom [32] ;
char prenom [32] ;
int age ;
float note ;
};

// fonction moyenne


float calculMoyenne(int nbEtudiant, struct etudiant Moyennes){
long total;
total = 0;

struct etudiant moy[nbEtudiant];
moy[nbEtudiant] = Moyennes;

for(int i=0;i<nbEtudiant;i++){
total = total + moy[i].note;
}

float moyenne;

moyenne = total / nbEtudiant;

return moyenne;
}

int main () {

//float moyenne;
int N, i, j, k, indMin, age;
float average;
//float moyenne;
//struct etudiant aide[1], aide2[1];
// enregistrement

//declaration de la fonction moyenne
float moyenne (int N, struct etudiant tab);


printf("saisir le nombre d'etudiant \n");
scanf("%d", &N) ;
struct etudiant tab[N] ;

//remplissage du tableau des N etudiants

FILE *myfile;

myfile = fopen("etudiant.txt", "w+");

for(i=0;i<N;i++) {

//printf - sortie a l'ecran
printf("Etudiant numero [%d]\n", i+1);

printf("Saisir Nom: ", i);
scanf("%s", &tab[i].nom);

printf("Saisir Prenom: ", i);
scanf("%s", &tab[i].prenom);

printf("Saisir Age: ", i);
scanf("%d", &tab[i].age);

printf("Saisir Note de l'Etudiant: ", i);
scanf("%f", &tab[i].note);

//fprintf - ecriture dans le fichier
fprintf(myfile,"%s, %s, %d, %f\n", tab[i].nom, tab[i].prenom, tab[i].age, tab[i].note) ;
}

printf("TEST TEST TEST \n");
average = calculMoyenne(N, tab[N]);

printf ("valeur de la moyenne de la classe : %f\n", average);



//printf("la moyenne de la classe est %f", moyenne);


// tri par selection

// creation d une struct temporaire pour trier les etudiant par age
//struct etudiant temp[N];
int temp[N];
temp[0] = 0;
//k = N;

if(N>1){
for(i=0;i<N-1;i++){
//decale tous les nombre d une case vers le bas tant que le nb trie est inferieur a la 1er case temp
//for(k=0;k<N-1;k++){
if(tab[i].age >= temp[0]) {
//while(tab[i].age >= temp[0]){
for (k=N-1;k>0;k--)
temp[k] = temp[k-1];
//temp[N-1-i] = temp[N-2-i];
temp[k] = tab[k].age;
k++;
//}
}
else{
temp[0] = tab[i].age;
}

//}
//temp[0] = tab[i].age;
}
}

for(j=0;j<N;j++){
printf ("%d\n", temp[j]);
}

fclose(myfile);


//
// if(tab[i].age <= tab[i+1].age){
// temp[i].age = tab[i].age;
// }

// if(tab[i].age < temp[i].age){

// temp[i+1].age = tab[i]
//
// temp[i+2] = temp[i+1]
// temp[i+1] = temp[i]
// temp[0] = tab[i]
//
// temp[i+3] = temp[i+2]
// temp[i+2] = temp[i+1]
// temp[i+1] = temp[i]
//
//
// for(j=1;j<N;i++) {
// temp[N-j] = temp[N-1-j]
// }
//
// temp[0].age = tab[i].age;
// }
// }


/* Affichage après le tri : */
//printf("\nContenu apres le tri :\n ");
//for (j = 0; j <N ; j++)
// printf("%d", tab[j].age);
//printf("\n");

return 0;
}

8 réponses

Bonjour

Tu n'as pas d'erreur ? avec le programme ci-dessus ?
Avec une déclaration struct etudiant moy[nbEtudiant]; où nbEtudiant est une variable
Et j'en passe
Donne une copie de ton vrai programme, celui ci ne doit être accepté par aucun compilateur.
0
C'est la vrai version de mon programme...
je compile avec lcc win 32, et j'arrive a voir ma structure, entrer le nom, prenom, age et note des etudiants.
Je comprends pas très ce que j'aurais du mettre à la place de struct etudiant moy[nbEtudiant];
c'est mon 1er programme donc j'ai bcp de mal lol
Merci par avance
0
Toutes mes excuses, c'est contraire à ce que j'ai toujours connu du C. La dimension d'in tableau DOIT être une constante, tu mets une variable.

Donc, admettons que LCC accepte les tableaux de dimension variable. ce n'est plus du C mais passons

Il reste (au moins) deux remarques

1 - Quand tu définis un tableau moy[nbEtudiant] tu as droit d'utiliser moy[0] .. moy[nbEtudiant-1]
moy[nbEtudiant], c'est en dehors de ton tableau. très bien pour planter

2 - for(int i=0;i<nbEtudiant;i++){
total = total + moy[i].note;

mais les moy[i] n'ont jamais été initialisés ! tu n'as affecté que moy[nbEtudiant]. Il faut que tu passes à ta fonction la totalité du tableau, pas seulement un élément.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 déc. 2007 à 12:40
Moi ça me choc pas la déclaration du tableau avec un int passer en paramètre. Mais bon...
en effet, il y a un problème avec ta fonction. Son proto devrait plutôt être :
float calculMoyenne( struct etudiant* Moyennes,int nbEtudiant)
et ensuite :
for (int i=0;i<nbEtudiant;i++) total+=Moyennes[i].note;
voila, en espérant que ça t'aide a+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Moi ça me choc pas la déclaration du tableau avec un int passer en paramètre
Il est vrai que pour mettre un nom (choc) à la place d'un verbe (choque), tu dois avoir l'habitude de torturer la syntaxe ;-)
J'ai lu un certain nombre de manuels de référence C. TOUS disent que ça doit être une constante. Je n'ai pas dû lire les bons
Un rapide essai sur mon VC++ (des fois que je me serais encore trompé) me jette avec une erreur "taille inconnue".
0
j'ai revu mon probleme et j'obtiens cela :

#include <stdio.h>

struct etudiant {
char nom [32] ;
char prenom [32] ;
int age ;
float note ;
};

// fonction moyenne


float calculMoyenne(float total, int N){
float average;

average = total/N;

return average;
}

int main () {

//float moyenne;
int N, i, j, k, indMin, age;
float total, average;
//float moyenne;
//struct etudiant aide[1], aide2[1];
// enregistrement

//declaration de la fonction moyenne
//float moyenne (int N, struct etudiant tab);

FILE *myfile;

struct etudiant tab[N];

printf("saisir le nombre d'etudiant \n");
scanf("%d", &N) ;

//remplissage du tableau des N etudiants



myfile = fopen("etudiant.txt", "w+");

for(i=0;i<N;i++) {

//printf - sortie a l'ecran
printf("Etudiant numero [%d]\n", i+1);

printf("Saisir Nom: ");
scanf("%s", &tab[i].nom);

printf("Saisir Prenom: ");
scanf("%s", &tab[i].prenom);

printf("Saisir Age: ");
scanf("%d", &tab[i].age);

printf("Saisir Note de l'Etudiant: ");
scanf("%f", &tab[i].note);

//fprintf - ecriture dans le fichier
fprintf(myfile,"%s, %s, %d, %f\n", tab[i].nom, tab[i].prenom, tab[i].age, tab[i].note) ;
}


for(i=0;i<N;i++)
total+= tab[i].note;
average = calculMoyenne(average, N);
printf ("valeur de la moyenne de la classe : %f\n", average);




return 0;
}

cependant j'ai un warning en ce qui concerne" total+= tab[i].note;"
j'ai du mal écrire qqch, mais je ne trouve pas! :( je désespère
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
6 déc. 2007 à 18:06
c'est total qu'il faut metre et pas average lors de l'appel de ta fonction
average = calculMoyenne(total, N);
0
deadstar > mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010
6 déc. 2007 à 18:37
J'ai fait ce que tu m'as dit, mais il reste toujours le warning pour total+= tab[i].note;
Je ne peux donc pas utiliser mon programme :s
je sais pas trop quoi faire, vu que je ne m'y connais pas trop
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436 > deadstar
6 déc. 2007 à 18:48
avec un warning tu peux comme meme executer(evidemment c'est mieux de pas en avoir) c'est seulement avec une erreur que c'est pas possible essaye
moi perso mon compilateur ne me donne pas de warning pour cette ligne
0
deadstar > mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010
6 déc. 2007 à 18:50
oui je sais, mais quand je l'execute le prog plante ...
je sais pas si c'est du au warning ou non :s
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436 > deadstar
6 déc. 2007 à 18:56
si ça segfault c'est peut etre du a un probleme de memoire essaye de faire un malloc comme te la conseillé kyann
en tout cas chez moi ton programme marche bien quand je met total dans l'appel
saisir le nombre d'etudiant
2
Etudiant numero [1]
Saisir Nom: E
Saisir Prenom: R
Saisir Age: 4
Saisir Note de l'Etudiant: 5
Etudiant numero [2]
Saisir Nom: E
Saisir Prenom: R
Saisir Age: 9
Saisir Note de l'Etudiant: 10
valeur de la moyenne de la classe : 7.500000

Process returned 0 (0x0)   execution time : 13.721 s
Press any key to continue.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
6 déc. 2007 à 15:12
Tu déclare ton tableau avant d'initialiser N, c'est normal qu'il ne soit pas content.
Dimensionner un tableau par une variable : soit, mais bon, il faudrai quand même penser à lui donner une valeur !
Pour le reste je ne voi pas de grosse faute. Attention tout de même dans ta fonction à la division d'un float par un entier, ça peut poser des problèmes.
préfère total/float(N).

Pour le etudiant tab [N]; en effet, mon livre de C++ précise bien que N doit être constant. Enfin, on peut imaginer que le compilo est capable de générer un malloc directement (sans pour autant que ça soit standard)
0
déclare un pointeur pour ton tableau au lieu de cette déclaration originale, tu fais du C pas du PHP.

J'ai jms eu besoin de le faire et je peux pas tester mais ça devrait marcher (tetre avec un bout de code en plus pour utiliser le sizeof sur la structure):


// déclaration
struct etudiant *tab;

// saisie
printf("saisir le nombre d'etudiant \n");
scanf("%d", &N) ;

// allocation mémoire
tab = malloc(N*sizeof(etudiant));
0