INFO-F206 : Informatique Syllabus d’exercices Liran Lerman Nikita Veschikov Catharina Olsen Partiellement réalisé sur la base du syllabus d’exercices du cours INFO-F-101 Édition 2013–2014 Chapitre 1 Introduction Ex. 1.1. Allez dans le menu Applications et cherchez à lancer l’application IDLE située dans l’onglet Programmation. Ex. 1.2. Entrez les expressions suivantes dans l’interpréteur et regardez le résultat : 1. 5 2. 5 + 1 3. x = 5 4. x + 1 5. x = x + 1 6. x Ex. 1.3. Utilisez l’interpréteur pour afficher les textes suivants (rappel : print) : 1. Hello World 2. Aujourd’hui 3. C’est "Dommage !" 4. Hum \0/ Ex. 1.4. Évaluez (à la main) les expressions suivantes et essayez de deviner le type du résultat. Utilisez ensuite l’interpréteur Python pour vérifier vos réponses (rappel : type()) : 1. 14 - 14 2. 1 + 6.9 3. 1.0 + 2.0 4. 5. 18 7+1 (3+2)∗2.5 4∗2 1 6. 3− 2 7. 0 * 0.0 Ex. 1.5. Allez sur le site Python.org et cherchez dans la documentation du langage (« language reference ») de l’aide à propos de print. Comparez avec le résultat obtenu dans l’interpréteur lorsque vous entrez help(’print’). Cherchez à vous renseigner sur d’autres aspects de Python vus au cours (int, str, les opérateurs, . . .). 1 2 Ex. 1.6. Certaines des lignes de code suivantes contiennent des erreurs. Il peut s’agir d’erreurs syntaxiques ou sémantiques et certaines lignes génèrent des exceptions. Indiquez pour chacune d’entre elles le type d’erreur (s’il y en a) ou le résultat et expliquez brièvement. Vérifiez ensuite à l’aide de l’interpréteur. Le résultat désiré par le programmeur est indiqué en gras. 1. print ’’Bonjour’ Bonjour 2. ’bla’ * 3.0 ’blablabla’ 3. ((1 + 4) / (6 * 2) 0.4166666666666667 4. int(’’14’’) 14 5. int(’3+4’) 7 6. ’3 * 3’ * 3 ** 2 81 7. 3 + 2 / 0 + 2 2 8. print ’Il y a ’ + 31 + ’ jours en janvier’ Il y a 31 jours en janvier Ex. 1.7. Résolvez les problèmes suivants à l’aide de l’interpréteur : 1. Le volume d’une sphère de rayon r est donné par 34 πr3 . Quel est le volume d’une sphère de rayon 5 ? (Notez que 392.6 n’est pas la bonne réponse !) 2. Le prix affiché d’un livre est de $24.95, mais vous bénéficiez d’une réduction de 40 %. Par ailleurs, les frais d’envoi sont de $3 pour le premier livre et de 75 cents pour chaque livre supplémentaire. Quel est le prix total pour 60 livres ? 3. Si vous parcourez 10 kilomètres en 43 minutes et 30 secondes, quel est votre temps moyen par mile ? Quelle est votre vitesse moyenne en miles par heure ? (Pour rappel, 1.61 km = 1 mile) 4. Supposez que la vitesse d’une marche normale est de 8 minutes et 15 secondes par kilomètre et la vitesse d’une marche soutenue est de 7 minutes et 12 secondes par kilomètre. Si vous partez à 6h52 et que vous parcourez un kilomètre à un rythme normal, puis 3 kilomètres à un rythme soutenu et encore un kilomêtre à un rythme normal, à quelle heure vous arrêterez-vous ? Ex. 1.8. Supposez que vous ayez quatre variables : a, b, c et d. Comment pourriez-vous vous y prendre pour inverser l’ordre des valeurs qu’elles rèfèrent sans utiliser l’assignation multiple comme a,b,c,d = d,c,b,a ? Par exemple, si à l’initialisation, a = 1, b = 2, c = 3 et d = 4, comment obtenir 4 3 2 1 à l’écran en entrant print (a, b, c, d) ? Chapitre 2 Branchements conditionnels Ex. 2.1. Que font les fonctions suivantes ? Testez avec des exemples. – def function1(n) : if n%2==0 : return True return False – def function2(n) : result = n if n%2==0 : result = result/2 else : result = result-1 result = result/2 return result – def function3(n) : if n%3==0 and not n%2==0: res = True elif n%4==0 and n%7==0: res = True else: res = False return res Ex. 2.2. Adaptez les fonctions de l’exercice précédent comme l’assistant vous l’indique. Ex. 2.3. Écrivez un programme pour calculer les racines réelles d’une équation du second degré ax2 + bx + c = 0. Utilisez l’algorithme suivant : – Le programme demande à l’utilisateur de taper les valeurs de a, b et c. – Il calcule ensuite les racines réelles de l’équation sur la base des règles suivantes : – ∆ = b2 − 4ac – si ∆ est négatif, le programme affiche "il n’y a pas de solutions réelles", – si ∆ est nul, le programme affiche la solution unique : −b 2a – si ∆ est positif, le programme affiche les 2 solutions : √ b2 −4ac – x1 = −b+ 2a – x2 = √ −b− b2 −4ac 2a Ex. 2.4. Faire un programme qui calcule l’Indice de Masse Corporelle d’une personne (IMC = masse [kg] / taille2 [m]) et qui indique l’état dans lequel cette personne se trouve en se ba3 4 sant sur la valeur de l’IMC : IMC (kg/m2 ) moins de 16,5 16,5 à 18,5 18,5 à 25 25 à 30 30 à 35 35 à 40 plus de 40 Interprétation dénutrition ou famine maigreur corpulence normale surpoids obésité modérée obésité sévère obésitê morbide ou massive Chapitre 3 Boucles Ex. 3.1. Que fait cette suite d’instructions lorsque b vaut 0 et lorsqu’il vaut 3 ? a = 1 while a <= b: print(a,end=" ") a += 1 print(a) Ex. 3.2. Que fait cette suite d’instructions lorsque b vaut 1 et lorsqu’il vaut 4 ? for a in range(b): print(a,end=" ") print(a) Ex. 3.3. Modifiez le code suivant pour obtenir la factorielle de 4 à l’aide d’une boucle while. res=0 for a in range(1,5): res = res + a print(res) Ex. 3.4. Modifiez le code suivant pour obtenir le résultat de 46 à l’aide d’une boucle for. res=0 i = 1 while i < 7: res = res + 4 i = i+1 print(res) Ex. 3.5. Donnez un code Python, utilisant une boucle for, réalisant l’algorithme ci-dessous. – Pour chaque entier compris entre −10 et 10 – Si ce nombre est strictement plus petit que 0, afficher « négatif » – Si ce nombre est strictement supérieur à 0, afficher « positif » – Si ce nombre est égal à 0, afficher « nul » Ex. 3.6. Donnez un code Python, utilisant une boucle while, réalisant l’algorithme ci-dessous. – Pour chaque entier compris entre 1 et 5 – Si ce nombre est strictement plus petit que 2, afficher sa valeur multipliée par deux – Sinon afficher sa valeur multipliée par trois 5 6 Ex. 3.7. Écrire un programme avec une boucle while qui calcule la moyenne des résultats d’une interrogation, ces notes étant données en input, la fin des données étant signalée par la valeur sentinelle −1 (c’est-à-dire une valeur particulière qui détermine la fin du relevé de note pour calculer la moyenne). On suppose aussi que la suite des notes contient toujours au moins un élément. Ex. 3.8. Écrire un programme avec une boucle for qui calcule la moyenne arithmétique des nombres compris entre les entiers 3 et 480. Ex. 3.9. Écrire une fonction Python qui résout de manière approchée des équations du type : xd − ax − b = 0, avec a, b, deux nombres réels strictement positifs, et d un nombre entier strictement positif. La méthode utilisée sera itérative. On calculera les termes initiaux de la suite {xk }k≥0 , définie par la valeur initiale x0 = 0 et la relation suivante : 1 xk+1 = (axk + b) d . Le critère d’arrêt des itérations sera double : soit on atteint un nombre maximal d’itérations fixé à l’avance, et la fonction renvoie la valeur None, soit l’écart en valeur absolue entre les deux dernières valeurs calculées est inférieur à un certain ε, et la fonction renvoie la dernière valeur. La fonction sera de la forme iter (a, b, d, n, eps), où a, b et d sont les paramètres de l’équation, n le nombre maximal d’itérations, et eps la valeur ε utilisée pour l’arrêt des itérations. Ex. 3.10. Soit (Fn )n∈N la suite de Fibonacci définie par : F0 = 0 F1 = 1 Fn = Fn−1 + Fn−2 pour n ≥ 2 On considère la somme (Sn )n∈N définie par : Sn = n X 1 Fi i=1 Donnez une fonction python qui calcule une approximation de la limite de la somme (Sn )n∈N . L’en-tête de cette fonction est : somme_inv_fibo ( N, epsilon) Cette fonction s’arrête : – soit lorsque l’on a calculé N termes de la suite (Sn ), – soit lorsque le dernier terme de la somme, F1n , est inférieur à epsilon. Chapitre 4 Listes Ex. 4.1. En supposant que L est une liste et que e est un objet quelconque, que renverra la fonction suivante ? def f(L,e): n = 0 for elem in L: if elem == e: n += 1 return n Ex. 4.2. En supposant que max est un entier positif et que b est un nombre réel (float), que renverra la fonction suivante ? def f(max,b): resultat = [] n = 1 for i in range(max): resultat.append(n) n = n * b return resultat Ex. 4.3. Adaptez la fonction suivante pour qu’elle renvoie l’élément minimal de la liste donnée en paramètre. def f(L): resultat = L[0] for elem in L: if elem > resultat: resultat = elem return resultat Ex. 4.4. Adaptez la fonction suivante pour qu’au retour de la fonction, chaque élément de L est remplacé par la somme de tous les éléments qui le précédaient dans la liste. Par exemple, la liste [1,2,3,4,5] deviendrait [1,3,6,10,15]. def f(L): for i in range(len(L)): L[i] *= L[i] Ex. 4.5. Écrivez une fonction qui prend une liste L (dont la longueur sera dénotée par n dans la suite) de nombres en paramètre et qui effectue l’algorithme suivant : 7 8 – Dans une nouvelle liste L2 de même longueur que L, recopier les deux premiers éléments de L aux mêmes cases de L2 – Pour chaque entier i entre 2 et n − 1 – Stocker dans la ie case de L2 la somme des éléments de L en positions (i − 1) et (i − 2). – Renvoyer L2 Ex. 4.6. Écrivez une fonction qui, pour une liste L donnée en paramètre, renvoie la longueur de la plus longue séquence triée dans l’ordre croissant. Ex. 4.7. La fonction suivante vérifie si, dans une liste L donnée, les éléments d’indice impair sont triés entre eux dans l’ordre croissant. Écrivez une fonction qui dira si les éléments de valeur paire sont triés dans l’ordre croissant. def indices_impairs_tries(L): trie = True i = 1 while trie and i < len(L)-2: if L[i] > L[i+2]: trie = False i += 2 return trie Chapitre 5 Matrices Ex. 5.1. Ecrivez une fonction init_mat(m,n) et une fonction print_mat(M). La première construit une matrice d’entiers initialisée à la matrice nulle et de dimension m × n. La seconde prend une matrice en paramètre et affiche son contenu. Ex. 5.2. Que fait la fonction suivante ? def symetrie(m): sym = True i = 0 n = len(m) while i < n and sym: j = 0 while j < i and sym: if m[i][j] != m [j][i]: sym = False j += 1 i += 1 return sym Ex. 5.3. Ecrivez une fonction sumMat(a,b) qui calcule et renvoie une matrice result – la somme des matrices a et b : resulti,j = ai,j + bi,j , ∀i ∈ [0, m − 1], j ∈ [0, n − 1] Vous pouvez supposer que les matrices a et b ont les mêmes dimensions (m × n). Ex. 5.4. Écrivez une fonction trace(M) qui prend en paramètre une matrice M de taille n × n et qui calcule sa trace de la manière suivante : tr(A) = n X i=1 . . . . 9 Aii 10 Ex. 5.5. On se donne un tableau de nombres, encodé ligne par ligne, sous forme d’une liste dont chaque élément est lui-même une liste d’entiers. Par exemple le tableau 1 2 3 4 5 6 7 8 9 sera encodé sous forme de la liste [[1,2,3], [4,5,6], [7, 8, 9]]. Ecrire une fonction flip(M) qui reçoit un tel tableau en paramètre, et échange chaque élément d’indice i, j avec l’élément d’indice n − i − 1, m − j − 1, où n est le nombre de lignes et m le nombre de colonnes de M. (On utilise ici la convention Python pour les indices, commençant donc à 0.) Par exemple, le tableau ci-dessus sera modifié de la façon suivante : 9 8 7 6 5 4 3 2 1 Ex. 5.6. Une matrice M = {mij } de taille n × n est dite antisymétrique lorsque pour toute paire d’indices i, j, on a mij = −mji . Ecrire une fonction booléenne qui teste si une matrice est antisymétrique. La matrice sera passée en paramètre sous forme d’une liste de n listes, chacune de taille n. Le nombre n peut être passé en paramètre également. Ex. 5.7. Écrivez une fonction booléenne qui reçoit en paramètre un tableau de taille n × n et qui répond à la question suivante : existe-t-il une ligne, une colonne, ou une des deux diagonales du tableau qui ne contient que des valeurs identiques ? Le tableau sera représenté par une liste de listes, chacune de ces dernières représentant une ligne du tableau. Par exemple, la fonction renverra la valeur True pour le tableau [[1,2,3],[3,2,1],[2,2,1]] car la seconde colonne ne contient que la valeur 2.