Problème sur les chaines de caractères

Fermé
rejane.b32 Messages postés 1 Date d'inscription lundi 2 janvier 2017 Statut Membre Dernière intervention 2 janvier 2017 - Modifié par Chris 94 le 2/01/2017 à 17:58
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 2 janv. 2017 à 21:55
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.

#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:

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
2 janv. 2017 à 21:55
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
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);
0