tp développement c/c++ -...

14
TP Programmation C/C++ Les structures de données Correction © 2017 tv <[email protected]> v.1.1 Sommaire Types composés 2 Exercices : un long voyage 2 Inscription d’étudiants ........................................ 3 Recette secrète ............................................ 11 Mastermind .............................................. 11 Des histoires pour les enfants .................................... 12 Bilan 14 Les objectifs de ce tp sont de comprendre et mettre en oeuvre des structures de données. Certains exercices sont extraits du site www.france-ioi.org. Les critères d’évaluation de ce tp sont : – le minimum attendu : on doit pouvoir fabriquer un exécutable et le lancer ! – le programme doit énoncer ce qu’il fait et faire ce qu’il énonce ! – le respect des noms de fichiers – le nommage des fonctions et des variables, l’utilisation de constantes – une fonction doit énoncer ce qu’elle fait et faire seulement ce qu’elle énonce ! – les fonctions ne dépassent pas 15 lignes – le code est fonctionnel – la simplicité du code 1

Upload: others

Post on 22-Jun-2020

20 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

TP Programmation C/C++Les structures de données

Correction© 2017 tv <[email protected]> v.1.1

Sommaire

Types composés 2

Exercices : un long voyage 2Inscription d’étudiants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Recette secrète . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Mastermind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Des histoires pour les enfants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Bilan 14

Les objectifs de ce tp sont de comprendre et mettre en oeuvre des structures de données.Certains exercices sont extraits du site www.france-ioi.org.Les critères d’évaluation de ce tp sont :– le minimum attendu : on doit pouvoir fabriquer un exécutable et le lancer !– le programme doit énoncer ce qu’il fait et faire ce qu’il énonce !– le respect des noms de fichiers– le nommage des fonctions et des variables, l’utilisation de constantes– une fonction doit énoncer ce qu’elle fait et faire seulement ce qu’elle énonce !– les fonctions ne dépassent pas 15 lignes– le code est fonctionnel– la simplicité du code

1

Page 2: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

Types composés

Les types composés permettent de regrouper des variables au sein d’une même entité :– Il est possible de regrouper des variables de types différents dans des structures de données ;– Il est possible de regrouper des variables de types identiques dans des tableaux.- Une chaîne de caractères peut être considérée comme un type composé.En C, on dispose de trois types de structures de données :– les structures (struct)– les unions (union)– les champs de bitsLe C++ ajoute la notion de type classe qui permet de réaliser des programmes orientés objet (POO).La classe est le modèle (le « moule ») pour créer des objets logiciels.- En POO, un programme est vu comme un ensemble d’objets interagissant entre eux en s’échangeantdes messages.

Exercices : un long voyage

Votre voyage se passe bien mais il vous reste encore de longs jours de marche avant d’arriver à votredestination. Courage !+ Objectif : vous allez découvrir les structures de données en C et C++– Inscription d’étudiants : page 3– Recette secrète : page 11– Mastermind : page 11– Des histoires pour les enfants : page 12

TP Programmation C/C++ : structures et classes 2 / 14 © 2017 <[email protected]>

Page 3: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

Inscription d’étudiants

. Correction :#include <stdio.h>#include <stdbool.h>#include <ctype.h> /* pour toupper() et tolower() */#include <time.h> /* pour time() et localtime() */

#define MAX_FICHES 500#define LG_MAX 50

typedef struct{

char nom[LG_MAX+1];char prenom[LG_MAX+1];unsigned int age;char sexe;

} Fiche;

void inscrireEtudiants(Fiche *fiches, int nbFiches);int rechercherPlusJeune(Fiche *fiches, int nbFiches);int compterEtudiants(Fiche *fiches, int nbFiches, char sexe);void afficherEtudiants(Fiche *fiches, int nbFiches);void afficherEtudiant(int numero, Fiche *fiches, int nbFiches);void viderTampon();

int main(){

Fiche fiches[MAX_FICHES];int nbFiches;

scanf("%d", &nbFiches); viderTampon();

inscrireEtudiants(fiches, nbFiches);

printf("Nombre de femmes : %d\n", compterEtudiants(fiches, nbFiches, ’f’));

int numero = rechercherPlusJeune(fiches, nbFiches);

printf("Etudiant le plus jeune : ");afficherEtudiant(numero, fiches, nbFiches);

printf("Liste des étudiants :\n");afficherEtudiants(fiches, nbFiches);

return 0;}

