tp3.cpp 7.52 KB
Newer Older
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
1
2
3
4
5
6
7
8
#include <iostream>
#include <string> // permet l'utilisation du type string.
#include <vector> // permet d'utiliser des tableaux dynamiques.
using namespace std;
/*
Auger-Dubois benoit et Atalla Fadia groupe 385K
*/

Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
9

Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
10
11
12
13
/* 
Explication d'élément du code :
1) Nous allons utilisé le type string plutôt que le tableau de caractères
pour pouvoir utiliser la fonction getline, afin d'utiliser des espaces lors d'une saisie.
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
14
2) On utilisera delete pour désallouer un pointeur.
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
15
16
17
18
19
20
21
22
23
3) On utilisera les vector comme tableaux dynamique.
 */

// type t_etudiante représentant ces informations personnelles et son binome.
struct t_etudiante {
    int nu_etu; // numéro de l'étudiant.
    string nom_prenom;
    t_etudiante* binome; // pointeur vers l'étudiant binôme.
    bool isBinome; // vrai quand l'étudiant possède un binome faux sinon, permet de gérer l'affectation des binomes efficacement.
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
24
};
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

// fonction qui demande a l'utilisateur d'entrer le nom de l'étudiante puis l'assigne a la structure.
void changeEtuName (t_etudiante &etu){
    cout << "Entrer le nom et le prénom de l'étudiante." << endl;
    getline(cin,etu.nom_prenom); // utilisation de getline pour prendre en compte les espaces.
}

/* forme un binome de 2 étudiantes a l'aide de pointeurs, on part du principe qu'un étudianr peut avoir 1 seul binome
et qu'il n'est pas en binôme avec lui même. */

void formBinome (t_etudiante &etu1 , t_etudiante &etu2){
    if (*etu1 != *etu2){ // verifie si les pointeurs ont des références mémoirs différentes.
        if (etu1.isBinome == false){ // vérifie si etu1 n'a pas de binome
            if (etu2.isBinome == false ){ // vérifie si etu2 n'a pas de binome
                // aucun des étudiant n'avait de binome cas simple.
                etu1.binome = *etu2;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
41
                etu1.isBinome = true;
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
42
                etu2.binome = *etu1;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
43
                etu2.isBinome = true;
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
44
45
46
            } else {
                // etu2 avait un binome il faut désallouer le pointeur de son binome.
                etu1.binome = *etu2;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
47
48
                etu1.isBinome = true;
                etu2.binome->isBinome = false;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
49
                delete etu2.binome->binome; // permet d'éviter que 2 étudiant soit en binome avec etu2 en même temps.
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
50
                etu2.binome = *etu1;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
51
                etu2.isBinome = true;
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
52
53
54
55
56
57
            }
        } else {
            // etu1 avait un binome il faut désallouer le pointeur de son binome.
            if (etu2.isBinome == false){
                // etu 2 n'avait pas de binome.
                etu2.binome = *etu1;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
58
59
                etu2.isBinome = true;
                etu1.binome->isBinome = false
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
60
                delete etu1.binome->binome; // permet d'éviter que 2 étudiant soit en binome avec etu1 en même temps.
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
61
                etu1.binome = *etu2;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
62
                etu1.isBinome = true;
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
63
64
            } else {
                // etu2 et etu1 avait un binome il faut désallouer le pointeur de son binome.
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
65
                etu1.binome->isBinome = false;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
66
                delete etu1.binome->binome;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
67
                etu2.binome->isBinome = false;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
68
                delete etu2.binome->binome;
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
69
                etu1.binome = *etu2;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
70
                etu1.isBinome = true;
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
71
                etu2.binome = *etu1;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
72
                etu2.isBinome = true;
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
            }
        }

    } else {
        cout << "Ces étudiants sont identiques, on ne peut pas avoir un binome avec un seul étudiant ! " << endl;
    }

}


void affBinome (t_etudiante etu){
    if ( etu.isBinome == true){
    cout << "Binôme : " << etu.nom_prenom << " est avec : " << 
    etu.binome->nom_prenom << endl;
    } else {
        cout << " Sans binôme : " << etu.nom_prenom << endl;
    }
}

