Je trouve ça étonnant que ça compile. Pas de type de retour à main() ? c'est illégal en C++.
Et de fait :
edt@edt-thinkpad:21:09:~/tmp$ g++ -Wall -g -O0 etudiant.cpp -o etud
etudiant.cpp:97:6: warning: ISO C++ forbids declaration of ‘main’ with no type [-Wreturn-type]
main()
^
Bon, une fois corrigée cette légère bourdinette, le programme fonctionne "correctement" (pour autant que je puisse en juger). Bon, il y a des problèmes de présentation, ce qui n'est rien par rapport au code lui-même (qui souffre lui aussi de problème de présentation).
Accessoirement, voici une version un peu plus lisible avec des commentaires sur ce que je trouve limite ou qui présente un bug (il y en a un certain nombre).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
#include <iostream>
#include <cstdlib>
using namespace std;
class Etudiant
{
private:
char nom[50]; // NOPE (std) : std::string
char prenom[50]; // NOPE (std) : std::string
float tabnotes[10]; // NOPE (std) : std::vector
public:
void saisie(); // NOPE (bug) : cette fonction devrait être virtuelle
void affichage(); // NOPE (bug) : celle-là aussi
float moyenne();
int admis(); // NOPE (bug) : virtuelle again
int Exae_quo(Etudiant E); // NOPE (bug) : et encore celle-là
// NOPE (bug) : pas de destructeur virtuel ? On ne doit pas dériver cette classe
};
void Etudiant::saisie()
{
int i;
cout << "nom de l'etudiant: ";
cin >> nom;
cout << "prenom de l'étudiant: ";
cin >> prenom;
cout << "les 10 notes " << std::endl;
for(i=0;i<10;i++) {
cout << " donner la note " << i << " : ";
cin >> tabnotes[i];
}
}
float Etudiant::moyenne()
{
int i;
float tabnotes[10]; // NOPE (bug) : variable shadowing
float som = 0 ;
// NOPE (bug) :
// là tu crois que tu calcule la moyenne sur les notes de l'étudiant,
// et bien non : tu calcule la moyenne sur des notes au hasard - le
// tableau tabnotes[] étant celui que tu as défini juste au dessus.
for(i=0;i < 10 ; i++)
som += tabnotes[i];
return (som/10);
// et puis NOPE (std) : std::accumulate() divisé par la taille du std::vector
}
void Etudiant::affichage()
{
int i;
cout << "le nom : " << nom << endl;
cout << "le prenom : "<< prenom << endl ;
for(i=0;i<10;i++)
cout << " la note N°" << i << " est " << tabnotes[i] << endl;
// NOPE (std) : std::for_each sur le vecteur
}
int Etudiant::admis()
{
// NOPE (style) : pas besoin de préciser 'Etudiant::' ici
if (Etudiant::moyenne() >= 10)
return (1);
else
return (0);
}
// ex_aequo
int Etudiant::Exae_quo(Etudiant E)
{
// NOPE (style) : pas besoin de préciser 'Etudiant::' ici
// NOPE (style) : un nom de variable en majuscule ? pas beau
// NOPE (bug) : les float ne peuvent pas être comparés entre eux
// pour des raisons de précision du calcul.
if (Etudiant::moyenne() == E.moyenne())
return (1);
else
return (0);
}
//Les méthode qui sont à redefinir dans la classe Etudiant_en_Maitrise sont :saisie ,affichage ,admis , et exae_quo.
class Etudiant_en_Maitrise : public Etudiant
{
private:
float note_memoire;
public:
void saisiec(); // NOPE (bug) : pas le même nom que la fonction parent,
// qui n'est pas virtuelle de toute façon
void affichagec(); // NOPE (bug) : idem
int admisec(); // NOPE (bug) : idem
int Exae_quoec(Etudiant_en_Maitrise E); // NOPE (bug) : idem
};
void Etudiant_en_Maitrise ::saisiec()
{
Etudiant::saisie();
cout << "donnez la note du mémoire: ";
cin >> note_memoire;
}
void Etudiant_en_Maitrise::affichagec()
{
Etudiant::affichage();
cout << "La note Mémoire est: " << note_memoire << endl;
}
int Etudiant_en_Maitrise ::admisec()
{
// NOPE (style) : pas besoin de 'Etudiant::'
if ((Etudiant::moyenne()>=10) && (note_memoire >= 10))
return (1);
else
return (0);
}
// ex_aequo
int Etudiant_en_Maitrise::Exae_quoec(Etudiant_en_Maitrise E)
{
// NOPE (style) : pas besoin de 'Etudiant::'
// NOPE (bug) : comparaison de float interdites
if ((moyenne()== E.moyenne())&& (note_memoire == E.note_memoire))
return (1);
else
return (0);
}
int main()
{
Etudiant_en_Maitrise p;
p.saisie();
p.affichage();
p.moyenne();
p.admis();
p.saisiec();
p.affichagec();
p.admisec();
} |
Partager