void inscrireEtudiants(Fiche *fiches, int nbFiches){

Fiche fiche;int i;

TP Programmation C/C++ : structures et classes 3 / 14 © 2017 <[email protected]>

Page 4: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

for(i=0;i<nbFiches;i++){

printf("Nom : ");scanf("%50s", fiche.nom); viderTampon();printf("Prénom : ");scanf("%50s", fiche.prenom); viderTampon();printf("Sexe (f/m) : ");scanf("%c", &fiche.sexe); viderTampon();fiche.sexe = tolower(fiche.sexe);

while(fiche.sexe != ’m’ && fiche.sexe != ’f’){

if(fiche.sexe != ’m’ && fiche.sexe != ’f’){

printf("Saisie incorrecte !\n");printf("Sexe (f/m) : ");

}scanf("%c", &fiche.sexe);viderTampon();fiche.sexe = tolower(fiche.sexe);

}

printf("Age : ");scanf("%d", &fiche.age);

fiche.nom[0] = toupper(fiche.nom[0]);fiche.prenom[0] = toupper(fiche.prenom[0]);fiches[i] = fiche;//printf("%d. %s %s %d %c\n", i+1, fiches[i].nom, fiches[i].prenom, fiches[i].age,

fiches[i].sexe);}

}

int rechercherPlusJeune(Fiche *fiches, int nbFiches){

int numero = 0;int ageMin = fiches[0].age;int age;int i;

for(i=1;i<nbFiches;i++){

age = fiches[i].age;if(age < ageMin){

ageMin = age;numero = i;

}}

return numero;}

TP Programmation C/C++ : structures et classes 4 / 14 © 2017 <[email protected]>

Page 5: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

int compterEtudiants(Fiche *fiches, int nbFiches, char sexe){

int nb = 0;int i;

for(i=0;i<nbFiches;i++){

if(fiches[i].sexe == sexe){

++nb;}

}

return nb;}

void afficherEtudiants(Fiche *fiches, int nbFiches){

int i;int age = 0;

for(i=0;i<nbFiches;i++){

age = fiches[i].age;printf("%s %s %d %c\n", fiches[i].nom, fiches[i].prenom, fiches[i].age, fiches[i].

sexe);}

}

void afficherEtudiant(int numero, Fiche *fiches, int nbFiches){

int age = fiches[numero].age;

printf("%s %s %d %c\n", fiches[numero].nom, fiches[numero].prenom, fiches[numero].age,fiches[numero].sexe);

}

void viderTampon(){

int c;

while ((c = getchar()) != ’\n’ && c != EOF);}

inscription-etudiants-v1.c

#include <stdio.h>#include <stdbool.h>#include <ctype.h> /* pour toupper() et tolower() */#include <time.h> /* pour time() et localtime() */

#define MAX_FICHES 500#define LG_MAX 50#define LG_DATE 10 // jj/mm/aaaa

TP Programmation C/C++ : structures et classes 5 / 14 © 2017 <[email protected]>

Page 6: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

typedef struct{

int jour,mois,annee;

} Date;

typedef struct{

char nom[LG_MAX+1];char prenom[LG_MAX+1];Date dateNaissance;char sexe;

} Fiche;

void inscrireEtudiants(Fiche *fiches, int nbFiches);int lireDateDuJour(Date *aujourdhui);unsigned int calculerAge(const Fiche * const fiche, Date aujourdhui);int rechercherPlusJeune(Fiche *fiches, int nbFiches);int compterEtudiants(Fiche *fiches, int nbFiches, char sexe);void afficherEtudiants(Fiche *fiches, int nbFiches);void afficherEtudiant(int numero, Fiche *fiches, int nbFiches);void saisirDate(char *date);bool estBissextile(int aaaa);bool verifierDate(Date date);void viderTampon();

int main(){

Fiche fiches[MAX_FICHES];int nbFiches;

scanf("%d", &nbFiches); viderTampon();

inscrireEtudiants(fiches, nbFiches);

printf("Nombre de femmes : %d\n", compterEtudiants(fiches, nbFiches, ’f’));

int numero = rechercherPlusJeune(fiches, nbFiches);

printf("Etudiant le plus jeune : ");afficherEtudiant(numero, fiches, nbFiches);

printf("Liste des étudiants :\n");afficherEtudiants(fiches, nbFiches);

return 0;}

void inscrireEtudiants(Fiche *fiches, int nbFiches){

Fiche fiche;

TP Programmation C/C++ : structures et classes 6 / 14 © 2017 <[email protected]>

Page 7: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

char date[LG_DATE+1]; // jj/mm/aaaaint i;

for(i=0;i<nbFiches;i++){

printf("Nom : ");scanf("%50s", fiche.nom); viderTampon();printf("Prénom : ");scanf("%50s", fiche.prenom); viderTampon();printf("Sexe (f/m) : ");scanf("%c", &fiche.sexe); viderTampon();fiche.sexe = tolower(fiche.sexe);

while(fiche.sexe != ’m’ && fiche.sexe != ’f’){

if(fiche.sexe != ’m’ && fiche.sexe != ’f’){

printf("Saisie incorrecte !\n");printf("Sexe (f/m) : ");

}scanf("%c", &fiche.sexe);viderTampon();fiche.sexe = tolower(fiche.sexe);

}

saisirDate(date);sscanf(date, "%d %d %d", &fiche.dateNaissance.jour, &fiche.dateNaissance.mois, &

fiche.dateNaissance.annee);

fiche.nom[0] = toupper(fiche.nom[0]);fiche.prenom[0] = toupper(fiche.prenom[0]);fiches[i] = fiche;//printf("%d. %s %s %02d/%02d/%04d %c\n", i+1, fiches[i].nom, fiches[i].prenom,

fiches[i].dateNaissance.jour, fiches[i].dateNaissance.mois, fiches[i].dateNaissance.annee, fiches[i].sexe);

}}

int lireDateDuJour(Date *aujourdhui){

time_t ts = time(NULL);struct tm *temps;

temps = localtime(&ts);if (temps != NULL){

aujourdhui->jour = temps->tm_mday;aujourdhui->mois = temps->tm_mon;aujourdhui->annee = temps->tm_year + 1900;return 1;

}return 0;

}

TP Programmation C/C++ : structures et classes 7 / 14 © 2017 <[email protected]>

Page 8: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

unsigned int calculerAge(const Fiche * const fiche, Date aujourdhui){

unsigned int age = 0;

age = aujourdhui.annee - fiche->dateNaissance.annee;

if(fiche->dateNaissance.mois > aujourdhui.mois){

age -= 1;}else if(fiche->dateNaissance.mois == aujourdhui.mois){

if(fiche->dateNaissance.jour > aujourdhui.jour)age -= 1;

}

/*if ((fiche->dateNaissance.mois > aujourdhui.mois) || (fiche->dateNaissance.mois ==aujourdhui.mois && fiche->dateNaissance.jour > aujourdhui.jour))age -= 1;*/

return age;}

int rechercherPlusJeune(Fiche *fiches, int nbFiches){

int numero = 0;int ageMin = 0;int age;Date aujourdhui;int i;

lireDateDuJour(&aujourdhui);ageMin = calculerAge(&fiches[0], aujourdhui);

for(i=1;i<nbFiches;i++){

age = calculerAge(&fiches[i], aujourdhui);if(age < ageMin){

ageMin = age;numero = i;

}}

return numero;}

int compterEtudiants(Fiche *fiches, int nbFiches, char sexe){

int nb = 0;int i;

TP Programmation C/C++ : structures et classes 8 / 14 © 2017 <[email protected]>

Page 9: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

for(i=0;i<nbFiches;i++){

if(fiches[i].sexe == sexe){

++nb;}

}

return nb;}

void afficherEtudiants(Fiche *fiches, int nbFiches){

int i;int age = 0;Date aujourdhui;

lireDateDuJour(&aujourdhui);

for(i=0;i<nbFiches;i++){

age = calculerAge(&fiches[i], aujourdhui);printf("%s %s %02d/%02d/%04d %d %c\n", fiches[i].nom, fiches[i].prenom, fiches[i].

dateNaissance.jour, fiches[i].dateNaissance.mois, fiches[i].dateNaissance.annee,age, fiches[i].sexe);

}}

void afficherEtudiant(int numero, Fiche *fiches, int nbFiches){

Date aujourdhui;

lireDateDuJour(&aujourdhui);int age = calculerAge(&fiches[numero], aujourdhui);

printf("%s %s %02d/%02d/%04d %d %c\n", fiches[numero].nom, fiches[numero].prenom, fiches[numero].dateNaissance.jour, fiches[numero].dateNaissance.mois, fiches[numero].dateNaissance.annee, age, fiches[numero].sexe);

}

void saisirDate(char *date){

bool valide = false;Date d;

do{

printf("Naissance (jj/mm/aaaa) : ");scanf("%10s", date);viderTampon();if(date[2] == ’/’ && date[5] == ’/’){

date[2] = ’ ’; date[5] = ’ ’;

TP Programmation C/C++ : structures et classes 9 / 14 © 2017 <[email protected]>

Page 10: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

sscanf(date, "%d %d %d", &d.jour, &d.mois, &d.annee);if(verifierDate(d))

valide = true;else

printf("Date invalide !\n");}else

printf("Format incorrect !\n");}while(!valide);

}

bool estBissextile(int aaaa){

bool estMultipleDe4 = (aaaa % 4 == 0);bool estMultipleDe400 = (aaaa % 400 == 0);bool estMultipleDe100 = (aaaa % 400 == 0);

if (estMultipleDe4 && (!estMultipleDe100 || estMultipleDe400))return true;

elsereturn false;

}

