Erreur Programme en c
deadstar
-
deadstar -
deadstar -
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;
}
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;
}
A voir également:
- Erreur Programme en c
- Programme demarrage windows - Guide
- Mettre en veille un programme - Guide
- Message programmé iphone - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Forcer la fermeture d'un programme - Guide
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.
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.
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
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
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.
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.
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+
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+
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".
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".
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
#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
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
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.
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)
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)
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));
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));