tp développement c/c++ -...
Post on 22-Jun-2020
20 Views
Preview:
TRANSCRIPT
TP Programmation C/C++Les structures de données
Correction© 2017 tv <tvaira@free.fr> 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
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
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 <tvaira@free.fr>
top related