Commit 77f0c2fc authored by Benoit AUGER--DUBOIS's avatar Benoit AUGER--DUBOIS
Browse files

tp corrigé

parent cc866edf
#include <iostream>
#include <string> // permet l'utilisation du type string.
using namespace std;
/*
Auger-Dubois benoit et ATALLA Fadia groupe 385L
*/
/*******************************************************************************/
// type t_etudiante représentant ces informations personnelles et son binome.
struct t_etudiant{
int numEtu; // numéro de l'étudiant.
string nom;
t_etudiant *binome; // pointeur vers l'étudiant binôme.
};
/*******************************************************************************/
// procedure qui demande a l'utilisateur d'entrer le nom de l'étudiante puis l'assigne a la structure.
void rename(t_etudiant &etu){
cout << "Entrer le nom de l'étudiante : " << endl;
cin.clear(); // permet d'éviter les bugs avec getline.
cin.sync(); // permet d'éviter les bugs avec getline.
cin.ignore();// permet d'éviter les bugs avec getline.
getline (cin,etu.nom); // permet a l'utilisateur de faire des espaces dans la saisie
}
//procedure pour former un binome
void formBinome(t_etudiant &etu1, t_etudiant &etu2){
etu1.binome = &etu2;
etu2.binome = &etu1;
}
//procedure afficher les inforamtions de l'etudiant
void affichEtu(t_etudiant etu){
cout << "numero etudiant: " << etu.numEtu << endl;
cout << "nom etudiant: " << etu.nom << endl;
cout << "binome avec: " << etu.binome->nom << endl;
}
// désalouer les pointeurs des étudiants du binome.
void destructBinome(t_etudiant &etu){
etu.binome = nullptr;
}
//fonction pour tester si un étudiant est en binome.
bool isBinome(t_etudiant etu){
return etu.binome != nullptr;
}
// fonction qui verifie si le numéro d'étudiant donné est dans la liste des numéro existant
int findIndiceEtu(int nb, t_etudiant* etu, int tailleTab){
for (int indice=0 ; indice < tailleTab; indice++ ){
if (etu->numEtu == nb){
return indice; // si le numéro de l'étudiant éxiste on le retourne
}
etu += 1;
}
return -1; // si le numéro de l'étudiant n'éxiste pas on retourne -1
}
/***********************************************************************************************/
int main(){
int nb_etu;
cout << "Saisir le nombre d'etudiants dans le groupe: " << endl;
cin >> nb_etu;
if (nb_etu > 0){
t_etudiant *etu_gr = new t_etudiant[nb_etu]; // Allocation du tableau dynamique de taille nb_etu.
// on crée les étudiants du groupe
for (int i =0; i<nb_etu; i++){
cout << "Saisir le numero l'etudiant " << i+1 << " :" << endl;
cin >> etu_gr[i].numEtu;
// nomme l'étudiant
rename(etu_gr[i]);
etu_gr[i].binome = nullptr;
}
/* variable utile pour la création des binomes lors de la saisie des numéro étudiants,
initialisé a 0 pour entrer dans la boucle une première fois. */
int num_etu1 = 0;
int num_etu2 = 0;
// variable utile pour la création des binomes permet de vérifié a qu'elle indice les numéro étudiant correspondent dans le tableau d'étudiant.
int indice1 = -1;
int indice2 = -1;
if (nb_etu > 1){
/* Formation des binomes, nous ne mettons pas en condition d'arrêt un itrérateur qui s'arrête a la moitié de l'effectif des étudiants
car nous voulons que l'utilisateur arrête par lui même quand il le souhaite. */
while (num_etu1 != -1 || num_etu2 != -1){
cout << "Pour construire un binome, Saisir le numero de l'etudiant puis celui de son binome, (Saisir -1 pour arreter)!" << endl;
cout << "Saisir le numéro de l'étudiant que vous voulez mettre en binome : " << endl;
cin >> num_etu1;
if (num_etu1 < 0) // si -1 est entrée on sort de la boucle.
break;
cout << "Saisir le numéro de son binome : " << endl;
cin >> num_etu2;
if (num_etu2 < 0) // si -1 est entrée on sort de la boucle.
break;
// vérifie que les numéro donné sont valide.
indice1 = findIndiceEtu(num_etu1,etu_gr,nb_etu);
indice2 = findIndiceEtu(num_etu2,etu_gr,nb_etu);
if ( indice1 != -1 && indice2 != -1 && indice1 != indice2){
// verifie que les étudiants donnée ne sont pas deja en binome.
if ( !isBinome(etu_gr[indice1]) && !isBinome(etu_gr[indice2]) ){
formBinome(etu_gr[indice1],etu_gr[indice2]);
} else {
cout << "Au moins 1 de ces étudiants est deja en binome " << endl;
}
} else {
cout << "ces numéro sont invalide " << endl;
}
}
} else {
cout << "il n'y a qu'un étudiant, on ne peux pas former de binome" << endl;
}
cout << "affichage des binomes : " << endl;
// tableau et bool utile pour eviter les doublons
int *tab_nu = new int[nb_etu];
int *tab_nu_binome = new int[nb_etu];
// initialisation avec des valeur invalid pour évité les "uninitialised value error"
for (int i = 0; i < nb_etu ; i++){
tab_nu[i] = -1;
tab_nu_binome[i] = -1;
}
bool estAffiche;
for (int b=0; b < nb_etu; b++){
// on verifie si un étudiant a deja été afficher pour eviter les doublons
estAffiche = false;
for (int i = 0; i < nb_etu ; i++){
if (tab_nu[i] == etu_gr[b].numEtu || tab_nu_binome[i] == etu_gr[b].numEtu){
estAffiche = true;
}
}
// si l'étudiant a un binome et qu'il n'a pas deja été afficher on affiche sont binome
if ( isBinome(etu_gr[b]) && !estAffiche){
affichEtu(etu_gr[b]);
// stock les numéro afficher pour éviter les doublons
tab_nu[b] = etu_gr[b].numEtu;
tab_nu_binome[b] = etu_gr[b].binome->numEtu;
}
}
delete [] tab_nu; // Désallocation du tableau dynamique tab_nu.
delete [] tab_nu_binome; // Désallocation du tableau dynamique tab_nu_binome.
// affiche les étudiants sans binome
cout << "Première affichage des étudiants sans binome : " << endl;
for (int b=0; b<nb_etu; b++){
// si l'étudiant n'a pas de binome
if ( !isBinome(etu_gr[b]) ){
cout << "Sans binome: " << etu_gr[b].nom << endl;
}
}
// détruit tous les binomes existant
for (int i = 0; i < nb_etu; i++){
destructBinome(etu_gr[i]);
}
cout << "Deuxième affichage des étudiants sans binome : " << endl;
// affiche les étudiants sans binome
for (int b=0; b<nb_etu; b++){
// si l'étudiant n'a pas de binome
if ( !isBinome(etu_gr[b]) ){
cout << "Sans binome: " << etu_gr[b].nom << endl;
}
}
delete [] etu_gr; // Désallocation du tableau dynamique etu_gr.
} else {
cout << "Le groupe doit contenir au moins 1 etudiant" << endl;
}
return 0;
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment