TP1 Lite
TP1 Lite
TP1 Lite
Sujet n°1
Algorithmique & Programmation
Premiers algorithmes itératifs
Temps de réalisation: 3h
Échelle de progression :
« débutant·e » « confirmé·e » « avancé·e » « expert·e »
Ex. 01 02 03 04 05 06 07 08 09 10 11
Pour acquérir un niveau de compétence donné, il faut achever tous les exercices de ce niveau
et des niveaux inférieurs. L’objectif de chacun·e est d’atteindre au moins le niveau confirmé·e ( )
à l’issue du TP.
La programmation est une activité délicate et incertaine : pensez dès le début à tester votre code
régulièrement, en procédant par petites touches successives, tel un peintre devant sa toile…
2 Problèmes 3
Exercice 6 : Championnat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Exercice 7 : Calculatrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1
1 Cahier d’exercices
Dans cette partie, tous les algorithmes qui requièrent une saisie de nombre(s) entier(s) devront
réutiliser la fonction saisir_entier du module tp0.util .
Le résultat sera affiché sur la sortie standard. Le déterminant sera calculé dans une fonction dédiée.
Le programme de test affichera les racines des équations suivantes :
7 1
−x2 + 5x + 14 = 0 3x2 + 5x + 7 = 0 x2 − 6x + 9 = 0 x2 − x + = 0
6 3
Remarque : Pour ce programme, la mémorisation systématique des éléments déjà saisis, par
exemple dans une liste, n’est pas autorisée.
2
2 Problèmes
Exercice 6 : Championnat
Écrire un programme élaborant une saison de championnat comportant n équipes, par exemple de
football. Le principe consiste à fixer une équipe « pivot », puis à faire tourner les autres équipes d’une
journée à l’autre.
Par exemple, avec 6 équipes, et l’équipe n°6 comme pivot :
Jour 1: 1-6 Jour 2: 2-6 Jour 3: 3-6 Jour 4: 4-6 Jour 5: 5-6
2-5 3-1 4-2 5-3 1-4
3-4 4-5 5-1 1-2 2-3
Lorsque l’on est revenu à la permutation originale, toutes les équipes se sont affrontées une fois. Il
est important d’équilibrer les matchs à domicile et à l’extérieur pour chaque équipe, ce qui n’est pas
vérifié pour l’équipe pivot dans l’exemple ci-dessus. Enfin, Si le nombre d’équipes est impair, il suffit
d’ajouter une « équipe fictive » et de considérer que ses rencontres correspondent à des journées de
repos pour l’équipe adverse.
Le résultat escompté est la liste des journées de championnat, avec pour chacune, la liste des
rencontres. Vous proposerez un affichage similaire à :
Journée N°2:
équipe 3 reçoit équipe 2
équipe 1 reçoit équipe 5
équipe 4 au repos
Astuce : Si vous avez du mal à construire l’algorithme par vous-même (essayez d’abord !), voici
sa version mathématique.
Remarque : La version ci-dessus n’équilibre pas les déplacements de l’équipe pivot. Trouvez un
correctif !
Exercice 7 : Calculatrice
Écrire un programme qui demande la saisie au clavier d’une opération sur des nombres entiers
naturels et affiche le résultat du calcul.
Les opérateurs à considérer sont {+, ∗, %, //}. Chaque saisie doit se terminer par le signe ’=’. La
calculatrice acceptera par exemple, les suites de caractères suivantes (sans les guillemets) :
"344+15="
"22 // 432 ="
"93451* 0="
"12 %3="
3
et refusera les saisies comme celles-ci :
"1+2= "
"1+b_="
" "
"3+15"
"2.4+3="
"-4//3="
"4%(-2)="
Afficher un message d’erreur le cas échéant.
Exercice 9 : Dimanche
La construction du calendrier grégorien est donnée par la comptine suivante, dont il est facile de
vérifier la pertinence :
1 Jan 1900 was a Monday.
Thirty days has September,
April, June and November.
All the rest have thirty-one,
Saving February alone,
Which has twenty-eight, rain or shine.
And on leap years, twenty-nine.
Une année bissextile (leap year) survient tous les 4 ans, lorsqu’elle est divisible par 4 et à l’exception
des centaines, sauf si elles sont elles-mêmes divisibles par 400 !
Combien de dimanches sont tombés un premier jour du mois au vingtième siècle (du 1er janvier
1901 au 31 décembre 2000) ?
4
Exercice 10 : Poker
Au jeu de poker, une main est composée de cinq cartes, pouvant former l’une des combinaisons
suivantes, dans l’ordre croissant de leur puissance :
1. plus forte carte ;
2. une paire : deux cartes de même rang (ou valeur) ;
3. deux paires ;
4. brelan : trois cartes de même rang ;
5. quinte : cinq cartes consécutives ;
6. couleur : cinq cartes de même enseigne (ou couleur) ;
7. full : brelan et paire ;
8. carré : quatre cartes de même rang ;
9. quinte flush : quinte dont les cinq cartes sont de même enseigne ;
10. quinte flush royale : quinte flush incluant un As.
Pour mémoire, les cartes sont, dans l’ordre : 2, 3, 4, 5, 6, 7, 8, 9, 10 (Ten), Valet (Jack), Reine
(Queen), Roi (King), et As (Ace). Les enseignes sont Pique (Spade), Coeur (Heart), Carreau (Dia-
mond), Trèfle (Club).
En cas d’égalité de combinaison entre deux joueurs, c’est la plus haute carte complétant la main
qui l’emporte, et ainsi de suite. Voici cinq exemples de mains à deux joueurs :
Main Joueur 1 Joueur 2 Vainqueur
1 5H 5C 6S 7S KD 2C 3S 8S 8D TD Joueur 2
paire de 5 paire de 8
2 5D 8C 9S JS AC 2C 5C 7D 8S QH Joueur 1
plus haute carte As plus haute carte Reine
3 2D 9C AS AH AC 3D 6D 7D TD QD Joueur 2
brelan couleur à Carreau
4 4D 6S 9H QH QC 3D 6D 7H QD QS Joueur 1
paire de Reines paire de Reines
plus haute carte 9 plus haute carte 7
5 2H 2D 4C 4D 4S 3C 3D 3S 9S 9D Joueur 1
full full
par les 4 par les 3
Le fichier poker.txt contient cent mains aléatoires de 2 joueurs. Sur chaque ligne sont repré-
sentées 10 cartes, les cinq premières correspondent à la main du joueur 1, les cinq dernières celle du
joueur 2. On suppose que toutes les mains sont valides. En outre, les cartes de chaque main ne sont
pas triées. Enfin, il y a systématiquement une main meilleure que l’autre.
Combien de mains le joueur 1 aura-t’il gagné à l’issue de la partie ?
5
Question 1. Retrouver H(4) = 5 et H(100) = 2043.
Question 2. Calculer H(109 ).
En marge : L’algorithme d’Euclide étendu, au cœur de cet exercice, admet beaucoup d’applica-
tions comme par exemple en géométrie algorithmique (trouver un point sur une droite dont on donne
l’équation), ou en cryptographie (déterminer une paire de clés dans le protocole RSA).