tp développement c/c++ -...
TRANSCRIPT
TP Programmation C/C++Structures fondamentales d’algorithmie
Correction© 2017 tv <[email protected]> v.1.1
Sommaire
Exercices : Un parcours semé d’embûches 2Dans le fourré . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Vendanges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Course avec les enfants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Bornes kilométriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Bagarre générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Calculatrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Graduation de thermomètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5Calcul des dénivelées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Concours de tir à la corde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Type d’arbres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8L’espion est démasqué ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Moyenne des notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Tarif du bateau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11La roue de la fortune . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Bilan 13
Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables dans les struc-tures fondamentales d’algorithmie : enchaînements, alternatives, itérations. Les exercicessont 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 variables ainsi que leurs types, l’utilisation de constantes– le code est fonctionnel– la simplicité du code
1
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
Exercices : Un parcours semé d’embûches
Dans le fourré
. Correction :#include <stdio.h>#include "robot.h"
int main(){
allerHaut();allerHaut();allerHaut();allerDroite();allerDroite();allerBas();allerBas();allerDroite();
return 0;}
main.c
Vendanges
. Correction :for(i = 0; i < 20; i++){
// prendre le raisin sur le tasrammasser();
// aller à la charettefor(j = 0; j < 15; j++)
allerDroite();
// déposer le raisin dans la charettedeposer();
// retourner au départfor(j = 0; j < 15; j++)
allerGauche();}
main.c
Course avec les enfants
. Correction :
TP Programmation C/C++ : algorithmie 2 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
for(i = 0; i < 10; i++){
// aller au prochain anneaufor(j = 0; j < i+1; j++)
allerDroite();
// prendre l’anneaurammasserAnneau();
// retourner au départfor(j = 0; j < i+1; j++)
allerGauche();
// aller au rangementallerGauche();
// ranger l’anneaudeposerAnneau();
// retourner au départallerDroite();
}
main.c
Bornes kilométriques
. Correction :// Ce programme lit deux entiers, correspondant à deux numéros de bornes kilométriques, et
affiche la distance (strictement positive ou nulle) séparant ces deux bornes.
#include <stdio.h>
int main(){
int borne1, borne2, distance; // distance devrait être unsigned int
scanf("%d %d", &borne1, &borne2);
if(borne1 > borne2){
distance = borne1 - borne2;}else{
distance = borne2 - borne1;}
printf("Distance : %d\n", distance);
return 0;
TP Programmation C/C++ : algorithmie 3 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
}
bornes-kilometriques.c
Il manque le cas où les deux bornes sont identiques :$ ./bornes-kilometriques814814Distance : 0
Bagarre générale
. Correction :// Ce programme lit la superficie entière de 2 champs et affiche si l’un est plus grand d’au
moins 10 m2 que l’autre
#include <stdio.h>
int main(){
int superficieArignon, superficieEvaran;
scanf("%d %d", &superficieArignon, &superficieEvaran);
if((superficieArignon - superficieEvaran) > 10){
printf("La famille Arignon a un champ trop grand\n");}else if((superficieEvaran - superficieArignon) > 10){
printf("La famille Evaran a un champ trop grand\n");}
return 0;}
bagarre-generale.c
Il manque le cas où la famille Arignon a un champ trop grand :$ ./bagarre-generale5442La famille Arignon a un champ trop grand
Calculatrice
. Correction :// Le programme lit deux nombres et une lettre représentant l’opération à effectuer (s pour
la somme et p pour le produit) et affiche le résultat.
TP Programmation C/C++ : algorithmie 4 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
#include <stdio.h>
int main(){
int nombre1, nombre2;char operation;
scanf("%d %d %c", &nombre1, &nombre2, &operation);
switch (operation){case ’s’:
printf("%d\n", nombre1 + nombre2);break;
case ’p’:printf("%d\n", nombre1 * nombre2);break;
default:printf("Désolé, je ne connais pas cette opération !\n");break;
}}
calcul-denivelees.c
Il faut au moins faire 3 tests : s pour la somme, p pour le produit et x pour une opération inconnue.
Graduation de thermomètres
. Correction :// Ce programme lit deux deux températures entières et affiche toutes les températures
comprises entre les deux bornes incluses.
#include <stdio.h>
int main(){
int tempMin, tempMax;
scanf("%d%d", &tempMin, &tempMax);
if(tempMin > tempMax){
int temp;temp = tempMax;tempMax = tempMin;tempMin = temp;
}
// avec une boucle forint i;for(i=tempMin;i<=tempMax;i++)
printf("%d\n", i);
TP Programmation C/C++ : algorithmie 5 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
printf("\n");
// avec une boucle while// attention, ici tempMin est modifiée (sinon utilisez une variable temporaire)while(tempMin<=tempMax){
printf("%d\n", tempMin++);}
return 0;}
graduation-thermometres.c
Calcul des dénivelées
. Correction :// Ce programme lit d’abord un entier représentant le nombre de montées et descentes. Pour
chaque montée ou descente, il lit ensuite un entier représentant la variation d’altitude(strictement positif pour une montée et strictement négatif pour une descente. Ilaffiche l’altitude totale montée puis l’altitude totale descendue (ces deux nombres sontpositifs).
#include <stdio.h>
int main(){
int nb, altitude, montee = 0, descente = 0;int i = 0;
scanf("%d", &nb);
while(i < nb) // ou : while(i++ < nb) (1){
scanf("%d", &altitude);if(altitude > 0){
montee += altitude;}else{
descente += altitude; // ou : descente += (altitude*-1);}i++; // cf. (1)
}
printf("altitude totale montée : %d\n", montee);printf("altitude totale descendue : %d\n", (descente*-1)); // cf. (2)
return 0;
TP Programmation C/C++ : algorithmie 6 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
}
calcul-denivelees.c
Concours de tir à la corde
. Correction :// Ce programme lit un premier entier : le nombre de membres nbMembres qui constituent une
équipe. Ensuite, il lit alternaviment les poids (en kilogrammes) des joueurs de chaqueéquipe
// Après avoir calculé le poids total de chaque équipe, il affiche le texte « L’équipe X aun avantage » (en remplaçant X par la valeur 1 ou 2), en considérant qu’une équipe estavantagée si elle a un poids total supérieur à celui de l’autre
// Il affichere ensuite le texte « Poids total pour l’équipe 1 : » suivi du poids de l’équipe 1, puis « Poids total pour l’équipe 2 : » suivi du poids de l’équipe 2
#include <stdio.h>
int main(){
int nbMembres, poids, poidsEquipe1 = 0, poidsEquipe2 = 0;int i = 0;
scanf("%d", &nbMembres);
for(i = 0;i < (nbMembres*2); i++){
scanf("%d", &poids);if(i%2 == 0){
poidsEquipe1 += poids;}else{
poidsEquipe2 += poids;}
}
if(poidsEquipe1 > poidsEquipe2){
printf("L’équipe 1 a un avantage\n");}else if(poidsEquipe2 > poidsEquipe1){
printf("L’équipe 2 a un avantage\n");}else{
printf("Aucune équipe a un avantage\n");}
printf("Poids total pour l’équipe 1 : %d\n", poidsEquipe1);
TP Programmation C/C++ : algorithmie 7 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
printf("Poids total pour l’équipe 2 : %d\n", poidsEquipe2);
return 0;}
tir-corde.c
Pour valider le programme, il faut effectuer 3 tests :$ ./tir-corde3408050506010L’équipe 1 a un avantagePoids total pour l’équipe 1 : 150Poids total pour l’équipe 2 : 140
$ ./tir-corde3408050506020Aucune équipe a un avantagePoids total pour l’équipe 1 : 150Poids total pour l’équipe 2 : 150
$ ./tir-corde3408050506030L’équipe 2 a un avantagePoids total pour l’équipe 1 : 150Poids total pour l’équipe 2 : 160
Type d’arbres
. Correction :// Le programme lit deux entiers, la hauteur et le nombre de folioles de l’arbre, et affiche
le nom de l’arbre correspondant.
#include <stdio.h>#include <stdbool.h>
TP Programmation C/C++ : algorithmie 8 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
int main(){
int hauteur, nbFolioles;
scanf("%d%d", &hauteur, &nbFolioles);
// une bonne pratique en action :bool estTinuviel = (hauteur <= 5) && (nbFolioles >= 8);bool estCalaelen = (hauteur >= 10) && (nbFolioles >= 10);bool estFalarion = (hauteur <= 8) && (nbFolioles <= 5);bool estDorthonion = (hauteur >= 12) && (nbFolioles <= 7);
if(estTinuviel)printf("Tinuviel\n");
else if(estCalaelen)printf("Calaelen\n");
else if(estFalarion)printf("Falarion\n");
else if(estDorthonion)printf("Dorthonion\n");
elseprintf("Inconnu\n");
return 0;}
type-arbre.c
Oui, il faut tester l’ensemble des cas. Le but d’un test est de détecter une erreur.
L’espion est démasqué !
. Correction :// Le programme lit le signalement d’une personne sous la forme de cinq entiers : sa taille
en centimètres, son âge en années, son poids en kilogrammes, un entier valant 1 si lapersonne possède un cheval et 0 sinon, et un entier valant 1 si la personne à lescheveux bruns et 0 sinon. Le programme affiche la probabilité que la personne soit unespion.
#include <stdio.h>#include <stdbool.h>
int main(){
int taille, age, poids, cheval, cheveuxBrun;
// Saisie du signalementscanf("%d%d%d%d%d", &taille, &age, &poids, &cheval, &cheveuxBrun);
// Pourquoi mettre des commentaires !bool aLaTailleDuSuspect = (taille >= 178 && taille <= 182);bool aLAgeDuSuspect = (age >= 34);
TP Programmation C/C++ : algorithmie 9 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
bool aLePoidsDuSuspect = (poids < 70);bool nAPasDeChevalCommeLeSuspect = !(cheval == 1);bool aLesCheveuxDuSuspect = (cheveuxBrun == 1);
// Solution optimale :// Si on cherche un suspect ou pas//bool estSuspect = aLaTailleDuSuspect && aLAgeDuSuspect && aLePoidsDuSuspect &&
nAPasDeChevalCommeLeSuspect && aLesCheveuxDuSuspect;// Si on cherche une probabilitéint nbCriteres = aLaTailleDuSuspect + aLAgeDuSuspect + aLePoidsDuSuspect +
nAPasDeChevalCommeLeSuspect + aLesCheveuxDuSuspect;
// Solution à éviter/*nbCriteres = 0;if(aLaTailleDuSuspect)
++nbCriteres;if(aLAgeDuSuspect)
++nbCriteres;if(aLePoidsDuSuspect)
++nbCriteres;if(nAPasDeChevalCommeLeSuspect)
++nbCriteres;if(aLesCheveuxDuSuspect)
++nbCriteres;*///printf("Criteres : %d\n", nbCriteres);
// Verdict// une utilisation du switch est possibleswitch(nbCriteres){
case 0:printf("Impossible\n");break;
case 1:case 2:
printf("Peu probable\n");break;
case 3:case 4:
printf("Probable\n");break;
case 5:printf("Très probable\n");
}
return 0;}
espion-demasque.c
Moyenne des notes
. Correction :
TP Programmation C/C++ : algorithmie 10 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
// Le programme lit d’abord un premier entier, qui décrit le nombre de notes obtenues.Ensuite, il lit chacune de ces notes, qui sont également des nombres entiers. Enfin, ildoit afficher la moyenne (avec 2 chiffres après la virgule), les notes minimum etmaximum de toutes ces notes.
#include <stdio.h>
int main(){
int note = -1;int accumulateur = 0;unsigned int nbNotes = 0U;unsigned int compteur = 0U;int minimum = 20;int maximum = 0;
scanf("%d", &nbNotes);
while(compteur < nbNotes){
scanf("%d", ¬e);if(note >= 0){
accumulateur = accumulateur + note;compteur = compteur + 1;if(note > maximum)
maximum = note;if(note < minimum)
minimum = note;}
}
if(compteur != 0) // Si on a tapé des notes...{
// On fait l’affichage et la division
printf("Moyenne : %.2f\n", ((float)accumulateur / (float)compteur));printf("Minimum : %d\n", minimum);printf("Maximum : %d\n", maximum);
}else // sinon un simple message d’avertissement.
printf("Aucune note tapée ; aucun calcul effectue.\n");
return 0;}
moyenne-notes.c
Tarif du bateau
. Correction :// Le programme lit l’âge d’une personne et le nombre de traversées indiqué sur sa carte et
affiche soit « Tarif réduit », soit « Tarif plein », soit « Gratuit » suivant les cas.
TP Programmation C/C++ : algorithmie 11 / 13 © 2017 <[email protected]>
EXERCICES : UN PARCOURS SEMÉ D’EMBÛCHES
Vous avez le droit à une réduction si vous avez entre 12 et 25 ans ou si vous avez plusde 60 ans mais, si vous n’avez pas de réduction et que vous faites plus de 50 traverséespar an, alors vous avez le droit à une traversée gratuite.
#include <stdio.h>#include <stdbool.h>
int main(){
int age;int nbTraversees;
scanf("%d", &age);scanf("%d", &nbTraversees);
bool estJeune = (age >= 12) && (age <= 25);bool estSenior = (age >= 60);bool reductionPossible = (estJeune || estSenior);
if (reductionPossible){
printf("Tarif réduit\n");}else if (nbTraversees >= 50){
printf("Gratuit\n");}else{
printf("Tarif plein\n");}
return 0;}
tarif-bateau.c
La roue de la fortune
. Correction :#include <stdio.h>
#define NB_ZONES 24
int main(){
int nbZones = 0, zone = 0;
scanf("%d", &nbZones);
int deplacement = (nbZones % NB_ZONES);
TP Programmation C/C++ : algorithmie 12 / 13 © 2017 <[email protected]>
BILAN
if(deplacement < 0)zone = NB_ZONES + deplacement;
elsezone = deplacement;
printf("%d\n", zone);
return 0;}
roue-fortune.c
Il faut au moins 4 tests : 0 < nbZones < 24, 23 < nbZones, -24 < nbZones < 0 et nbZones < -24
Bilan
Vous avez découvert les notions suivantes :– lire des entrées et produire des résultats en sortie– enchaîner des suites d’instructions– répéter (itérer) des instructions– manipuler des variables et faire des opérations avec– effectuer des actions sous conditions
Conclusion : parce qu’il est clair que vous débutez à peine votre carrière de programmeur, n’oubliez pasqu’écrire de bons programmes, c’est écrire des programmes corrects, simples et efficaces.
Rob Pike (ancien chercheur des Laboratoires Bell et maintenant ingénieur chez Google) :« Règle n°4 : Les algorithmes élégants comportent plus d’erreurs que ceux qui sont plus
simples, et ils sont plus difficiles à appliquer. Utilisez des algorithmes simples ainsi que desstructures de données simples. »
Cette règle n°4 est une des instances de la philosophie de conception KISS (Keep it Simple, Stupid dansle sens de « Ne complique pas les choses ») ou Principe KISS, dont la ligne directrice de conceptionpréconise de rechercher la simplicité dans la conception et que toute complexité non nécessaire devraitêtre évitée.
TP Programmation C/C++ : algorithmie 13 / 13 © 2017 <[email protected]>