Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Benoit AUGER--DUBOIS
L2_S1_ALGO_STRUCT_DONNEE
Commits
70cff044
Commit
70cff044
authored
Oct 28, 2021
by
Benoit AUGER--DUBOIS
Browse files
ajout tp3
parent
3f42735f
Changes
1
Hide whitespace changes
Inline
Side-by-side
Tp3/tp3.cpp
0 → 100644
View file @
70cff044
#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
*/
/*
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.
2) On utilisera la fonction free() pour désallouer un pointeur.
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.
}
// 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
;
etu2
.
binome
=
*
etu1
;
}
else
{
// etu2 avait un binome il faut désallouer le pointeur de son binome.
etu1
.
binome
=
*
etu2
;
etu2
.
binome
->
binome
=
free
();
// permet d'éviter que 2 étudiant soit en binome avec etu2 en même temps.
etu2
.
binome
=
*
etu1
;
}
}
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
;
etu1
.
binome
->
binome
=
free
();
// permet d'éviter que 2 étudiant soit en binome avec etu1 en même temps.
etu1
.
binome
=
*
etu2
;
}
else
{
// etu2 et etu1 avait un binome il faut désallouer le pointeur de son binome.
etu1
.
binome
->
binome
=
free
();
etu2
.
binome
->
binome
=
free
();
etu1
.
binome
=
*
etu2
;
etu2
.
binome
=
*
etu1
;
}
}
}
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
){
etu
.
binome
->
binome
=
free
();
etu
.
binome
=
free
();
}
}
/* 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
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment