PYTHON : EXERCICES NIVEAU A

Les exercices proposés sur cette page permettent une mise en oeuvre des éléments fondamentaux du langage Python. Pour tous les exercices de cette page, l'interaction entre l'utilisateur et le programme est effectuée au moyen d'un mécanisme appelé "interaction par lignes de commandes" ("command line interaction" ou CLI, en anglais). Dans ce mécanisme, l'utilisateur commence par saisir une commande sous la forme d'une chaîne de caractères, comprenant éventuellement plusieurs mots et/ou valeurs numériques. Ensuite le programme va analyser cette commande, y récupérer les différents paramètres, avant d'effectuer les actions correspondantes. Les résultats obtenus sont affichés à l'écran, également sous la forme d'une chaîne de caractères alphanumériques, puis le programme se remet en attente d'une nouvelle commande de la part de l'utilisateur. Une commande spécifique (par exemple, une ligne vide) permet à l'utilisateur d'arrêter la boucle d'interaction et de quitter le programme.

Pour faciliter l'écriture de programme mettant en oeuvre ce principe, on vous fournit le module Python ezCLI qui sera détaillé en cours, et qui contient des outils permettant de simplifier au maximum les opérations nécessaires à la saisie des commandes et à l'affichage des résultats.

Pour tous les exercices, un soin particulier devra aussi être porté sur la "robustesse du programme", une propriété qui garantit que le programme ne s'arrête pas brutalement lorsque l'utilisateur effectue une saisie de données invalides, mais au contraire va identifier ces données invalides, afficher un message et permettre à l'utilisateur d'effectuer une nouvelle saisie.

Pour bien démarrer, il est fortement conseillé de s'inspirer de quelques exemples de programmes. Trois sources de documentation sont fournies :

Exercice A0

L'objectif de cet exercice d'introduction est de réaliser une série de modifications simples sur les codes sources fournis dans la rubrique "Exemples Niveau A" :

Exercice A1

En s'inspirant du programe squares (cf. Exemples Niveau A), écrire un programme facto qui affiche les valeurs de la fonction factorielle de 0! à n! où la valeur de n est entrée par l'utilisateur. Pour une meilleure lisibilité du code source, créer une fonction facto(n) qui renvoie la valeur de la factorielle de son paramètre d'entrée, ainsi qu'une fonction parser(command) qui doit analyser la saisie de l'utilisateur, récupérer la valeur de n (ou renvoyer un message d'erreur en cas de mauvaise saisie) et enfin, renvoyer la chaîne de caractères correspondant au texte que doit afficher le programme, comme indiqué dans l'exemple d'exécution ci-dessous.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
FACTO : compute the sequence of factorial terms from 0! to n!

User input: <n> (where n:int >= 0)
App output: sequence of factorial terms from 0! to n!

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter value for <n>: 8
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
<> Enter value for <n>: 

Exercice A2

En utilisant le même squelette que l'exercice précédent, écrire un programme fibo qui affiche les n premiers termes de la suite de Fibonacci, où la valeur de n est entrée par l'utilisateur.

Rappel : la suite de Fibonacci est définie par : u0= 0, u1 = 1, uk = uk-1 + uk-2 avec k > 1.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
FIBO : compute the n first terms of the Fibonacci sequence

User input: <n> (where n:int >= 0)
App output: sequence of the n first Fibonacci terms

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter value for <n>: 12
fibo(0) = 0
fibo(1) = 1
fibo(2) = 1
fibo(3) = 2
fibo(4) = 3
fibo(5) = 5
fibo(6) = 8
fibo(7) = 13
fibo(8) = 21
fibo(9) = 34
fibo(10) = 55
fibo(11) = 89
fibo(12) = 144
<> Enter value for <n>:

Exercice A3

Ecrire un programme bino qui calcule le coefficient binomial Cn,p = n! / p!(n-p)! où les valeurs de n et p sont entrées par l'utilisateur. Dans une première version, le programme importera la fonction facto(n) définie dans le programme facto ci-dessus, pour calculer les trois factorielles mises en oeuvre. Quel est l'inconvénient de cette manière de procéder en terme de performance du programme ? Proposer une seconde version permettant d'éviter tous les calculs inutiles.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
BINO : compute the binomial coefficient C(n,p)

User input : <n>,<p> (where n:int >= 0, p:int >= 0)
App output : binomial coefficient C(n,p)

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter <n>,<p> : 5,2
bino(5,2) = 10
<> Enter <n>,<p> : 654,321
bino(654,321) = 208862495338376097148824392621598331466800707904057584045885
2317553835286687166542234979310586620807550210480099247071146340471456463666
098110787162439679333032277411632733692493464039370070191000
<> Enter <n>,<p> :

Exercice A4

