pc1-algoprog

5
École Centrale Paris 2013-2014 PC-1 Algo-Prog Avant-propos : Il s’agit d’une feuille d’exercices, permettant de mettre en œuvre les éléments de syntaxe du langage Python. Il s’agit de manipuler les types prédéfinis de Python (booléens, entiers, flottants, chaînes de car- actères, listes, tuples, dictionnaires, . . . ) et les structures de contrôle (boucles, définition d’opérations, récursivité, . . . ). L’énoncé est clairement long pour être terminé dans le cadre de la PC. Vous êtes invités à vous exercer à programmer en Python avec les questions qui n’auront pas été abordées lors de la séance. Le corrigé de cette feuille d’exercices sera mis en ligne sur Claroline avant la PC 3 du 1er octobre. Exercice 1 : Exercice sur les nombres. 1. Ecrire une fonction parfait qui décide si un nombre est parfait, c’est-à-dire s’il est égal à la somme de ses diviseurs (par exemple, 6 est un nombre parfait). 2. Ecrire une fonction qui étant donné un entier n, calcule la liste des entiers parfaits inférieurs à n. 3. Ecrire un programme qui indique quels sont les nombres compris entre 0 et 999 tels qu’ils sont égaux à la somme des cubes des chiffres qui les composent. Par exemple, 153 = 1 3 +5 3 +3 3 = 1 + 125 + 27. Exercice 2 : Modélisation d’un crédit automobile. Dans cet exercice, nous allons réaliser un simulateur de crédit automobile. Ecrire un programme qui : demande à l’utilisateur de saisir les revenus mensuels de son foyer, le prix de la voiture, le taux du crédit (en %), le nombre de mois du crédit ; calcule le montant d’une mensualité m à partir de la formule suivante : m = P × t 12 1 - ( 1+ t 12 ) -n (1) P est le prix de la voiture, n le nombre de mois et t le taux du crédit ; affiche la mensualité et une indication comme quoi le dossier est favorable ou non (la banque accepte un crédit auto si et seulement si la mensualité ne représente pas plus de 15% des revenus du foyer). Indication : utiliser la librairie math avec l’instruction import math, et la fonction puissance pow. Exercice 3 : Loto. Ecrire une fonction qui génère un tirage de loto, c’est-à-dire un tirage sans remise de 7 nombres entre 1 et 49. Indication : importer la fonction randint du module random en tapant au début de votre programme from random import randint. Pour obtenir un nombre entre [a; b] a et b sont deux entiers, utilisez la fonction randint(a,b). Exercice 4 : Exercice sur les chaînes de caractères. 1. L’ordre lexicographique sur les chaînes de caractères s’exprime de la façon suivante : soient l et l 0 deux chaînes de caractères s’écrivant respectivement 0 a 1 ...a 00 n et 0 b 1 ...b 00 p . l> lex l 0 ssi pour r = min{n, p} alors il existe i r tel que a i >b i et pour tout j<i, a j = b j avec < (reps. >) ordre alphabétique (inverser) sur les caractères. Ecrire une fonction ordrelexico implémentant l’ordre lexicographique. 1

Upload: luca-talenti

Post on 30-Nov-2015

29 views

Category:

Documents


0 download

DESCRIPTION

Python

TRANSCRIPT

Page 1: pc1-algoprog

École Centrale Paris 2013-2014 PC-1 Algo-ProgAvant-propos :

Il s’agit d’une feuille d’exercices, permettant de mettre en œuvre les éléments de syntaxe du langagePython. Il s’agit de manipuler les types prédéfinis de Python (booléens, entiers, flottants, chaînes de car-actères, listes, tuples, dictionnaires, . . . ) et les structures de contrôle (boucles, définition d’opérations,récursivité, . . . ).

L’énoncé est clairement long pour être terminé dans le cadre de la PC. Vous êtes invités à vous exercerà programmer en Python avec les questions qui n’auront pas été abordées lors de la séance. Le corrigé decette feuille d’exercices sera mis en ligne sur Claroline avant la PC 3 du 1er octobre.

Exercice 1 : Exercice sur les nombres.

1. Ecrire une fonction parfait qui décide si un nombre est parfait, c’est-à-dire s’il est égal à la somme deses diviseurs (par exemple, 6 est un nombre parfait).

2. Ecrire une fonction qui étant donné un entier n, calcule la liste des entiers parfaits inférieurs à n.

