#include #include #include #include #include #define MAX_COURS 20 #define BUFFER_SIZE 256 /*------Les Enumeres*/ typedef enum lesGrades {S,D,G,P,F,R} lesGrades; /*-------Les Structures---------*/ typedef struct etudiant{ char * nom; char * prenom; int num; } etudiant; typedef struct resultat{ etudiant etudiant; float cotes[MAX_COURS]; float moyenne; lesGrades grade; } resultat; /*****Les variables globales*******/ int nbCours=0; int nbLignes=0; /** * Attention, fonctionne seulement avec les nombres positifs */ double charEtoileToDouble(char * string) { char * endptr; double nb; if(strlen(string) == 0){ perror("erreur : aucun nombre introduit\n\n"); return -1; } nb = strtod(string, &endptr); if((nb == HUGE_VAL || nb == -HUGE_VAL) && errno == ERANGE){ perror("erreur : overflow ou underflow\n\n"); errno = 0; return -1; } if((*endptr != '\0')&&(*endptr != 13)){ printf("erreur : il faut entrer que des nombres\n\t vous avez entré %d\n",*endptr); return -1; } return nb; } char * lireString(const char * string) { char buffer[BUFFER_SIZE]; char * laStringLue; while(printf("%s", string),fgets(buffer, BUFFER_SIZE, stdin) != NULL) { /*si le dernier char n'est pas \n --> nombre trop long pour le buffer*/ /*on doit vider le buffer du système*/ if(buffer[strlen(buffer)-1] != '\n'){ printf("erreur : vous ne pouvez introduire qu'au maximum %d caractères\n\n", BUFFER_SIZE-2); while(fgets(buffer, BUFFER_SIZE, stdin), buffer[strlen(buffer)-1] != '\n'); continue; } /*if(strlen(buffer) == 1){ printf("erreur : ligne vide\n\n"); continue; }*/ buffer[strlen(buffer)-1]='\0'; laStringLue=(char*) malloc(1+(strlen(buffer)*sizeof(char))); strcpy(laStringLue,buffer); nbLignes++; return laStringLue; } return NULL; } /* toutes les valeurs de la structures sont renvoyées*/ etudiant creeEtudiant(int nrOrdre, char * nom, char * prenom){ etudiant unEtudiant={nom,prenom,nrOrdre}; return unEtudiant; } etudiant creeEtudiant2(int nrOrdre, char * nom, char * prenom){ etudiant * unEtudiant; unEtudiant=(etudiant *) malloc(sizeof(etudiant)); unEtudiant->num=nrOrdre; unEtudiant->nom=nom; unEtudiant->prenom=prenom; return * unEtudiant; } resultat creeResultat(etudiant* unEtudiant,char * cotes){ resultat unResultat={*unEtudiant,{},0,0}; float cote; char * endptr; int nbCotes; fprintf(stdout,"Je cré le résultat\n"); fprintf(stdout,"Les cotes sont : %s\n",cotes); for(( cote = strtod(cotes, &endptr));*endptr;(cote = strtod(endptr, &endptr))){ if (nbCotes>=nbCours){ fprintf(stderr,"Syntax Error à la ligne %d : l'étudiant à trop de cotes\n",nbLignes); exit(EXIT_FAILURE); } if (*endptr!=' ' && *endptr!='\0'){ fprintf(stderr,"Erreur de Syntaxe à la ligne %d\n",nbLignes); exit(EXIT_FAILURE); } if ((cote<0)||(cote>20)) { fprintf(stderr,"Syntax Error at line %d : Cote invalide",nbLignes); exit(EXIT_FAILURE); } *(unResultat.cotes+nbCotes)=cote; unResultat.moyenne+=cote; /*fprintf(stdout,"moyenne : %f *ptr_cotes : %f\n",unResultat.moyenne,cote);*/ nbCotes++; } *(unResultat.cotes+nbCotes)=cote; unResultat.moyenne+=cote; nbCotes++; unResultat.moyenne/=nbCours; return unResultat ; } resultat creeResultat2(etudiant* unEtudiant,char * cotes){ resultat * unResultat; float * ptr_cotes; char * token; float cote; unResultat=(resultat *) malloc(sizeof(resultat)); (*unResultat).etudiant=*unEtudiant; ptr_cotes=(* unResultat).cotes; /*utiliser strtod*/ for((token=strtok(cotes," "));token;token=strtok(NULL," ")){ cote=(float)charEtoileToDouble(token); if ((cote<0)||(cote>20)) { fprintf(stderr,"Syntax Error at line %d : Cote invalide\n",nbLignes); exit(-1); } *ptr_cotes=cote; (* unResultat).moyenne+=*ptr_cotes; ptr_cotes++; } (* unResultat).moyenne/=nbCours; return *unResultat ; } void calculeGrade(resultat* unResultat){ int i; float * ptrCotes= (*unResultat).cotes; /*parcours les cotes a la recherche d'un echec*/ for (i=0;icotes[i],*(intitulesCours+i)); } printf("+-------+----------------- - - - \n"); printf("\t\tMoyenne : %0.2f grade : %s\n",unResultat->moyenne,txtGrade[(*unResultat).grade]); } int main(int argc, char ** argv){ char * intitulesCours[MAX_COURS]; char * uneLigne; int i,nbEtudiants; printf("\tLes Structures en C\n\t-------------------\n"); /* un while tant que ligneLue !=vide) metre en table la ligne 2ième boucle tant que différent de fin de fichier décomposer la ligne creerEtud() creerRésultat calculGrade() afficher() */ while(strcmp((uneLigne=lireString("")),"")!=0){ if(nbCours>=MAX_COURS) { fprintf(stderr,"Overwork Error à la ligne %d : trop de cours\n",nbLignes); exit(EXIT_FAILURE); } intitulesCours[nbCours++]=uneLigne; /* printf("nb : %d cours : %s \n",nbCours,intitulesCours[nbCours-1]);*/ } for (i=0;i