Je voudrais que vous corrigiez mon code
brucine Messages postés 23572 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char CNE[20];
char nom[20];
char prenom[20];
char filiere[20];
} etudiant;
typedef struct {
char CNE[20];
char CM[20];
float Note;
} note;
int main() {
FILE *f, *fp, *fb;
int i, j, ne, nb, seuil = 10;
float s = 0, m[50];
char cne[20], cne2[20];
etudiant E[50];
note N[50];
f = fopen("etudiant.txt", "w");
if (f == NULL) {
perror("erreur d'ouverture");
return 1;
}
fp = fopen("notes.txt", "w");
if (fp == NULL) {
perror("erreur d'ouverture");
return 1;
}
printf("saisir le nombre d'etudiants");
scanf("%d", &ne);
printf("saisir le nombre de modules");
scanf("%d", &nb);
printf("saisir les infos des etudiants\n");
for (i = 0; i < ne; i++) {
printf("etudiant %d:\n", i + 1);
printf("nom:");
scanf("%s", E[i].nom);
printf("prenom:");
scanf("%s", E[i].prenom);
printf("filiere:");
scanf("%s", E[i].filiere);
printf("CNE:");
scanf("%s", N[i].CNE);
fprintf(f, "%s %s %s %s\n", N[i].CNE, E[i].nom, E[i].prenom, E[i].filiere);
s = 0;
for (j = 0; j < nb; j++) {
printf("codemodule%d :", j + 1);
scanf("%s", N[j].CM);
printf("Note %d:", j + 1);
scanf("%f", &N[j].Note);
s = s + N[j].Note;
}
m[i] = s / nb;
for (j = 0;j < nb; j++) {
fprintf(fp, "%s %s %.2f\n", N[j].CNE, N[j].CM, N[j].Note);
}
}
rewind(f);
rewind(fp);
printf("la liste des etudiants\n");
for (i = 0; i < ne; i++) {
fscanf(f, "%s %s%s%s", N[i].CNE, E[i].nom, E[i].prenom, E[i].filiere);
printf("%s %s %s %s\n", N[i].CNE, E[i].nom, E[i].prenom, E[i].filiere);
}
printf("saisir CNE\n");
scanf("%s", cne);
for (i = 0; i < ne; i++) {
if (strcmp(N[i].CNE, cne) == 0) {
fscanf(fp, "%s%s%f", N[i].CNE, N[i].CM, &N[i].Note);
printf("%s %s %s\n", E[i].nom, E[i].prenom, E[i].filiere);
printf("la moyenne est : %.2f\n", m[i]);
}
}
fb = fopen("bulletin.txt", "w");
if (fb == NULL){
perror("erreur d'ouverture");
return 1;
}
printf("saisir CNE\n");
scanf("%s", cne);
for (i = 0; i < ne; i++) {
if (strcmp(N[i].CNE, cne) == 0) {
fprintf(fb, "%s %s %s %s\n", N[i].CNE, E[i].nom, E[i].prenom, E[i].filiere);
for (j = 0; j < nb; j++){
fprintf(fb, "%s %.2f\n", N[j].CM, N[j].Note);
}
fprintf(fb, "la moyenne est : %.2f\n", m[i]);
if (m[i] >= seuil) {
fprintf(fb, "admis\n");
} else {
fprintf(fb, "redoublant\n");
}
}
}
fclose(fb);
fclose(f);
fclose(fp);
return 0;
}
Windows / Chrome 142.0.0.0
- Je voudrais que vous corrigiez mon code
- Code ascii - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code activation windows 10 - Guide
- Scanner qr code pc - Guide
2 réponses
Bonjour
Premier exercice avant d'attendre une proposition ici :
- expliquer le rôle du programme, tout ce qu'il doit faire
- indenter correctement
- nommer explicitement toutes les variables (CNE ? CM ? E ?)
- tout commenter
- expliquer le problème rencontré
Rapidement dans un éditeur de texte je suis à plus de 100 lignes. Ça ne mérite pas un trop simple "Bonjour, je voudrais que vous corrigez mon code" AMHO
Bonjour
J'ai refait une passe sur l'indentation (cf #2). À la liste de @luckydu43 StatutMembre j'ajouterais qu'ajouter les fichiers d'entrée permettrait de reproduire l'éventuel bug rencontré.
Ce que je peux d'ores et déjà dire rien qu'en lisant le code :
- Le code n'est pas commenté
- Les valeurs saisies ou chargées ne sont pas contrôlées et peuvent donc faire planter le programme ou fausser ses résultats.
- Les valeurs numériques ne sont pas contrôlées. En particulier,
- Les notes peuvent être négatives ou supérieures à 20
- Si nb == 0 (nombre de notes), le programme plantera a cause d'une division par zéro.
- La longueur des chaînes n'est pas contrôlée. Si un prénom ou un nom fait 20 caractères ou plus, il y aura un buffer overflow et toutes les erreurs mémoires qu'on peut imaginer ensuite (segmentation fault ou autre). Idem s'il y a plus de 50 notes, aucun contrôle n'est fait à ce stade.
- Dans la même veine, les tests de comparaison de chaînes devraient idéalement être réalisé avec strncmp plutôt que strcmp.
- Les valeurs numériques ne sont pas contrôlées. En particulier,
- Les conventions de nommage pourraient être améliorées.
- Les noms de variable réduit à une lettre sont souvent absconds. Il vaut mieux privilégier des noms parlants (par exemple "num_notes" pour compter le nombre de notes)... et plutôt en anglais pour prendre les bonnes habitudes.
- Généralement les symboles tout en majuscule désignent des macros (voir #define). En C on suffixe souvent les noms de type par "_t" (par exemple "etudiant_t"). En C++ on fait souvent commencer le nom du type par une majuscule (par exemple "Etudiant"), ce qui se fait moins en C mais serait en soi parfaitement correct. Donc par exemple on pourrait écrire :
etudiant_t etudiant; note_t note;
- Pourquoi rewind ?
- Certaines parties semblent dupliquées (notamment, pourquoi l'utilisateur est-il amené à saisir plusieurs fois un CNE ?). D'ailleurs c'est quoi un CNE ?
- Les messages d'erreur sont un peu laxistes (notamment quand un fichier ne peut pas être ouvert, ce serait bien de dire lequel).
- Ce serait mieux de fermer un fichier dès que tu n'en as plus besoin.
Bonne chance
Bonjour,
Il faut que ce soit délibéré, mais il me semble qu'avec les options telle note dans une matière peut être supérieure à 20 notamment au bac et j'ai connu le cas à la fac certes il y a très longtemps.
Les notes négatives (comme maintenant les appréciations très négatives dans le primaire et le secondaire), considérées comme dévalorisantes, ont elles peut-être disparu, elles étaient assez habituelles notamment dans les prépas littéraires, il suffit de tout chiffrer strictement au barème qui ne repose pas que sur les fautes d'orthographe et de grammaire "simples".
Mon père racontait qu'en khâgne à Henri IV qui n'était noté que -5 en début d'année était plutôt très bon par rapport au niveau de la classe.
Salut
J'ai modifié le message pour avoir une indentation correcte (en espérant que ce soit bon).
Merci ;-) Plus qu'à attendre le retour de @kurapikagon StatutMembre sur les 4 autres points ^_^"