3. Ecrire un programme qui indique quels sont les nombres compris entre 0 et 999 tels qu’ils sont égauxà la somme des cubes des chiffres qui les composent. Par exemple, 153 = 13 + 53 + 33 = 1 + 125 + 27.

Exercice 2 : Modélisation d’un crédit automobile.

Dans cet exercice, nous allons réaliser un simulateur de crédit automobile. Ecrire un programme qui :

• demande à l’utilisateur de saisir les revenus mensuels de son foyer, le prix de la voiture, le taux ducrédit (en %), le nombre de mois du crédit ;

• calcule le montant d’une mensualité m à partir de la formule suivante :

m =P × t

12

1−(1 + t

12

)−n (1)

où P est le prix de la voiture, n le nombre de mois et t le taux du crédit ;

• affiche la mensualité et une indication comme quoi le dossier est favorable ou non (la banque accepteun crédit auto si et seulement si la mensualité ne représente pas plus de 15% des revenus du foyer).

Indication : utiliser la librairie math avec l’instruction import math, et la fonction puissance pow.

Exercice 3 : Loto.

Ecrire une fonction qui génère un tirage de loto, c’est-à-dire un tirage sans remise de 7 nombres entre 1et 49.

Indication : importer la fonction randint du module random en tapant au début de votre programmefrom random import randint. Pour obtenir un nombre entre [a; b] où a et b sont deux entiers, utilisez lafonction randint(a,b).

Exercice 4 : Exercice sur les chaînes de caractères.

1. L’ordre lexicographique≥ sur les chaînes de caractères s’exprime de la façon suivante : soient l et l′ deuxchaînes de caractères s’écrivant respectivement ′a1 . . . a′′n et ′b1 . . . b′′p . l >lex l′ ssi pour r = min{n, p}alors il existe i ≤ r tel que ai > bi et pour tout j < i, aj = bj avec < (reps. >) ordre alphabétique(inverser) sur les caractères. Ecrire une fonction ordrelexico implémentant l’ordre lexicographique.

1

Page 2: pc1-algoprog

2. On dit qu’une chaîne de caratères l (sous la forme ′a1 . . . a′′n) est préfixe d’une autre chaine de caractèresl′ (sous la forme ′b1 . . . b′p) ssi n ≤ p et ai = bi pour tout 1 ≤ i ≤ n. Ecrire une fonction prefixe aveccomme arguments deux chaînes de caractères, et rendant un booléen testant si le premier argumentest préfixe du second ou pas.

