Cours d informatique du 17/11/2009 A. Rappels sur les boucles



Documents pareils
Chapitre 2 Devine mon nombre!

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)

STAGE IREM 0- Premiers pas en Python

Java Licence Professionnelle CISII,

Découverte de Python

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

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

Recherche dans un tableau

Initiation à la programmation en Python

Initiation à l algorithmique

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

Utilisation d objets : String et ArrayList

Conventions d écriture et outils de mise au point

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

Programmer en JAVA. par Tama

Programmation Orientée Objet Java

Corrigés des premiers exercices sur les classes

Corrigé des TD 1 à 5

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

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

Les arbres binaires de recherche


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

Les structures de données. Rajae El Ouazzani

Algorithmique I. Algorithmique I p.1/??

Projet de programmation (IK3) : TP n 1 Correction

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

1 Recherche en table par balayage

Introduction au langage C

Solutions du chapitre 4

Cours de Programmation 2

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Licence Sciences et Technologies Examen janvier 2010

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Algorithmique et Programmation, IMA

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

Langage Java. Classe de première SI

MIS 102 Initiation à l Informatique

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

4. Groupement d objets

Programmation avec Xcas ou Python

Apprendre Java en 154 minutes

Génie Logiciel avec Ada. 4 février 2013

Corrigé des exercices sur les références

Algorithmes récursifs

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

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

Programmes des classes préparatoires aux Grandes Ecoles

Problèmes liés à la concurrence

Introduction à MATLAB R

Cours 7 : Utilisation de modules sous python

Claude Delannoy. 3 e édition C++

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

Chapitre 4 Pierre, papier, ciseaux

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

Les bases du langage Python

Outils pour la pratique

Arbres binaires de recherche

Chap III : Les tableaux

Enseignement secondaire technique

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

Cours 14 Les fichiers

UE C avancé cours 1: introduction et révisions

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

Premiers Pas en Programmation Objet : les Classes et les Objets

Chapitre 10. Les interfaces Comparable et Comparator 1

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Ensimag 1ère année Algorithmique 1 Examen 2ième session 24 juin Algorithmique 1

INITIATION A LA PROGRAMMATION

Assurance Qualité. Cours de génie logiciel. Renaud Marlet. LaBRI / INRIA (d'après A.-M. Hugues) màj 23/04/2007

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

COURS WINDEV NUMERO 3

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Architecture des ordinateurs

Python - introduction à la programmation et calcul scientifique

Programmation Par Objets

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

PHP et mysql. Code: php_mysql. Olivier Clavel - Daniel K. Schneider - Patrick Jermann - Vivian Synteta Version: 0.9 (modifié le 13/3/01 par VS)

Présentation du PL/SQL

Encryptions, compression et partitionnement des données

AWS avancé. Surveiller votre utilisation d EC2

TP 1. Prise en main du langage Python

I. Introduction aux fonctions : les fonctions standards

Algorithmique, Structures de données et langage C

Cours d Algorithmique et de Langage C v 3.0

Résolution de systèmes linéaires par des méthodes directes

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Package Java.util Classe générique

Python Les fondamentaux du langage

SUPPORT DE COURS. Langage C

La compta à double entrée c'est bien, mangez-en

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

CONCOURS DE L AGRÉGATION INTERNE «ÉCONOMIE ET GESTION» SESSION 2015 SECONDE ÉPREUVE

Définitions. Numéro à préciser. (Durée : )

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Transcription:

Cours d informatique du 17/11/2009 A. Rappels sur les boucles 1) Rappel sur les invariants de boucle : L invariant de boucle est un outil pour concevoir cette boucle. Il peut exister plusieurs invariants de boucle pour un même problème. Tout dépend de la manière dont on résout le problème. Cet invariant fixe la signification des variables du problème. Reprenons le problème du tri étudié au cours du 10/11. 0 Zone non triée n Zone triée N-1 Dans ce cas, on dit qu à partir de n, le tableau est trié. Autrement dit, n marque le début de la section triée. Pour trier complètement le tableau, il faut tout d abord prendre n = N. Ensuite il faut diminuer n en ne violant pas l invariant de la boucle. Ici, l invariant de boucle est : P : {j n j < N} : {i 0 i j} : B[i] B[j] A chaque itération, il faut restituer l invariant de boucle P. Reprenons l exemple du programme «Bubble sort» import numpy as np def bubble(b, upto): imaxchanged = 0 for i in range(1, upto): if B[i-1] > B[i]: # la condition de tri n est pas respectée # pour B[i-1] et B[i] B[i], B[i-1] = B[i-1], B[i] # la condition du tri est restaurée imaxchanged = i # Le tableau au dela de i est trié return imaxchanged S 0 N = 10 B = np.random.randint(0, 10, N) print B n = N while n > 0: n = bubble(b, n) print B

On remarque que le rôle de la séquence d instructions S 0 est de rétablir cet invariant de boucle. Avec ce code, on vérifié l invariant à chaque itération.! Chaque boucle a son invariant de boucle, même pour les boucles imbriquées! 2) Fin d une boucle : Lorsque l on crée une boucle, il faut vérifier qu elle se termine réellement à un moment. Pour vérifier cela, il faut vérifier que chaque instruction élémentaire et chaque boucle se termine réellement. Lorsqu on utilise l itérateur «for in», il n y a aucun problème. A chaque itération, l indice augmente. Tant que le problème qu il faut traiter contient un nombre fini d éléments, la boucle se termine toujours. En Python, il est donc plus sûr et plus simple d utiliser un itérateur tel que «for in» plutôt que l instruction «while». Il est en effet plus clair de voir que la boucle s arrêtera avec un itérateur. Reprenons comme exemple le problème du «bubble sort» écrit plus haut : Il y a deux boucles dans cet algorithme. La première boucle avec l itérateur «for in» se termine forcément puisque l indice i augmente d une unité à chaque itération. L indice «upto» étant fini, l indice i fini par atteindre la valeur «upto 1». La boucle se termine alors. Il est plus difficile de prouver que la deuxième boucle se termine. Pour le prouver, il suffit de montrer que «imaxchanged» est toujours plus petit que «upto». Si le tableau est trié, imaxchanged = 0, et donc n = 0, ce qui implique que la boucle s arrête. Tant que le tableau n est pas totalement trié, on a 1 i < upto, et donc toute nouvelle valeur de i est inférieure à n-1. La valeur de n diminue donc à chaque itération et fini par être nulle, ce qui arrête la boucle puisque le gardien est falsifié.! Quand on travaille avec une boucle, il est toujours plus simple de d abord réfléchir à partir d un dessin!

B. Problème des chaînes avec parenthèses Commençons à étudier ce problème par quelques exemples : a(b[{c}d])[e] est correct a(b[{c}d)[e] est faux puisque le premier crochet n est pas fermé a(b[{c}d)[e]] est faux. Cette fois, toutes les parenthèses ouvertes sont fermées mais elles ne le sont pas dans le bon ordre. Seul le premier exemple a une forme correcte. Quel pourrait être l algorithme qui vérifierait si l ordre d ouverture et de fermeture est correct? Une première approche est de dire qu on doit avoir des blocs imbriqués et enchaînés pour que l expression soit correcte. Cela peut se représenter avec un dessin. Voici une idée d algorithme : On pourrait tout d abord créer une liste. Ensuite, en parcourant la chaîne de caractère, chaque fois que l on rencontre une parenthèse ouverte, on l ajoute à la liste. Et lorsque l on trouve une parenthèse fermée, on la compare au dernier élément de la liste. S il s agit de l élément correspondant ouvert ( ( si on a ), { si on a } et [ si on a ] ), on supprime cet élément de la liste. S il s agit d un autre élément, il y a une erreur dans l ordre d ouverture et de fermeture. Reprenons le premier exemple correct. Voici, étape par étape, l évolution de la liste : 1 : ( 5 : ( 2 : ( [ 6 : / 3 : ( [ { 7 : [ 4 : ( [ 8 : / On observe donc qu on retrouve une liste vide après avoir parcouru tout le tableau. Essayons avec le deuxième exemple : 1 : ( 2 : ( [ 3 : ( [ { 4 : ( [ 5 : Il y a un problème : on trouve maintenant une parenthèse fermée. Or le crochet précédent n a pas été fermé.

Attention, on pourrait avoir une autre idée : à chaque fois que l on rencontre une parenthèse ouvert, on incrémente un compteur d une unité. Si on a une parenthèse fermée, on le décrémenterait. Cet algorithme déterminerait s il y a autant de parenthèses ouvertes que fermées, mais ne saurait pas dire qi les parenthèses ont été fermées dans le bon ordre. Revenons donc à la première idée. Cet algorithme peut s apparenter à une pile de livre. Il est facile de prendre ou d ajouter un livre sur le haut de cette pile. Il est par contre plus difficile d en insérer au milieu de cette pile. De même dans ce programme, on ne travaille qu à la fin de la liste. Cette structure de donnée s appelle donc structure de pile. Cette structure a trois opérations : - push(elem) ajoute un élément à la liste - elem = pop() regarde, supprime le dernier élément de la liste et rend celui qu on regarde - elem = top() consulte le dernier élément de la liste sans le supprimer Avec ces trois opérations, nous pouvons écrire en deux parties l algorithme qui déterminera si la chaîne est correctement parenthèsée. stack.py # Stack def newstack(): return [] def push(stack, elem): stack.append(elem) # ajoute l élément à la liste def pop(stack): # supprime le dernier élément return stack.pop() # pop existe déjà dans Python et supprime le dernier élément de la liste def top(stack): # doit regarder sans supprimer return stack[-1] # regarde le dernier élément

parentheses.py import sys import stack # faut un dictionnaire des caractères parens = {'(':')', '[':']', '{':'}'} # crée une pile leftparens = stack.newstack() # appelle la fonction newstack qu'on a importé string = sys.argv[1] for char in string: if char in parens: # si c'est une parenthèse gauche stack.push(leftparens, char) elif char in parens.values(): # si c'est une parenthèse droite # Faut vérifier si pile n'est pas vide if len(leftparens) == 0: print "no left parenthesis corresponding to", char break elif parens[stack.top(leftparens)] == char: # compare au correspondant grace à dico stack.pop(leftparens) else: print stack.pop(leftparens), "does not match", char break # si ce n'est ni parenthèse gauche ni droite, ne fait rien else: # s'exécute si on ne termine pas de boucle prématurément par break p. ex.. Ce else permet donc d éviter deux messages d erreur. if len(leftparens): # donne une valeur booléenne, mais on peut écrire if len(leftparens) > 0: print "No right parenthese for : ", leftparens En exécutant le code parentheses.py, on sait si la chaîne est correctement parenthésée ou non.