Devoir d'informatique n o 3 (2

Documents pareils
STAGE IREM 0- Premiers pas en Python

Initiation à la programmation en Python

Programmation C++ (débutant)/instructions for, while et do...while

1 Recherche en table par balayage

Recherche dans un tableau


Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours Informatique Master STEP

Introduction à MATLAB R

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Licence Sciences et Technologies Examen janvier 2010

Organigramme / Algorigramme Dossier élève 1 SI

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Algorithmique et Programmation, IMA

Découverte de Python

DM 1 : Montre Autoquartz ETA

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Corrigé des TD 1 à 5

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Initiation à l algorithmique

I. Introduction aux fonctions : les fonctions standards

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Bases de programmation. Cours 5. Structurer les données

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Algorithmique et structures de données I

Cours d Algorithmique et de Langage C v 3.0

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

Algorithmes récursifs

TP 1. Prise en main du langage Python

Java Licence Professionnelle CISII,

TD3: tableaux avancées, première classe et chaînes

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Quelques algorithmes simples dont l analyse n est pas si simple

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Chp. 4. Minimisation d une fonction d une variable

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Perl Orienté Objet BioPerl There is more than one way to do it

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Programme Compte bancaire (code)

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Présentation du langage et premières fonctions

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

Cours 7 : Utilisation de modules sous python

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Algorithmes et mathématiques. 1. Premiers pas avec Python. Exo Hello world!

Conventions d écriture et outils de mise au point

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources

Algorithmique et programmation : les bases (VBA) Corrigé

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

TP, première séquence d exercices.

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Les arbres binaires de recherche

Cours d initiation à la programmation en C++ Johann Cuenin

Cours d Informatique

Application 1- VBA : Test de comportements d'investissements

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Plan du cours. Historique du langage Nouveautés de Java 7

L exclusion mutuelle distribuée

Principes des langages de programmation INF 321. Eric Goubault

Représentation d un entier en base b

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

La boucle for La boucle while L utilisation du if else. while (condition) { instruction(s) }

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Algorithmique I. Algorithmique I p.1/??

Les structures de données. Rajae El Ouazzani

Cours d algorithmique pour la classe de 2nde

Ordonnancement temps réel

avec des nombres entiers

Optimisation, traitement d image et éclipse de Soleil

Chapitre 1 I:\ Soyez courageux!

Initiation à LabView : Les exemples d applications :

La classification automatique de données quantitatives

Programmation avec Xcas ou Python

1. Structure d'un programme FORTRAN 95

Programmation linéaire

Définition : On obtient les nombres entiers en ajoutant ou retranchant des unités à zéro.

CORRECTION EXERCICES ALGORITHME 1

Télécom Nancy Année

Exercices de dénombrement

Propagation sur réseau statique et dynamique

Calcul Formel et Numérique, Partie I

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Langage Java. Classe de première SI

Probabilités sur un univers fini

Solutions du chapitre 4

Exercices sur les interfaces

Transcription:

