Problème sur les chaines de caractères
rejane.b32
Messages postés
1
Date d'inscription
Statut
Membre
Dernière intervention
-
Dalfab Messages postés 706 Date d'inscription Statut Membre Dernière intervention -
Dalfab Messages postés 706 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un exercice en c++ où on me demande de creer des classe avec des ajouts d'élèves, de notes et les moyennes. Cependant mon code bloque, je ne sais pas si c'est au niveau de creerEleves ou au niveau de la chaine de caractere dans le int main.
Je suis débutante et je ne comprend rien à ce que j'ai fais, pardon d'avance ça risque de vous piquer les yeux.
J'ai un exercice en c++ où on me demande de creer des classe avec des ajouts d'élèves, de notes et les moyennes. Cependant mon code bloque, je ne sais pas si c'est au niveau de creerEleves ou au niveau de la chaine de caractere dans le int main.
Je suis débutante et je ne comprend rien à ce que j'ai fais, pardon d'avance ça risque de vous piquer les yeux.
#include <iostream> #include <cstdlib> #include <string.h> #include <stdio.h> #define MAXN 26 /* Note */ #define MAXS 15 /* prenom*/ #define MAXE 42 /* eleve*/ using namespace std; //Declaration structure Eleve struct Eleve { char *prenom[MAXS]; //prenom de l'élève float tab[MAXN]; //tableau contenant les notes de l'élève int nbnotes; //nombre de note qu'a l'élève float note; // note de l'élève float moyenne; //moyenne de l'eleve float somme; //somme des notes pour calculer la moyenne }; //Declaration structure Classe struct Classe { char nomClasse; //nom de la classe char tabEleves[MAXE]; //tableau contenant chaque élève int nbeleves; //nombre d'élèves dans la classe float nbElevesMoyenne; // nombre d'élève ayant des notes pour calculer la moyenne float sommeClasse; // somme des moyennes des élèves de la classe pour calculer la moyenne float moyenneClasse; // moyenne de la classe }; //Fonction pour créer une classe Vide Classe ClasseVide() { Classe c; //nom de la classe c.nbeleves=0; //dans la classe c, il n'y a pas d'élèves return c; // retourne la classe } //Renvoie true si la classe n'a aucun eleve, false sinon bool estVide(Classe c) { return (c.nbeleves==0);// si il n'y a pas d'élèves, ça renvoie true } //Renvoie true si l'eleve n'a aucune note, false sinon bool aucuneNote(Eleve e) { return (e.nbnotes==0); // si il n'y a pas de note, ça renvoie true } //Creer un eleve avec son prénom et aucune note dans son tableau de notes Eleve creerEleve(char *prenom[]) { Eleve e; e.nbnotes = 0; strcpy(*e.prenom, *prenom); //fonction pour l'affectation de chaines de caracteres /* puts(*e.prenom); */ return e; } //Ajouter une note a l'eleve void ajouterNote(Eleve &e, float note) { if ( e.note>=0 && e.note<=20)//vérifies si la note est bien entre 0 et 20 { e.nbnotes ++; //ajoute une case vide au tableau pour pouvoir ajouter la note e.tab[e.nbnotes-1] = e.note; // ajoute la note dans la case vide } else // si la note est en dessous de 0 ou au dessus de 20, affiche "Note invalide" { cout<<"Note invalide !"<<endl; } } //Calcul de la moyenne d'un élève - renvoie la moyenne des notes de l'élève si l'élève a des notes - renvoie -1 si l'élève n'a pas de notes float moyenne(Eleve e) { int i; // sert à parcourir le tableau if (!aucuneNote(e))//verifie que l'eleve a au moins une note pour faire la moyenne { e.somme=0; // initialisation de la somme à 0 for (i=0 ; i<e.nbnotes ; i++)//je parcours le tableau pour faire la somme des notes { e.somme=e.somme+e.tab[i]; // ajoute la note à la somme } e.moyenne=e.somme/e.nbnotes;//divise la somme par le nombre de notes return e.moyenne; // retourne la moyenne de l'élève } else // si l'élève n'a pas de note, on ne calcule pas sa moyenne { return -1; // retourne -1 si l'eleve n'a pas de note } } //Renvoie la moyenne des moyennes des étudiants de la classe - renvoie -1 s'il n'y a pas d'étudiants dans la classe ou si aucun étudiant n'a de note float moyenneClasse(Classe c, Eleve e) { if (!estVide(c)) // vérifie que la classe n'est pas vide pour calculer la moyenne { for(int i=0 ; i<c.nbeleves ; i++) //parcourt le tableau contenant chaque élève { if (aucuneNote==false)//vérifie que l'élève a des notes { c.nbElevesMoyenne++; //ajoute 1 à la somme des élèves qui ont une moyenne c.sommeClasse= c.sommeClasse+e.moyenne; // calcule la somme permettant de calculer la moyenne } else // si l'eleve n'a pas de note { return -1; // retourne -1 si la classe est vide } } c.moyenneClasse=c.sommeClasse/c.nbElevesMoyenne; // calcule la moyenne de la classe grace à la somme des moyennes des élèves et au nombre d'élèves ayant une moyenne return c.moyenneClasse; //retourne la moyenne de la classe } else// si la classe est vide on ne calcule pas sa moyenne { return -1; // retourne -1 si la classe est vide } } //Ajouter un eleve a la classe //Doit ajouter l'eleve suivant sa moyenne //la plus grande moyenne est a l'indice 0 void ajouterEleve(Classe &c, Eleve &e) { int j, tmp, i; //initialisation de variables permettant de faire un tri for (int i = 1; i <c.nbeleves; i++) //Parcourt le tableau de la classe { c.nbeleves++; //ajoute une case vide au tableau pour pouvoir ajouter un élève c.tabEleves[c.nbeleves-1] = e.tab[e.nbnotes]; // je pense pas que ce soit e.prenom[e.prenom] tmp = c.tabEleves[i]; // variable temporaire permettant d'inverser 2 cases du tableau en stockant la variable j=i-1; //variable temporaire permettant d'inverser 2 cases du tableau while(j>=0 && c.tabEleves[j] < tmp) //Boucle pour inverser seulement si la case de droite est supérieure à la case de gauche { c.tabEleves[j+1]=c.tabEleves[j]; // fait passer la case de droite dans celle de gauche c.tabEleves[j]=tmp; // prend la valeur stockée j--; //diminue le j afin de pouvoir sortir de la boucle } } } // A REVOIR //Renvoie la classe de l'annee suivante : les etudiants qui ont plus de 10 de moyenne Classe ClasseProchaine(Classe c1, Classe c2) { Eleve e; Classe c; ClasseProchaine(c1, c2)= ClasseVide(); //Creer une classe vide for (int k=0 ; k<c1.nbeleves ; k=k+1)//parcourir chaque classe c1 et c2 : { //ajouter chaque eleve ayant une moyenne >=10 dans la nouvelle classe if (e.moyenne>=10) { ajouterEleve(c, e); } } for (int h=0 ; h<c2.nbeleves ; h=h+1) { if (e.moyenne>=10) //ajouter chaque eleve ayant une moyenne >=10 dans la nouvelle classe { ajouterEleve(c, e); } } } //Afficher Eleve //Affiche un eleve, sa moyenne et ses notes void afficherEleve(Eleve e) { cout<<e.prenom<<" : "; cout<<"Moyenne : "<<moyenne(e)<<endl; cout<<"Notes : "; for (int i=0; i < e.nbnotes; i++) { cout<<e.note<<" "; } cout<<endl; } //afficher Classe //affiche une classe, son nb d'etudiants, sa moyenne puis les caracteristiques de chaque eleve qui y est void afficherClasse (Classe c) { Eleve e; cout<<"La classe a "<<c.nbeleves<<"eleves."<<endl; cout<<"La moyenne de la classe est : "<<moyenneClasse(c, e)<<endl; cout<<"Les eleves de la classe sont : "<<endl; for (int i =0; i < c.nbeleves; i++) { afficherEleve(e); } cout<<endl; } int main() { //Creer des eleves et les afficher creerEleve("Tiphaine"); ajouterNote("e", 12); ajouterNote("e", 8); ajouterNote("e", 10); afficherEleve("Tiphaine"); creerEleve("Bernard"); ajouterNote("e", 6); ajouterNote("e", 8); ajouterNote("e", 9); ajouterNote("e", 7); ajouterNote("e", 10); afficherEleve("Bernard"); creerEleve("Mickael"); ajouterNote("e", 10); ajouterNote("e", 8); ajouterNote("e", 6); ajouterNote("e", 12); ajouterNote("e", 10); ajouterNote("e", 11); ajouterNote("e", 9); ajouterNote("e", 13); afficherEleve("Mickael"); creerEleve("Paul"); ajouterNote("e", 8); ajouterNote("e", 11); ajouterNote("e", 9); ajouterNote("e", 7); ajouterNote("e", 10); ajouterNote("e", 9); afficherEleve("Paul"); creerEleve("Sarah"); ajouterNote("e", 13); ajouterNote("e", 15); ajouterNote("e", 14); ajouterNote("e", 15); ajouterNote("e", 14); ajouterNote("e", 13); ajouterNote("e", 17); afficherEleve("Sarah"); creerEleve("Zoe"); ajouterNote("e", 8); ajouterNote("e", 5); ajouterNote("e", 7); ajouterNote("e", 10); afficherEleve("Zoe"); creerEleve("Fanny"); ajouterNote("e", 17); ajouterNote("e", 19); ajouterNote("e", 16); ajouterNote("e", 18); ajouterNote("e", 19); ajouterNote("e", 17); afficherEleve("Fanny"); creerEleve("Martine"); ajouterNote("e", 13); ajouterNote("e", 11); ajouterNote("e", 14); ajouterNote("e", 17); ajouterNote("e", 12); afficherEleve("Martine"); //Creer des classes et les afficher // ou avec un if et la fonction moyenne pour savoir lesquels on 1 moyenne au dessus de 10 ? ClasseVide(); ajouterEleve(c1, "Tiphaine"); ajouterEleve(c1, "Fanny"); ajouterEleve(c1, "Bernard"); ajouterEleve(c1, "Mickael"); ajouterEleve(c1, "Zoe"); afficherClasse(c1); ClasseVide(); ajouterEleve(c2, "Paul"); ajouterEleve(c2, "Sarah"); ajouterEleve(c2, "Martine"); afficherClasse(c2); /* ClasseProchaine(c1,c2);//Creer la super classe et l'afficher afficherClasse(c); */ system("pause"); return EXIT_SUCCESS; }
A voir également:
- Problème sur les chaines de caractères
- Recherche automatique des chaînes ne fonctionne pas - Guide
- Caractères ascii - Guide
- Caractères spéciaux - Guide
- Caractères spéciaux mac - Guide
- Caracteres speciaux - Guide
1 réponse
Bonjour,
En effet, ça pique les yeux. Cela doit déjà faire mal au compilateur qui doit indiquer des warnings et des erreurs qu'il faut lire et prendre en compte.
Quand on définit des fonctions, il faut utiliser les paramètres attendus.
Exemple, pourquoi ces étoiles dans creerEleve, faire plutôt
et dans le main :
En effet, ça pique les yeux. Cela doit déjà faire mal au compilateur qui doit indiquer des warnings et des erreurs qu'il faut lire et prendre en compte.
Quand on définit des fonctions, il faut utiliser les paramètres attendus.
Exemple, pourquoi ces étoiles dans creerEleve, faire plutôt
Eleve creerEleve(const char prenom[]) { Eleve e; e.nbnotes = 0; strcpy(e.prenom, prenom); //fonction pour l'affectation de chaines de caracteres return e; }
et dans le main :
Eleve e = creerEleve("Tiphaine"); ajouterNote(e, 12); ajouterNote(e, 8); ajouterNote(e, 10); afficherEleve(e);