// désalouer les pointeurs des étudiants du binome.
void breakBinome (t_etudiante &etu){
    if (etu.isBinome){
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
95
        etu.binome->isBinome = false;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
96
97
        delete etu.binome->binome;
        delete etu.binome;
Benoit AUGER--DUBOIS's avatar
ajout    
Benoit AUGER--DUBOIS committed
98
        etu.isBinome = false;
Benoit AUGER--DUBOIS's avatar
Benoit AUGER--DUBOIS committed
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
    }
}

/* compte le nombre d'occurence d'un entier dans un tableau dynamique d'entier
utile pour ne pas afficher 2 fois le même binome dans le main. */ 
int countInTab(int test, vector<int> tab){
    int count = 0;
    for (int i = 0 ; i <= tab.size() ; i++){
        if ( tab[i] == test){
            count ++;
        }
    }
    return count;
}

// affiche les binomes sans doublons d'un groupe d'étudiants contenu dans un tableau dynamique
void affTabEtu (t_etudiante etu){
    vector<int> tabMemorize2; // tableau utile pour l'affichage des binomes sans doublons, mémorize les numéros étudiants deja affichés.
        for (int y = 0; y < etu.size() ; y++){
            tabMemorize2.push_back(etu[y].nu_etu); // la place dans le tableau est arbitraire, seuls les valeurs nu.etu m'intérèsse.
            tabMemorize2.push_back(etu[y].binome->nu_etu);
            // évite d'afficher 2 fois le même binome
            if (countInTab(tabEtu[y].nu_etu, tabMemorize2) < 2 &&  countInTab(tabEtu[y].binome->nu_etu, tabMemorize2) < 2){
            affBinome(tabEtu[y]);
            }
        }
}

// permet a l'utilisateur d'ajouter le numéro de l'étudiant, vérifie si le numéro est valide.
void addNumEtu (t_etudiante &etu, vector <int> memo){
    int temp;
    cout << "entrer le numéro de l'étudiant : " << endl;
    cin >> temp;
    if (temp > 0 && countInTab(temp,memo) == 0){
        etu.nu_etu = temp;
    } else {
        cout << "Ce numéro est invalide, un numéro valide est supérieur a 0 et unique " << endl;
    }
}

int main(){
    int const numberOfStudents;
    cout << "Entrer le nombres d'étudiant du groupe" << endl;
    cin >> numberOfStudents;
    if (numberOfStudents > 0){
    vector<t_etudiante> tabEtu (numberOfStudents); // création du tableau dynamique aussi appelée vector.
    vector<int> tabMemorize; // mémorize les numéros étudiants deja affichés.
        for (int i = 0; i < tabEtu.size() ; i++){ // remplis le tableaux d'étudiants d'information sur les étudiants.
            addNumEtu(tabEtu[i],tabMemorize);
            changeEtuName(tabEtu[i]);
        }
        if ( tab.Etu.size() > 1){ // verifie que l'on peux former au moins 1 binome.
            int etuT1,etuT2 = 0;
            while (etuT1 != -1 && etuT2 != -1)){
                    cout << "entrer le numéro du premier étudiant du binome, ou -1 pour arrêter " << endl;
                    cin >> etuT1;
                    cout << "entrer le numéro du deuxième étudiant du binome, ou -1 pour arrêter " << endl;
                    cin >> etuT2;
                    // vérifie que les numéros éxiste dans le groupe d'étudiant
                    if (countInTab(etuT1,tabMemorize) > 0 && countInTab(etuT2,tabMemorize) > 0){
                    formBinome(etuT1,etuT2);
                    } else {
                        cout << "c'est numéro ne sont pas dans le groupe" << endl;
                    }
            }
        } else {
            cout << "il n'y a qu'un étudiant, on ne peux pas former de binome" << endl;
          }
        //affiche les binomes du groupe sans doublons.
        affTabEtu(tabEtu);

        // détruit tous les binome existant en désallouant les pointeurs.
        for (int y = 0; y < tabEtu.size() ; y++){
            if (tabEtu[y].isBinome == true){
                tabEtu[y].binome->binome == free(); // désaloue le pointeur du binome.
                tabEtu[y].binome = free(); // désaloue le pointeur de l'étudiant.
            }
        }

        //affiche les binomes du groupe sans doublons.
        affTabEtu(tabEtu);

    } else { // si nombre d'étudiants <= 0.
        cout << "Il doit avoir au moins 1 étudiants ! " << endl;
      }
    return 0;
}