Licence pro. GTSBD 2013-2014 Structures de données, langage Python Série 2 Premiers programmes Programmes avec des affectations, des lectures et des écritures Exo 2.1 Le problème de la machine qui rend la monnaie Écrivez un programme qui lit une somme exprimée en euros, sans centimes, et affiche le nombre minimal de billets et de pièces de 2 et 1 euros nécessaires pour la composer. Il s agit pour le moment de réaliser un script sans boucles ni instruction conditionnelle. Vous avez donc le droit de donner des réponses maladroites, pourvu qu elles soient justes. Exemple d exécution ( est l invite de ma machine) : python monnaie.py Somme? 1949 1949 = + 3 x 500 + 2 x 200 + 0 x 100 + 0 x 50 + 2 x 20 + 0 x 10 + 1 x 5 + 2 x 2 + 0 x 1 Indications. Si x et y sont des expressions entières (de type int ou long), alors x/y vaut le quotient entier (on dit aussi quotient «par défaut») et x%y le reste de la division de x par y. Programmes avec des instructions conditionnelles if Exo 2.2 Jour de la semaine d une date donnée Écrivez un programme qui calcule le jour de la semaine correspondant à une date donnée, supposée correcte, exprimée sous forme de trois nombres entiers j (jour), m (mois) et a (année). Exemple python joursemaine.py jour? 24 mois? 9 annee? 2009 le 24/9/2009 est un jeudi Utilisez les formules suivantes : { { m 2, si m 3 a, si m 3 m 1 =, a m + 10, sinon 1 = a 1, sinon, n s = le siècle compté à partir de 0 (c est-à-dire tel qu exprimé par les deux premiers chiffres de a 1 ), a s = l année dans le siècle (exprimée par les deux derniers chiffres de a 1 ), puis f = j + a s + a s 4 2 n s + n s 4 + 26 m 1 2 10 Dans ces conditions, le jour de la semaine est donné par le reste de la division de f par 7 (0 dimanche, 1 lundi,... 6 samedi). Ci-dessus, les barres de fraction indiquent des divisions entières (c est-à-dire des quotients par défaut). 1
Exo 2.3 Réapparition de la machine qui rend la monnaie Améliorez la solution précédemment donnée de ce problème, de manière à éviter les maladresses que nous avons constatées. On doit obtenir maintenant, par exemple : python monnaie.py Somme? 1949 1949 = 3 x 500 + 2 x 200 + 2 x 20 + 1 x 5 + 2 x 2 Exo 2.4 La date du lendemain Écrivez un programme qui acquiert au clavier une date, exprimée sous forme de trois nombres entiers j (jour), m (mois) et a (année) et qui affiche la date du lendemain. Exemple : python lendemain.py jour? 30 mois? 9 annee? 2009 aujourd hui: 30 9 2009 demain: 1 10 2009 Vous pouvez supposer que la date saisie est correcte. Suggestion. Vous aurez fait le plus gros du travail quand vous aurez écrit une expression logique, portant sur les nombres j, m et a, qui traduit exactement la proposition «(j, m, a) est le dernier jour du mois». Rappel. Les années bissextiles sont les années multiples de 4 qui ne sont pas multiples de 100, et les années multiples de 400. Programmes avec des boucles while Exo 2.5 Moyenne d une suite de nombres lus successivement Écrivez un programme qui lit au clavier une suite de nombres positifs ou nuls (tapés successivement, à raison d un par ligne) et en calcule la moyenne. On ne sait pas à l avance combien il y a de nombres, c est la frappe d une valeur négative qui indique la fin de la suite. Exemple python moyenne.py? 10? 12? 8? -1 moyenne: 10 Indication. Sous son air innocent, cet exercice est très important car il illustre une situation que vous rencontrerez souvent : traiter une suite de données dont on ne connaît pas à l avance le nombre, acquises successivement, jusqu à la rencontre d une donnée invalide qui indique la fin de la suite. Attachez-vous à écrire un programme obéissant au schéma universel et fiable suivant : acquérir une donnée x tant que x est valide : traiter x (cela dépend du problème particulier considéré) acquérir une donnée x 2
La plupart des langages actuels disposent d une instruction d abandon de boucle, comme break en Python. Un autre schéma universel et fiable est alors celui-ci : répéter indéfiniment : acquérir une donnée x si x est invalide : abandonner la boucle traiter x (cela dépend du problème particulier considéré) Exo 2.6 Tester la fonction random La fonction random() du module random (voyez http://docs.python.org/library/random. html) renvoie, chaque fois qu on l appelle, un nombre flottant x vérifiant 0 x < 1, la suite des nombres successivement produits étant pseudo-aléatoire 1. Pour tester (très succinctement) cette fonction, écrivez un programme qui fait un grand nombre d appels de cette fonction et qui calcule la moyenne et l écart-type des valeurs obtenues. Rappels. Étant donnée une suite de n nombres (x i) 0 i<n, sa moyenne est définie par x = 1 n et son écart-type par ρ = 1 n n 1 i=0 x 2 i x2. n 1 x i i=0 Note. Si la fonction random était parfaite et le nombre de tirages infini, la moyenne vaudrait 1 2 et 1 l écart-type 12 = 0, 28867513459481292 Exo 2.7 Facteurs premiers d un nombre 1. Écrivez un programme qui lit un nombre entier au clavier et en affiche les facteurs premiers. Première version, simple : python diviseurs.py n? 720 720 = 2 * 2 * 2 * 2 * 3 * 3 * 5 On implémentera le schéma assez maladroit, mais suffisant suivant : acquérir le nombre entier n dont on recherche les diviseurs pour chaque nombre entier d allant de 2 jusqu à n : tant que d divise n : afficher d remplacer n par n/d 2. Écrivez une deuxième version du programme produisant un affichage plus proche de la coutume mathématique : python diviseurs.py n? 720 720 = 2^4 * 3^2 * 5^1 1. En réalité on souhaite une suite aléatoire, c est-à-dire faite de nombres choisis au hasard, mais les ordinateurs ne savent pas faire des choses au hasard. On emploie donc des algorithmes mathématiques produisant des suites pseudoaléatoires, censées avoir une très grande période (on peut produire beaucoup de valeurs avant de retomber sur la séquence déjà produite) et des propriétés statistiques aussi proches que possible de celles d une suite aléatoire. 3
Exo 2.8 Deviner un nombre Écrivez un programme qui tire au hasard un nombre entier (secret) n vérifiant 0 n < 100 puis lit des nombres proposés par l utilisateur en répondant à chaque fois trop grand, trop petit ou gagné et en comptant le nombre d essais nécessaires à l utilisateur pour deviner le nombre secret. Exemple : python jeu.py? 50 trop grand? 25 trop petit? 37 trop petit? 42 trop grand? 40 bravo, vous avez gagné en 5 coups! Programmes avec des boucles for Exo 2.9 Calcul de la factorielle Écrivez un programme qui calcule itérativement (c est-à-dire selon un algorithme basé sur une boucle, ici une boucle for) la valeur de la factorielle d un nombre donné. Exemple : python factorielle.py n? 50 50! = 30414093201713378043612608166064768844377641568960512000000000000 Rappel. La factorielle d un nombre n vérifiant n 0 est le nombre n! = n (n 1) (n 2)... 3 2 1 Exo 2.10 Tabulation d une fonction Écrivez un programme qui affiche les valeurs du sinus des angles de 0 à 90 degrés par pas de 15 degrés. On souhaite un affichage respectant strictement la forme suivante : sin( 0) = 0.000000 sin( 15) = 0.258819 sin( 30) = 0.500000... sin( 90) = 1.000000 Exo 2.11 Encore la machine qui rend la monnaie Réécrivez une nouvelle version de ce programme en réduisant significativement le nombre de ses lignes par l utilisation d une une liste constante représentant les coupures disponibles et une instruction de boucle for. Exo 2.12 Remboursement d un crédit Écrivez un programme qui étant donnés un capital emprunté, un taux d intérêt et un nombre de mensualités, calcule et affiche 4
d une part, le montant des mensualités de remboursement, en supposant qu il s agit d un emprunt à taux fixe et mensualités constantes, d autre part, le plan de remboursement, c est-à-dire un tableau où chaque ligne montre l intérêt payé et le capital restant dû chaque mois. La formule pour calculer la mensualité est M = C t 1 1 (1+t) n où M est la mensualité, C le capital emprunté, n le nombre de mensualités et t le taux mensuel «pour 1», c est-à-dire le taux exprimé «normalement» (en pourcentage annuel) divisé par 100 et par 12. Exemple : python emprunt.py capital? 10000 intér^et (taux annuel)? 12 nombre de mensualités? 12 mensualité: 888.49 +-----+------------+------------+------------+------------+ capital capital mensualité intér^ets remboursé restant d^u +-----+------------+------------+------------+------------+ 10000.00 1 888.49 100.00 788.49 9211.51 2 888.49 92.12 796.37 8415.14 3 888.49 84.15 804.34 7610.80 4 888.49 76.11 812.38 6798.42 5 888.49 67.98 820.50 5977.92 6 888.49 59.78 828.71 5149.21 7 888.49 51.49 837.00 4312.21 8 888.49 43.12 845.37 3466.85 9 888.49 34.67 853.82 2613.03 10 888.49 26.13 862.36 1750.67 11 888.49 17.51 870.98 879.69 12 888.49 8.80 879.69 0.00 +-----+------------+------------+------------+------------+ Exo 2.13 Calculette élémentaire Écrivez un programme qu on lance avec trois arguments, deux nombres et un opérateur parmi +,, et /, et qui affiche le résultat de l opération indiquée. Exemples : python calc.py 2 / 3 2.0 / 3.0 = 0.666666666667 python calc.py 123000 + 456 123000 + 456 = 123456 python calc.py 2 % 3 operation inconnue: % Il fait prendre garde au fait qu en UNIX le caractère * dans une ligne de commande est toujours substitué par une liste de fichiers ; pour indiquer l opérateur de multiplication il faut donc le taper sous une des formes * ou \* : 5
python calc.py 2 * 3 2.0 * 3.0 = 6.0 Indication. Pour faire cet exercice vous devez savoir accéder aux arguments de la ligne de commande. Il faut savoir que lorsqu un script Python est lancé par une commande de la forme python nomduscript mot 1 mot 2... mot k alors il est possible d atteindre les éléments mot 1, mot 2, etc. appelés les arguments du script, depuis l intérieur de celui-ci. Cela se fait à l aide de la variable sys.argv (il faut donc importer le module sys) dont la valeur est la liste de chaînes de caractères : [ nomduscript mot 1 mot 2... mot k ] 6