Devoir d'informatique n o 3 (2 heures) Ce devoir est constitué de plusieurs petits exercices. L'ordre des exercices ne correspond à aucun critère de diculté ou de longueur : vous pouvez les traiter dans l'ordre que vous voulez. Veillez à soigner la copie tant pour l'écriture, la propreté que pour la rédaction, la rigueur et l'argumentation. De plus, on prètera une attention particuliére au respect des alignements et des indentations des séquences d'instructions Python. La calculatrice est interdite. Vous numéroterez vos copies et ferez apparaître clairement sur la première page le nombre de copies. Exercice 1 1. Ecrire une fonction factorielle prenant comme argument un entier naturel n et qui renvoie n! (On n'acceptera pas bien sûr de réponse utilisant la propre fonction factorielle du module math ou numpy de Python. ). 2. Ecrire une fonction seuil prenant comme argument un entier M et qui renvoie le plus petit entier n tel que n! > M. 3. Ecrire une fonction booléenne nommée est_divisible prenant comme argument un entier naturel n et qui renvoie True si n! est divisible par n+1 et False sinon. 4. On considère la fonction suivante nommée mystere 1 def mystere ( n ) : 3 for k in range (1, n +1) : 4 s = s + factorielle ( k ) (a) Quelle valeur renvoie mystere(4)? (b) Expliquer ce que fait cette fonction mystere en faisant intervenir un invariant de boucle (c) Déterminer le nombre de multiplications qu'eectue mystere(n) (On supposera que l'appel à factorielle(k) nécessite k multiplications ). (d) Proposer une amélioration du script de la fonction mystere an d'obtenir une complexité linéaire i.e en (n) Exercice 2 La fonction mystere suivante prend comme arguments deux tableaux (à une dimension) t et s. 1 def mystere (t, s ) : 2 lt, ls = len ( t ), len ( s ) 3 if lt!= ls : 4 return ( False ) 5 i = 0 6 while i < lt and t [ i ] == s [ ls - i - 1] : 7 i = i + 1 8 return ( i == lt ) 1. Que retournent les appels suivants? (a) mystere( [ ], [ ] ) (b) mystere([1,2,3,4], [4,3,2,1]) (c) mystere([1,2,5,4], [4,3,2,1]) (d) En général, quel est le résultat d'un appel de la fonction mystere? Justier brievement. 2. Evaluer la complexité en temps (dans le meilleur des cas et dans le pire des cas)de la fonction mystere 1

Exercice 3 1. Soit la fonction syr suivante qui prend comme argument un entier naturel n : 1 def syr ( n ) : 4 k = k // 2 5 return ( k ) (a) Donner les suites des valeurs successives prises par la variable k lors des deux appels syr(32) et syr(20) (b) Quelles sont les complexités en temps dans les meilleurs et pires des cas de la fonction syr 2. Soit la fonction syrac suivante qui prend comme argument un entier naturel n : 1 def syrac ( n ) : 7 k = 1 (a) Donner les suites des valeurs successives prises par la variable k lors des deux appels syrac(32) et syrac(20) (b) Quelles sont les complexités en temps dans les meilleurs et pires des cas de la fonction syrac 3. Soit la fonction syracuse suivante qui prend comme argument un entier naturel n : 1 def syracuse ( n ) : 7 k = 3* k + 1 On rappelle que le probleme de savoir si en partant d'un entier naturel quelconque, on arrive nécessairement à 1 est un probleme ouvert i.e. on ne connait pas encore de réponse à cette question. (a) Donner les suites des valeurs successives prises par la variable k lors des deux appels syracuse(32) et syracuse(20) (b) Quelles sont les complexités en temps dans les meilleurs et pires des cas de la fonction syracuse 4. Soit la fonction syrfor suivante qui prend comme argument un entier naturel n : 1 def syrfor ( n ) : 3 for i in range ( n +1) : 4 s = s + syr ( i ) Quelles sont les complexités en temps dans les meilleurs et pires des cas de la fonction syrfor? 2

Exercice 4 1. Ecrire une fonction sommechires prenant comme argument un entier naturel n et qui renvoie la somme des chires du nombre n (en base 10) On veut écrire une fonction qui teste si un nombre est multiple de 9 en utilisant la propriété suivante Un entier est multiple de 9 si et seulement si la somme de ses chires est multiple de 9. Le principe est de répéter le calcul de la somme des chires jusqu'à obtenir un nombre d'un seul chire. Exemple : si on teste avec n = 9565938. On calcule la somme de chires : on trouve 45. On réitère le processus avec 45 : on trouve 9. On s'arrête et on conclut que 9565938 est bien un multiple de 9. 2. Ecrire une fonction estmultiplede9 prenant comme argument un entier naturel n et qui renvoie True si c'est un multiple de 9 et False sinon, en utilisant la propriété indiquée. On n'aura pas le droit d'utiliser les opérateurs % et / ou // dans cette question 3. Ecrire une fonction indicederniermultiplede9 prenant comme argument un tableau unidimensionnel t d'entiers et qui retourne le plus grand indice de t où se trouve un multiple de 9, et retourne None si aucun multiple de p n'est présent dans le tableau t. On demande un algorithme qui minimise le temps d'exécution dans le cas le plus favorable. 4. Ecrire une fonction supprimerpremiermultiplede9 prenant comme argument un tableau unidimensionnel t et qui renvoie le tableau obtenu à partir de t en supprimant le premier élément qui est un multiple de 9. Exercice 5 On veut représenter un tableau t de nombres par un autre tableau c appelé codage de t. Les suites consécutives de valeurs identiques de t sont représentées dans c par deux nombres r,v où r est le nombre de répétitions de la valeur v dans une telle suite. Une valeur v de t qui ne se répète pas est donc représentée par 1, v. Une valeur v qui se répète deux fois consécutivement est représentée par 2, v, et ainsi de suite. Par exemple, le codage de t= [0, 0, 0, 0, 5, -2, -2, -2, 0, 0, 0, 0, 0] est c= [4, 0, 1, 5, 3, -2, 5, 0]. Un entier à un indice pair dans c représente donc un nombre de répétitions consécutives d'une valeur de t. 1. Ecrire une fonction decoder qui prend comme argument un tableau c de longueur paire et qui renvoie le tableau t dont c est le codage. 2. Quelle est la complexité de votre fonction decoder? Justier la réponse On veut écrire la fonction de codage qui prend en entrée un tableau t et renvoie son codage c. (a) Ecrire une fonction longueurbloc prenant comme argument un tableau t et un entier pos et qui renvoie la longueur du plus long bloc de positions consécutives du tableau t commençant à la position pos, et composé de cases consécutives qui contiennent toutes la valeur t[pos]. Par exemple avec t = [0, 0, 0, 0, 5, -2, -2, -2, 0, 0, 0, 0, 0], les appels longueurbloc(t, 0), longueurbloc(t, 1), longueurbloc(t, 4), longueurbloc(t, 8) doivent retourner respectivement 4, 3, 1 et 5. (b) En utilisant la fonction longueurbloc, écrire une fonction codage prenant comme argument un tableau t et qui renvoie le codage du tableau t. 3

Exercice 1 CORRECTION 1 def factorielle ( n ) : 2 p = 1 1. 3 for k in range (1, n +1) : 4 p = p * k 5 return ( p ) 1 def seuil ( M ) : 2 p, n = 1, 1 3 while p <= M : 2. 4 n = n + 1 5 p = p * n 6 return ( n ) 1 def est_divisible ( n ) : 2 p = factorielle ( n ) 3 if p %( n +1) == 0: 3. 4 return ( True ) 5 else : 6 return ( False ) 4. On considère la fonction suivante 1 def mystere ( n ) : 3 for k in range (1, n +1) : 4 s = s + factorielle ( k ) (a) mystere(4) retourne 33 (b) On reprend les noms des variables locales de la fonction mystere. On note (u n ) n N la suite n dénie par : n N, u n = k!. Montrons que l'expression s u k est un invariant de k=1 boucle. A la première itération dans la boucle. s vaut 0 en entrée et on lui ajoute 1! soit s vaut 1 à la n de la première itéeration ce qui est exactement la valeur de u 1. Hérédité. A la k + 1-ième itération, k prend la valeur k + 1, s prend la valeur s + (k + 1)! et u k+1 = u k + (k + 1)!. Donc s u k a la même valeur au début de l'étape k + 1 qu'à la n de cette étape. Ainsi s u k est bien un invariant de boucle. Or cette expression vaut 0 en entrée : elle vaut donc toujours 0 en sortie, soit lorsque k vaut n. n Ainsi mystere(n) retourne u n = k! k=1 (c) Lors de l'appel mystere(n), on eectue à l'étape k, 1 addition, 1 aectation et k multiplications (en calculant factorielle(k)). Donc au total nous eectuons n additions et n(n + 1) 2 multiplications (d) On améliore la complexité en temps, en calculant en parallèle le produit des premiers entiers et la somme des premières factorielles. 1 def mystererapide ( n ) : 2 p, s = 1, 1 3 for k in range (2, n +1) : 4 p = p * k 5 s = s + p 6 return ( s ) Exercice 2 La fonction mystere suivante prend comme arguments deux tableaux (à une dimension) t et s. 4

1 def mystere (t, s ) : 2 lt, ls = len ( t ), len ( s ) 3 if lt!= ls : 4 return ( False ) 5 i = 0 6 while i < lt and t [ i ] == s [ ls - i - 1] : 7 i = i + 1 8 return ( i == lt ) 1. Que retournent les appels suivants? (a) mystere( [ ], [ ] ) retourne True (b) mystere([1,2,3,4], [4,3,2,1])retourne True (c) mystere([1,2,5,4], [4,3,2,1])retourne False (d) La fonction prend en paramètres deux tableaux t et s, et vérie si la suite des éléments dans t, lue du plus petit indice au plus grand indice, est la même que la suite dans des éléments dans s lue en sens inverse 2. Dans la meilleur des cas, les tableaux ne sont pas de la même longueur et au bout d'un test, on retourne le résultat : complexité dans le meilleur des cas : (1) Dans le pire des cas, les tableaux sont à l'envers l'un de l'autre ou quasiment (ils diérent de leur miroir par le dernier élément à tester). Dans ce cas, on a eectué 2 len(t) tests de len(t) additions : complexité dans le pire des cas : (len(t)) Exercice 3 1. Soit la fonction syr suivante qui prend comme argument un entier naturel n : 1 def syr ( n ) : 4 k = k // 2 5 return ( k ) (a) Lors de l'appel syr(32), la variable k prend successivement les valeurs : 32, 16, 8, 4, 2, 1 et le retour est 1 Lors de l'appel syr(20), la variable k prend successivement les valeurs : 20, 10, 5, 2, 1 et le retour est 1 (b) Les complexités dans les pires et les meilleurs des cas pour l'appel de syr(n) sont identiques : il s'agit de (log 2 (n)) 2. Soit la fonction syrac suivante qui prend comme argument un entier naturel n : 1 def syrac ( n ) : 7 k = 1 5

(a) Lors de l'appel syrac(32), la variable k prend successivement les valeurs : 32, 16, 8, 4, 2, 1 et le retour est 1 Lors de l'appel syrac(20), la variable k prend successivement les valeurs : 20, 10, 5, 1 et le retour est 1 (b) Dans le meilleur des cas, à savoir lorsque n est impair, la complexité est (1). Dans le pire des cas, à savoir lorsque n est une puissance de 2, la complexité est (log 2 (n)). 3. Soit la fonction syracuse suivante qui prend comme argument un entier naturel n : 1 def syracuse ( n ) : 7 k = 3* k + 1 On rappelle que le probleme de savoir si en partant d'un entier naturel quelconque, on arrive nécessairement à 1 est un probleme ouvert i.e. on ne connait pas encore de réponse à cette question. (a) Lors de l'appel syracuse(32), la variable k prend successivement les valeurs : 32, 16, 8, 4, 2, 1 et le retour est 1 Lors de l'appel syracuse(20), la variable k prend successivement les valeurs : 20, 10, 5, 16, 8, 4, 2, 1 et le retour est 1 (b) Dans le meilleur des cas, à savoir lorsque n est une puissance de 2, la complexité est (log 2 (n)) Dans le pire des cas, la complexité est inconnue, au moins tant que le problème de savoir si la suite nit par arriver à 1 si on part d'un entier n quelconque reste ouvert. 4. Soit la fonction syrfor suivante qui prend comme argument un entier naturel n : 1 def syrfor ( n ) : 3 for i in range ( n +1) : 4 s = s + syr ( i ) Dans les pires et les meilleurs des cas, l'appel à syrfor(n) nécessite et tests, soit une complexité de (n log 2 (n)) n log 2 (k) additions, divisions k=1 Exercice 4 1 def sommechiffres ( n ) : 2 k, s = n, 0 3 while k > 0: 1. 4 s = s + k % 10 5 k = k // 10 6 return ( s ) 1 def estmultiplede9 ( n ) : 3 while k > 9: 2. 4 k = sommechiffres9 ( k ) 5 if k ==9 or k == 0 : 6 return ( True ) 7 else : return ( False ) 6

1 def i n d i c e D e r n i e r M u l t i p l e d e 9 ( t ) : 2 for k in range ( len ( t ) -1, -1, -1) : 3. 3 if estmultiplede9 ( t [ k ]) : 4 return ( k ) 5 return ( None ) 1 def s u p p r i m e r P r e m i e r M u l t i p l e d e 9 ( t ) : 2 tab, c = [], 0 3 for k in range ( len ( t ) ) : 4 if not estmultiplede9 ( t [ k ]) or c > 0 : 4. 5 tab. append ( t [ k ]) 6 if estmultiplede9 ( t [ k ]) : 7 c = 1 8 return ( tab ) Exercice 5 On veut représenter un tableau t de nombres par un autre tableau c appelé codage de t. Les suites consécutives de valeurs identiques de t sont représentées dans c par deux nombres r,v où r est le nombre de répétitions de la valeur v dans une telle suite. Une valeur v de t qui ne se répète pas est donc représentée par 1, v. Une valeur v qui se répète deux fois consécutivement est représentée par 2, v, et ainsi de suite. Par exemple, le codage de t= [0, 0, 0, 0, 5, -2, -2, -2, 0, 0, 0, 0, 0] est c= [4, 0, 1, 5, 3, -2, 5, 0]. Un entier à un indice pair dans c représente donc un nombre de répétitionsconsécutives d'une valeur de t. 1. 1 def decoder ( c ) : 2 tab = [] 3 for k in range ( len ( c ) //2) : 4 n, val = c [2* k ], c [2* k +1] 5 for k in range ( n ) : 6 tab. append ( val ) 7 return ( tab ) 2. La complexitéde la fonction decoder est la somme des valeurs aux positions paires de c. (a) 1 def longueurbloc (t, pos ) : 2 c, k, n = 0, pos, len ( t ) 3 while k < n and t [ k ] == t [ pos ]: 4 c, k = c + 1, k + 1 5 return ( c ) (b) 1 def codage ( t ) : 2 tab, pos, n = [], 0, len ( t ) 3 while pos < n : 4 p = longueurbloc (t, pos ) 5 tab. append ( p ) 6 tab. append ( t [ pos ]) 7 pos = pos + p 8 return ( tab ) 7