bool verifierDate(Date date){

int mois[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

if((date.jour < 1 || date.jour > 31) || (date.mois < 1 || date.mois > 12) || date.annee< 1)return false;

if (estBissextile(date.annee))mois[1] = 29;

elsemois[1] = 28;

if(date.jour > mois[date.mois-1])return false;

return true;}

void viderTampon(){

int c;

while ((c = getchar()) != ’\n’ && c != EOF);}

inscription-etudiants-v2.c

TP Programmation C/C++ : structures et classes 10 / 14 © 2017 <[email protected]>

Page 11: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

Recette secrète

. Correction :#include <iostream>#include "tonneau.h"

using namespace std;

int main(){

Tonneau tonneau5(5), tonneau3(3);

tonneau5.remplir();tonneau3.remplir(tonneau5);tonneau3.vider();

tonneau3.remplir(tonneau5);

tonneau5.remplir();tonneau3.remplir(tonneau5);tonneau3.vider();

//cout << "Tonneau " << tonneau3.contenance() << "L : " << tonneau3.quantite() << " l"<< endl;

cout << "Tonneau " << tonneau5.contenance() << "L : " << tonneau5.quantite() << " l" <<endl;

return 0;}

main.cpp

Mastermind

. Correction :#include <iostream>#include "mastermind.h"

using namespace std;

// Programme principalint main(){

Mastermind mastermind;//Mastermind mastermind(1, 5, 12);

mastermind.usage();

mastermind.choisirSolution();

do{

TP Programmation C/C++ : structures et classes 11 / 14 © 2017 <[email protected]>

Page 12: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

mastermind.saisirEssai();mastermind.verifierEssai();mastermind.afficherResultat();

}while (!mastermind.estFinie());

return 0;}

main.cpp

Des histoires pour les enfants

. Correction :#ifndef HUMAIN_H#define HUMAIN_H

#include <iostream>#include <string>

using namespace std;

class Humain{

public:// Constructeurs et DestructeurHumain(const string nom="", const string boissonFavorite="eau");~Humain();

// Accesseursstring getNom() const;string getBoissonFavorite() const;void setBoissonFavorite(const string nouvelleBoissonFavorite);int getPopularite() const;void setPopularite(const int popularite);

// Servicesvoid parle(const string texte) const;void sePresente() const;void boit() const;void incrementePopularite();void decrementePopularite();

private:string nom;string boissonFavorite;int popularite;

};

#endif // HUMAIN_H

humain.h

TP Programmation C/C++ : structures et classes 12 / 14 © 2017 <[email protected]>

Page 13: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

EXERCICES : UN LONG VOYAGE

#include "humain.h"

// Constructeurs et DestructeurHumain::Humain(const string nom/*=""*/, const string boissonFavorite/*="eau"*/) : nom(nom),

boissonFavorite(boissonFavorite), popularite(0){}

Humain::~Humain(){}

// Accesseursstring Humain::getNom() const{

return nom;}

string Humain::getBoissonFavorite() const{

return boissonFavorite;}

void Humain::setBoissonFavorite(const string nouvelleBoissonFavorite){

this->boissonFavorite = nouvelleBoissonFavorite;}

int Humain::getPopularite() const{

return popularite;}

void Humain::setPopularite(const int popularite){

if(popularite >= 0)this->popularite = popularite;

}

// Servicesvoid Humain::parle(const string texte) const{

cout << "(" << nom << ") -- " << texte << endl;}

void Humain::sePresente() const{

string texte = "Bonjour, je suis " + getNom() + " et j’aime le " + getBoissonFavorite();parle(texte);

}

void Humain::boit() const

TP Programmation C/C++ : structures et classes 13 / 14 © 2017 <[email protected]>

Page 14: TP Développement C/C++ - Freetvaira.free.fr/.../tp/tp-programmation-5-structures-classes-correction.pdf · EXERCICES : UN LONG VOYAGE Types composés Lestypescomposéspermettentderegrouperdesvariablesauseind’unemêmeentité

BILAN

{string texte = "Ah ! un bon verre de " + getBoissonFavorite() + " ! GLOUPS !";parle(texte);

}

void Humain::incrementePopularite(){

this->popularite++;}

void Humain::decrementePopularite(){

if(popularite > 0)this->popularite--;

}

humain.cpp

Bilan

Conclusion : les types sont au centre de la plupart des notions de programmes corrects, et certaines destechniques de construction de programmes les plus efficaces reposent sur la conception et l’utilisation destypes.

Rob Pike (ancien chercheur des Laboratoires Bell et maintenant ingénieur chez Google) :« Règle n°5 : Les données prévalent sur le code. Si vous avez conçu la structure des données

appropriée et bien organisé le tout, les algorithmes viendront d’eux-mêmes. La structure desdonnées est le coeur de la programmation, et non pas les algorithmes. »

Cette règle n°5 est souvent résumée par « Écrivez du code stupide qui utilise des données futées ! »

TP Programmation C/C++ : structures et classes 14 / 14 © 2017 <[email protected]>