All pastes #775033 Raw Edit

Stuff

public c v1 · immutable
·published 2007-11-15 13:41 UTC
rendered paste body
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <errno.h>#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;i<nbCours;i++){		if ((*ptrCotes) < 10) {			(*unResultat).grade= R;			return;		}	}		if((*unResultat).moyenne<12)		(*unResultat).grade= R;	else if((*unResultat).moyenne<14)		(*unResultat).grade= S;	else if((*unResultat).moyenne<16)		(*unResultat).grade= D;	else if((*unResultat).moyenne<18)		(*unResultat).grade= G;	else if((*unResultat).moyenne<19)		(*unResultat).grade= P;	else (*unResultat).grade= F;	}void afficheBulletin(char ** intitulesCours,resultat* unResultat){	int i;	char * txtGrade[]={"Satisfaction","Distinction","Grande Distinction","La Plus Grande Distinction","La Plus Grande Distinction avec les Félicitations du Jury","Ajourné"};	printf("+-------+----------------- - - - \n");	for(i=0;i<nbCours;i++){		printf("| %2.2f | %s\n",unResultat->cotes[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<nbCours;i++){		printf("le cours nr %d : %s\n",(i+1),intitulesCours[i]);	}		while ((uneLigne=lireString(""))!=NULL){		char * nom,*prenom,*cotes;		etudiant unEtudiant;		resultat unResultat;				nom = strtok (uneLigne, ":");		prenom = strtok (NULL, ":");		cotes = strtok (NULL, ":");		unEtudiant =creeEtudiant((++nbEtudiants), nom, prenom);		unResultat=creeResultat(&unEtudiant,cotes);		calculeGrade(&unResultat);		printf("nom : %s\n prenom : %s\n cotes : %s\n grade : %d\n",unEtudiant.nom,unEtudiant.prenom,cotes,unResultat.grade);		afficheBulletin(intitulesCours,&unResultat);	}	return EXIT_SUCCESS;}