TP Développement C/C++ -...

13
TP Programmation C/C++ Structures fondamentales d’algorithmie Correction © 2017 tv <[email protected]> v.1.1 Sommaire Exercices : Un parcours semé d’embûches 2 Dans le fourré ............................................. 2 Vendanges ............................................... 2 Course avec les enfants ........................................ 2 Bornes kilométriques ......................................... 3 Bagarre générale ........................................... 4 Calculatrice .............................................. 4 Graduation de thermomètres ..................................... 5 Calcul des dénivelées ......................................... 6 Concours de tir à la corde ...................................... 7 Type d’arbres ............................................. 8 L’espion est démasqué ! ........................................ 9 Moyenne des notes .......................................... 10 Tarif du bateau ............................................ 11 La 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 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 variables ainsi que leurs types, l’utilisation de constantes – le code est fonctionnel – la simplicité du code 1

Transcript of TP Développement C/C++ -...

Page 1: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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

Page 2: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 3: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 4: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 5: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 6: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 7: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 8: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 9: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 10: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 11: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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", &note);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]>

Page 12: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>

Page 13: TP Développement C/C++ - Freetvaira.free.fr/bts-sn/1annee/tp/tp-programmation-2-algorithmie-correction.pdf · Les objectifs de ce tp sont de comprendre et mettre en oeuvre des variables

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]>