3. On dit qu’une chaîne de caractères l (sous la forme ′a1 . . . a′n) est suffixe d’une autre chaîne de caractèresl′ (sous la forme ′b1 . . . b′p ssi n ≤ p et ai = bp−n+i pour tout 1 ≤ i ≤ n. Ecrire une fonction suffixe aveccomme arguments deux chaînes de caractères, et rendant un booléen testant si le premier argumentest suffixe du second ou pas.

4. On dit qu’une chaîne de caractères l (sous la forme ′a1 . . . a′n) est motif d’une autre chaîne de caractèresl′ (sous la forme ′b1 . . . b′p ssi n ≤ p et l s’écrit ′b1 . . . bi a1 . . . an bi+n+1 . . . b

′p. Ecrire une fonction motif

avec comme arguments deux chaînes de caractères, et rendant un booléen testant si le premier argumentest un motif du second ou pas.

Exercice 5 : Equation du deuxième degré.

On s’intéresse aux solutions d’une équation de la forme ax2 + bx+ c = 0. Indiquez les solutions quelquesoit les valeurs de a, b et c entrées par l’utilisateur.

Exercice 6 : Exercice sur les entrées/sorties à propos de triangle

1. Ecrire une fonction qui étant donnés 3 nombres peuvent représenter les 3 côtés d’un triangle. On enécrira plusieurs versions :

• la première renvoie une simple chaîne de caractères indiquant le statut du triangle ’isocèle’,’équilatéral’, ou ’scalène’.

• la seconde indiquera de plus les longueurs concernées, par exemple ’isocèle de côté 4’. Deuxversions sont demandées, en utilisant les mécanismes de substitution des chaînes de caractères(%s) et sans les utiliser.

• la troisième renvoie un booléen indiquant si les 3 nombres peuvent représenter ou non les 3 côtésd’un triangle

2. Ecrire une fonction qui étant donnés 3 nombres calcule la surface du triangle de côtés, les nombresarguments (s’il existe). Rappel : la surface d’un triangle de côtés a, b et c, vaut

√s(s− a)(s− b)(s− c)

avec s = 12 (a+ b+ c) (formule de Héron).

3. Ecrire une fonction qui demande à l’utilisateur 3 valeurs et écrit à l’écran la surface du triangle corre-spondant, s’il existe, et sinon, redemande à l’utilisateur 3 nouvelles valeurs.

4. Ecrire une fonction qui calcule une ligne du triangle de Pascal (par récurrence, en calculant la ligne nà partir de la ligne n− 1).

5. Ecrire une fonction d’affichage qui imprime à l’écran le triangle de Pascal (si possible en centrant leslignes les unes au dessus des autres).

Exercice 7 : Exercice mixant les types liste et chaîne de caractères, décomposant un problème (la représen-tation compacte des données) en sous-problèmes.

En informatique on trouve souvent des fichiers avec beaucoup de caractères répétés, considérons parexemple le fichier qui contient la séquence aaaaa+++++++bchhhhhhhh.

2

Page 3: pc1-algoprog

Il est possible de représenter ces informations de manière plus compacte sous la forme d’une suite de couplesdont la première composante est le caractère représenté et la deuxième est le nombre de ses occurrencessuccessives. On dit alors que le fichier est sous forme compactée. Notre exemple est représenté par : (a,5)(+,7) (b,1) (c,1) (h,8). En Python, on décide de représenter ces fichiers compactés par des listes de coupleset dont les couples seront représentés par des tuples au sens du langage python. L’exemple compacté estalors codé en Python de la façon suivante :[("a",5),("+",7),("b",1),("c",1),("h",8)].

1. Définir la fonction compte qui prend en argument un fichier compacté et rend le nombre de caractèrescontenus dans le fichier non compacté correspondant.Exemple : appliquée sur la liste [("a",5),("+",7),("b",1), ("c",1),("h",8)], compte renvoie 22.Donner le type de la fonction compte.

2. Écrire une fonction expanse_car qui prend en argument un couple (c,n) où c est un caractère et nun entier et qui construit la liste contenant n fois le caractère c.Exemple : appelée avec le paramètre ("a", 5), expanse_car retourne la liste["a","a","a","a","a"].Donner le type de la fonction expanse_car.

3. En utilisant la fonction précédente et l’opérateur + de concaténation de listes, écrire une fonctionexpanse_tout qui prend en argument un fichier compacté et retourne la liste représentant le fichierd’origine.Exemple : appelée sur la liste [("a",5),("+",7)], expanse_tout retourne la liste["a","a","a","a","a","+","+","+","+","+","+","+"].

4. On s’intéresse maintenant à l’opération inverse compacter c’est-à-dire la fonction qui consiste à con-struire un fichier compacté à partir d’un fichier non compacté représenté par une liste de caractères.Par exemple, appliquée sur la liste["a","a","a","a","a","+","+","+","+","+","+","+","b","c"], la fonction compacter retournela liste[("a",5),("+",7),("b",1),("c",1)].Pour cela, on décompose le problème.Écrire une fonction compter_serie qui prend comme argument un caractère c et une liste de caractèresl et qui compte le nombre de fois où c apparait en tête de l. Si l commence par un autre caractèreque c, la fonction compter_serie retournera 0.Exemples : compter_serie "a" ["a","a","a","a","a","+","+","+","+","+","+","+","b","c"]retourne la valeur 5. L’expression compter_serie "b" ["a","a","a","a","a","+","+","+","+","+","+","+","b","c"]vaut 0.

5. Écrire la fonction supprimer_n définie par : supprimer_n n l est la liste l privée de ses n premierséléments. Faire échouer la fonction si l n’admet pas au moins n éléments.Quel est le type de la fonction supprimer_n ?

6. En utilisant les deux fonctions précédentes, écrire la fonction compacter.

Exercice 8 : Intégrales.

Le but de cet exercice est de comparer trois méthodes d’approximation d’une intégrale. Pour cela, nousallons considérer l’intégrale suivante : ∫ 1

0

1

1 + xdx

puisqu’on sait qu’elle vaut ln(2) qui est calculable en Python à partir du module math. Les méthodes quenous allons comparer sont :

3

Page 4: pc1-algoprog

• la méthode des rectangles : ∫ b

a

f(x)dx ≈ b− a

n

n−1∑i=0

f

(a+ i× b− a

n

)

• la méthode des points milieu :∫ b

a

f(x)dx ≈ b− a

n

n−1∑i=0

f

(a+

2i+ 1

2× b− a

n

)

• la méthode des trapèzes :∫ b

a

f(x)dx ≈ b− a

2n

n−1∑i=0

(f

(a+ i× b− a

n

)+ f

(a+ (i+ 1)× b− a

n

))

Ecrire une fonction pour chacune des méthodes d’approximation ci-dessus qui indique le nombre d’itérationsnécessaires pour atteindre une précision donnée par l’utilisateur. Utilisez pour cela un méthode dite de forcebrute, c’est-à-dire qui essaie toutes les valeurs de n dans l’ordre croissant jusqu’à obtenir la bonne précision.

Exercice 9 : Variable aléatoire discrète et dictionnaires.

Il est possible de représenter une variable aléatoire discrète par un dictionnaire python dans lequel lesclés sont les différentes valeurs de la variable aléatoire et les valeurs sont les probabilités associées à chacunde ses valeurs.

• Ecrire une fonction newVAD qui permet à l’utilisateur de saisir une variable aléatoire discrète ;

• Ecrire une fonction check qui vérifie qu’un dictionnaire représente bien une variable discrète aléatoire(i.e. la somme des probabilités doit être égale à 1) ;

• Ecrire une fonction esp qui retourne l’espérance de la variable aléatoire discrète passée en paramètre.

Exercice 10 : Exercice sur la récursivité, les types à l’aide des listes.

1. Ecrire trois versions d’une fonction sum calculant la somme des éléments d’une liste d’entier (resp. uneversion récursive, une version itérative avec la structure de contrôle while, une version itérative avec lastructure de contrôle for). Ainsi, sum([1,4,1]) = vaut 6.

2. En utilisant la fonction sum, écrire une fonction calculant la somme des n premiers nombres (n ≥ 0).

3. Ecrire une fonction reverse qui prend comme argument une liste, et renvoie une liste constituée desmêmes éléments que la liste argument, rangés dans l’ordre inverse. Ainsi, reverse([4,5,8]) vaut [8,5,4].

4. Ecrire une fonction palindrome qui teste si une liste représente un palindrome, au sens est égale àsa liste renversée. En écrire deux versions, d’une part en utilisant la fonction reverse de la questionprécédente, et d’autre part en utilisant directement les fonctions d’accès aux éléments de la liste àl’aide de leur index.

5. Ecrire une fonction sublist qui prend deux listes en arguments, et renvoie True si les éléments de lapremière liste sont tous éléments de la seconde liste. Ainsi sublist([2,3,4],[1,2,4,5,3]) vaut True.

4

Page 5: pc1-algoprog

6. Ecrire une fonction allindex qui prend en argument un élément e et une liste l et renvoie la liste desindex des occurrences de l’élément e dans la liste l. Ainsi, allindex(3,[2,2,1,3,3,5,8]) vaut [4,5].

7. Ecrire une fonction separate qui prend deux arguments, un élément e et une liste l, et renvoie uncouple constitué de la liste des éléments de l supérieurs à e, et de la liste des éléments strictementinférieurs à e. Ainsi separate(3,[2,5,1,7,0,3]) vaut ([3, 7, 5], [0, 1, 2])

8. Ecrire une fonction oftype qui teste si tous les éléments d’une liste argument sont de même type. Ainsioftype([1,2,3],int) vaut True tandis que oftype([1,True,3],int) vaut False.

9. Ecrire une fonction checkunif qui test si les éléments d’une liste sont tous de même type. Ainsicheckunif([3,5,6]), checkunif([’tôto’,’titi’]) valent True tandis que checkunif([3,’toto’]) vaut False.

10. Ecrire une fonction depth qui calcule le degré d’imbrication d’une liste. Ainsi depth([1,[2,[[3]]],6]) vaut4 car la liste argument contient 4 niveaux d’imbrication (au niveau de l’élément 3).

11. Ecrire une fonction flatten qui aplatit une liste (au sens où elle conserve les éléments, mais enlève lesniveaux d’imbrication intermédiaires). Ainsi, flatten([1,[2,[[3]]],6]) vaut [1, 2, 3, 6].

5