Ecrire un programme framewords qui utilise la fonction grid' du module ezCLI, pour encadrer les mots d'une phrase selon quatre modes différents (encadrement d'une phrase complète, encadrement des mots en ligne, encadrement des mots en colonne, encadrement des lettres). L'exemple d'exécution ci-dessous, donne un aperçu du résultat souhaité pour les différents modes d'encadrements.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
FRAMEWORDS : frame each word of a user-provided list of words

User input : <word> [word ...] (where word:str without whitespaces)
App output : several framing modes for the list of words

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter <word> [word ...]: I want my money back
┌────────────────────┐
│I want my money back│
└────────────────────┘
┌─────┬─────┬─────┬─────┬─────┐
│  I  │ want│  my │money│ back│
└─────┴─────┴─────┴─────┴─────┘
┌─────┐
│  I  │
├─────┤
│ want│
├─────┤
│  my │
├─────┤
│money│
├─────┤
│ back│
└─────┘
┌───┬───┬───┬───┬───┐
│ I │   │   │   │   │
├───┼───┼───┼───┼───┤
│ w │ a │ n │ t │   │
├───┼───┼───┼───┼───┤
│ m │ y │   │   │   │
├───┼───┼───┼───┼───┤
│ m │ o │ n │ e │ y │
├───┼───┼───┼───┼───┤
│ b │ a │ c │ k │   │
└───┴───┴───┴───┴───┘
<> Enter <word> [word ...]: 

Exercice A5

Ecrire un programme binhex qui convertit les valeurs décimales d'une série de nombres entiers entrés par l'utilisateur, dans leur représentation binaire (base 2) et leur représentation hexadécimale (base 16). Pour l'affichage, on utilisera la notation standard de Python (et de la plupart des langages de programmation), en ajoutant le préfixe '0B' pour la valeur binaire et le préfixe '0X' pour la valeur hexadécimale.

Rem: Python fournit les fonctions standards bin(n) et hex(n) qui réalisent ces deux conversions. Le but de l'exercice est évidemment de ne pas utiliser ces fonctions, mais de créer vos propres fonctions dec2bin(n) et dec2hex(n) qui se comportent de manière similaire.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
BINHEX : show decimal, binary and hexadecimal representations for integers

User input : <value> [value...] where value:int is given in decimal
App output : show decimal, binary and hexa representation for all values

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter <value> [value...]: 1 12 123 1234 12345
1 = 0B1 = 0X1
12 = 0B1100 = 0XC
123 = 0B1111011 = 0X7B
1234 = 0B10011010010 = 0X4D2
12345 = 0B11000000111001 = 0X3039
<> Enter <value> [value...]: 

Exercice A6

En s'inspirant du programme multable (cf. Exemples Niveau A), écrire un programme muldiv qui affiche la table des PGCD/PPCM des nombres entre 1 et n pour une valeur de n entrée par l'utilisateur. La partie triangulaire supérieure de cette table contiendra les GCD (Greatest Common Divisor = PGCD) des deux nombres p et q correspondant aux indices de ligne et de colonne. De même, la partie triangulaire inférieure de cette table contiendra les LCM (Least Common Multiple = PPCM) de ces deux indices. On définira deux fonctions auxiliaires gcd(p,q) et lcm(p,q) qui permettent de calculer les deux éléments demandées sur les deux nombres passés en paramètre.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
MULDIV : table of GCD/LCM (Greatest Common Divisor/Least Common Multiple)

User input : <n> (where n:int > 0)
App output: table of GCD/LCM from 1 to n

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter value for <n>: 12
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│  1│  2│  3│  4│  5│  6│  7│  8│  9│ 10│ 11│ 12│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│  2│  2│  1│  2│  1│  2│  1│  2│  1│  2│  1│  2│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│  3│  6│  3│  1│  1│  3│  1│  1│  3│  1│  1│  3│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│  4│  4│ 12│  4│  1│  2│  1│  4│  1│  2│  1│  4│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│  5│ 10│ 15│ 20│  5│  1│  1│  1│  1│  5│  1│  1│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│  6│  6│  6│ 12│ 30│  6│  1│  2│  3│  2│  1│  6│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│  7│ 14│ 21│ 28│ 35│ 42│  7│  1│  1│  1│  1│  1│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│  8│  8│ 24│  8│ 40│ 24│ 56│  8│  1│  2│  1│  4│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│  9│ 18│  9│ 36│ 45│ 18│ 63│ 72│  9│  1│  1│  3│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│ 10│ 10│ 30│ 20│ 10│ 30│ 70│ 40│ 90│ 10│  1│  2│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│ 11│ 22│ 33│ 44│ 55│ 66│ 77│ 88│ 99│110│ 11│  1│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│ 12│ 12│ 12│ 12│ 60│ 12│ 84│ 24│ 36│ 60│132│ 12│
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
<> Enter value for <n>: 

Exercice A7

Ecrire un programme prime qui affiche tous les nombres premiers inférieurs à une valeur n entrée par l'utilisateur. Dans une première version, le programme stockera dans une liste extensible, les nombres premiers au fur et à mesure de leur identification. Pour chaque nouveau nombre considéré, cette liste permettra de fournir la liste de diviseurs à utiliser pour le test de primalité. Dans une seconde version, le programme implémentera l'algorithme du crible d'Erathostène. Avec cet algorithme, on stocke, pour chaque nouveau nombre premier p identifié, l'ensemble des multiples de p dont la valeur est inférieure à n. Ainsi, tous les nombres non-premiers sont immédiatement identifiés, et les nombres premiers sont obtenus par complément.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
PRIME : compute all prime numbers from 2 to n

User input : <n> (where n:int > 1)
App output : sequence of prime numbers from 2 to n

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter value for <n>: 999
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ 2 │ 3 │ 5 │ 7 │ 11│ 13│ 17│ 19│ 23│ 29│ 31│ 37│ 41│ 43│ 47│ 53│ 59│ 61│ 67│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│ 71│ 73│ 79│ 83│ 89│ 97│101│103│107│109│113│127│131│137│139│149│151│157│163│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│167│173│179│181│191│193│197│199│211│223│227│229│233│239│241│251│257│263│269│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│271│277│281│283│293│307│311│313│317│331│337│347│349│353│359│367│373│379│383│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│389│397│401│409│419│421│431│433│439│443│449│457│461│463│467│479│487│491│499│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│503│509│521│523│541│547│557│563│569│571│577│587│593│599│601│607│613│617│619│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│631│641│643│647│653│659│661│673│677│683│691│701│709│719│727│733│739│743│751│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│757│761│769│773│787│797│809│811│821│823│827│829│839│853│857│859│863│877│881│
├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤
│883│887│907│911│919│929│937│941│947│953│967│971│977│983│991│997│   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
<> Enter value for <n>: 

Exercice A8

Ecrire un programme datediff qui calcule, en jours, heures, minutes et secondes, l'écart entre les deux dates fournies par l'utilisateur. Pour spécifier une date, l'utilisateur entre une chaîne de caractères de la forme YYYY/MM/DD/hh/mm/ss où les champs correspondent respectivement à année, mois, jour, heure, minute et seconde. Lorsqu'un champ n'est pas spécifié, il prend automatiquement la valeur par défaut, c'est-à-dire 1 pour l'année, le mois ou le jour, et 0 pour l'heure, les minutes ou les secondes. Pour l'implémentation, on utilisera le module datetime de la bibliothèque standard de Python.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
DIFFDATE : compute the difference between two dates

User input : <date1> <date2>
             where date = <YYYY>['/'MM['/'DD['/'hh['/'mm['/'ss]]]]]
App output : difference between given dates in seconds, minutes, hours, days

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter two dates: 2000 1000
31556908800 seconds, 525948480 minutes, 8765808 hours, 365242 days
<> Enter two dates: 2015/7/14 1789/7/14
7131801600 seconds, 118863360 minutes, 1981056 hours, 82544 days
<> Enter two dates: 2015/12/31/23/59/59 2015/1/1/0/0/0
31535999 seconds, 525599 minutes, 8759 hours, 364 days
<> Enter two dates: 

Exercice A9

Ecrire un programme stat qui permet de réaliser une opération statistique op sur une série de données numériques. Pour cela, l'utilisateur saisit une commande sous la forme op val1 val2 ... valN dans laquelle l'argument op peut prendre les valeurs suivantes : min, max, sum, mean, variance, deviation permettant respectivement de calculer le minimum, le maximum, la somme, la moyenne, la variance et l'écart-type des données numériques val1 ... valN. Le programme utilisera une fonction min qui renvoie le minimum d'une liste de valeurs numériques passée en argument. De la même manière, on définira les fonctions max, sum, mean, variance, deviation de prototype similaire.

Exemple d'exécution :
────────────────────────────────────────────────────────────────────────────────
STAT : perform some statistical operations on a list of numerical values

User input : <operator> <value> [value...]
             where operator = 'min'|'max'|'sum'|'mean'|'variance'|'deviation'
             and value:int|float
App output : apply operator on the set of values

Enter 'help' or '?' to display some user instructions
Enter 'about' or '!' to display some info about the application
Enter 'exit' or an empty line to stop the interaction loop
────────────────────────────────────────────────────────────────────────────────
<> Enter <operator> <value> [value...]: sum 1 2 3 4 5
sum 1 2 3 4 5 = 15.0
<> Enter <operator> <value> [value...]: mean 1 2 3 4 5
mean 1 2 3 4 5 = 3.0
<> Enter <operator> <value> [value...]: variance 1 2 3 4 5
variance 1 2 3 4 5 = 2.0
<> Enter command :
...
Christophe Schlick