Les tableaux (ou vecteurs) (1/3) Cours numéro 3: Programmation impérative LI213 Types et Structures de données. Les tableaux (3/3) Les tableaux (2/3)



Documents pareils
Recherche dans un tableau

modules & compilation

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

Cours de Programmation 2


Algorithmique et Programmation, IMA

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

Présentation du langage et premières fonctions

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Classes et Objets en Ocaml.

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Programmer en JAVA. par Tama

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

Introduction au langage C

TP 1. Prise en main du langage Python

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

STAGE IREM 0- Premiers pas en Python

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Conventions d écriture et outils de mise au point

TP3 : Manipulation et implantation de systèmes de fichiers 1

LES TYPES DE DONNÉES DU LANGAGE PASCAL

ACTIVITÉ DE PROGRAMMATION

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

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Chap III : Les tableaux

Analyse de sécurité de logiciels système par typage statique

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

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Java Licence Professionnelle CISII,

Cours d algorithmique pour la classe de 2nde

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

Langage Java. Classe de première SI

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Rappels Entrées -Sorties

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

TP, première séquence d exercices.

Les chaînes de caractères

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Gestion mémoire et Représentation intermédiaire

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

Programmation système I Les entrées/sorties

Programme Compte bancaire (code)

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

INF 321 : mémento de la syntaxe de Java

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)

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours 1 : La compilation

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

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

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

Anne Tasso. Java. Le livre de. premier langage. 10 e édition. Avec 109 exercices corrigés. Groupe Eyrolles, , ISBN :

Découverte de Python

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

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Une introduction à Java

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

1. Structure d'un programme FORTRAN 95

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

Introduction à l algorithmique et à la programmation M1102 CM n 3

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

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

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

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

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

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

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

ALGORITHMIQUE ET PROGRAMMATION En C

Initiation à la programmation en Python

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

Java 1.5 : principales nouveautés

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)

Programmation en Caml pour Débutants

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Utilisation d objets : String et ArrayList

Logiciel Libre Cours 2 Fondements: Programmation

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

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

as Architecture des Systèmes d Information

Corrigé des TD 1 à 5

Cours d Algorithmique et de Langage C v 3.0

Algorithmes et programmation en Pascal. Cours

Arbres binaires de recherche

Projet de programmation (IK3) : TP n 1 Correction

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Les structures. Chapitre 3

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Examen Médian - 1 heure 30

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

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

1 Lecture de fichiers

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

Introduction à MATLAB R

Compilation (INF 564)

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Programmation Objet Java Correction

Approche Contract First

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

2 Comment fonctionne un ordinateur, dans les grandes lignes

Cours 1: Java et les objets

Transcription:

Les tableaux (ou vecteurs) (1/3) Le type tableau est une des réponses à la question : LI213 Types et Structures de données Licence d Informatique Université Paris 6 comment agréger un très grand nombre de données de même type? Représenter un point 3D (N-uplet cf. cours4) : # let p3d=(3.,2.,3.);; Comment représenter un polygone défini par un grand nombre de points? Représenter un descripteur de fichier (enregistrement cf. cours 4) : # type fichier = { nom :string ; taille :int ;...};; Comment représenter le contenu d un répertoire? Les tableaux (2/3) définition Les vecteurs, ou tableaux à une dimension, regroupent un nombre connu d éléments de même type. On peut écrire directement un vecteur en énumérant ses valeurs encadrées par les symboles [ et ] et séparés par des ;. L accès à un élément se fait par la notation tableau.(indice) où indice commence en 0. La modification d une valeur dans le tableau est possible par l opérateur <-. (cf. enregistrement mutable / cours4) Les tableaux (3/3) 0 1 2 3 4 3.2 1.0 1.5 2.9 56.6 3.0 # let a=[ 1. ; 1.5 ; 3.2 ; 2.9 ; 56.6 ];; val a : float array = [ 1. ; 1.5 ; 3.2 ; 2.9 ; 56.6 ] # a.(2);; - : float = 3.2 # a.(5);; Exception : Invalid argument "index out of bounds". # a.(2)<-2. *. a.(1) pas de let ;; # a;; - : float array = [ 1. ; 1.5 ; 3. ; 2.9 ; 56.6 ]

Tableaux : valeur ou variable? Le tableau est une valeur. # let a= [ 1 ;2 ;4 ;5 ;3 ];; pourtant on peut changer son contenu. # a.(2)<-5;; (instruction d affectation <- et non le =) Petite digression à la C : adresses (et pointeurs) a(5,1050,int) 0 1 2 3 4 1 2 4 5 3 1050 1054 1058 1062 1066 a : «zone de mémoire ; début :1050 ; taille :5 TINT» a.(i) : «entier situé en début+i TINT ; i<taille» a.(i)<-... : «changer la valeur en mémoire, à l adresse début+i TINT» Manipulation sur les tableaux Les fonctions dédiées à la manipulation des tableaux font partie du module Array de la bibliothèque standard. Array.create taille valeur # let montableau=array.create 3 2.0;; val montableau : float array = [ 2. ; 2. ; 2. ] Array.length tableau # Array.length montableau;; - : int = 3 Array.copy tableau # let a=array.copy montableau;; val a : float array = [ 2. ; 2. ; 2. ] Array.append tableau1 tableau2 # let b=array.append montableau a;; val b : float array = [ 2. ; 2. ; 2. ;2. ; 2. ; 2. ] Tableaux de tableaux (1/2) Tableaux de tableaux (2/2) Pas de restrictions sur les types des cellules d un tableau... # let pascal = [ [ 1 ; 1 ] ; [ 1 ; 2 ; 0 ] ; [ 1 ; 3 ; 3 ; 1 ] ; [ 1 ; 4 ; 6 ; 4 ; 1 ] ];; val pascal : int array array =... # pascal.(0);; - : int array = [ 1 ; 1 ] # pascal.(1).(1);; - : int = 2 # pascal.(1)<- [ 1 ; 2 ; 1 ];; # pascal.(1).(2)<-1;; # let a=[ 1 ; 2 ];; val a : int array = [ 1 ; 2 ] # let b=[ [ 1 ; 2 ] ; [ 1 ; 2 ] ];; val b : int array array = [ [ 1 ; 2 ] ; [ 1 ; 2 ] ] # let c=[ a ; a ];; val c : int array array = [ [ 1 ; 2 ] ; [ 1 ; 2 ] ] b(2,1840,int array) (2,1157,(2,1345, int) int) 1840 1840+x 1 2 1157 1861 # a.(1)<- 3;; # c;; 1 2 1345 1349 c(2,1930,int array) (2,1620,(2,1620, int) int) 1930 1930+x 1 1620 a(2,1620,int) 2 3 1624 val c : int array array = [ [ 1 ; 3 ] ; [ 1 ; 3 ] ]

Le type string Les chaînes de caractères peuvent être considérées comme un cas spécial de tableaux de caractères. Néanmoins, leur type est spécialisé et l accès aux éléments possède une syntaxe particulière. Chaîne de caractères # let s = "hello world!";; val s : string = "hello world!" # s.[0];; - : char = h # s.[5]<-! ;; # s;; - : string ="hello!world!" # String.length s;; - : int = 12 Programmation fonctionnelle et impérative Programmation impérative : modèle de Turing Programme = données + traitements/transformations. Mécanismes de portées (locales/globales) et d agrégations (procédure, OO) : simplification de la lecture des programmes. Une partie des données servent à décrire l état du programme. Une procédure peut modifier des données de portée supérieure à celle de la procédure : effet de bord. Programmation fonctionnelle Programme = application d une série de fonctions sur les données d entrée pour obtenir les sorties escomptées. Pas d état pour le programme. Pas de modification de valeur. Pas d effet de bord. Pourquoi s intéresser à la prog. fonctionnelle? Inconvénients de la programmation impérative Effets de bord : difficultés et bugs assurés État du programme : difficultés et bugs assurés Avantages de la programmation fonctionnelle Assurance mathématique : le résultat ne dépend que des données d entrée. Transparence référentielle : le résultat ne change pas, pour des valeurs d entrées égales. Maintenance, test unitaire, parallélisation facilités par tout ça. De l eau dans son vin Tous les langages fonctionnels modernes intègrent des traits d impératif, pour faciliter certaines expressions. Les valeurs mutables et les références permettent quand même les effets de bord locaux, si besoin. Jeu d instructions de type impératif (séquence, boucle for, boucle while,...) Récursif un peu bête # let affiche v = let rec aff i v = if (i<length v) then ( print int v.(i) ; print string " " ; aff (i+1) v ) else () in aff 0 v;; Impératif un peu correct # let affiche v = for i=0 to (length v - 1) do ( print int v.(i) ; print string " " )

Fonctions et instructions En OCAML(langage fonctionnel), tout est expression. Donc toute compilation aboutit à une évaluation d un résultat. # 3+3;; - : int = 6 # let x=4.;; val x : float =4. # let f x=x.[1];; val f : string -> char Que faire des instructions? affectation Entrée/sortie # v.(5)<-4.3;; = <fun> affichage d une chaîne # print string "hello!";; affichage d un entier # print int 3;; affichage d un flottant # print float 2.12;; La valeur () Le type unit n a que () comme valeur possible. () comme résultat # x.(3)<-4.;; L opération est effectuée. Pas de résultat. La valeur () peut également servir comme paramètre (indiquant une fonction sans paramètre) () comme paramètre # print newline;; - : unit->unit = <fun> # print newline ();; () comme paramètre # let f = 3;; val f : int = 3 # let f () = 3;; val f : unit->int = <fun> unit->[type] et [type]->unit La séquence Exemples de fonction unit->[type]? et [type]->unit? unit -> [type] : input [type]->unit : output # read line;; # print char;; - : unit -> string=<fun> - : char -> unit=<fun> # read int;; # print string;; - : unit -> int=<fun> - : string -> unit=<fun> # read float;; # print int;; ; - : unit -> float=<fun> - : int -> unit=<fun> # print float;; unit -> unit : output - : float -> unit=<fun> # print newline;; # print endline;; - : unit -> unit=<fun> - : string -> unit=<fun> Définition La séquence est une expression composée d une suite d expressions, séparées par des ; et qui seront évaluées l une après l autre (de gauche à droite). Le type et la valeur de la séquence sont ceux de la dernière expression de la liste. Toute autre expression de la liste devrait être de type unit. Séquence parenthésée par des () ou par begin / end. # print string "bonjour, 3+3=" ; 3+3;; bonjour, 3+3 = - : int = 6 # 2+2 ;3+3;; Warning : this expression should have type unit. : - int = 6

La boucle «for» Boucle for for nom = expr1 to expr2 do expr3 done for nom = expr1 downto expr2 do expr3 done expr1 et expr2 sont des int. expr3 est un unit. nom est une valeur nommée dans l environnement de expr3!! # for i=1 to 10 do print int i ; print string " " done ; print newline();; 1 2 3 4 5 6 7 8 9 10 # for i=10 downto 1 do print int i done ; print newline();; 10987654321 La boucle «for» Boucle for for nom = expr1 to expr2 do expr3 done Question : quand sont évaluées expr1 et expr2? Boucle et séquence Lorsqu une expression est nécessaire, une séquence de même type peut être utilisée! # for i = print string "A " ; 1 to print string "B " ;5 do print int i A B 12345 Et le tant que? (Enfin!) des effets de bord En algorithmique, ces 2 programmes sont équivalents : Boucle for pour i = 1 jusqu à 5 faire écrire i fin pour # for i = 1 to 5 do print int i Boucle tant que i = 1 tant que i<=5 faire écrire i i=i+1 fin tant que? while expr1 : bool do expr2 : unit done Nécessite que expr2 modifie le contexte de expr1... Effet de bord Question : peut-on faire des effets de bord maintenant? Réponse : oui! Grâce à séquence + valeurs mutables valeurs mutables = cellule de tableaux (ou champs mutables cf. cours 4) Effet de bord # let a = [ 1 ];; val a : int array = [ 1 ] # for i=1 to 10 do a.(0)<-a.(0)+2 ;print int i 12345678910 # a;; - : int array = [ 21 ]

Référence On sait faire des valeurs mutables (création, accès, modification). # let a = [ 1 ];; val a : int array = [ 1 ] # a.(0);; - : int = 1 # a.(0)<-5;; Plus direct : les références Création let x =[ 12 ] let x = ref 12 Accès x.(0)!x Modification x.(0)<-x.(0)+1 x :=!x + 1 La boucle «while» Boucle while while expr1 do expr2 done expr1 est de type bool. exp2 est de type unit. # for i = 1 to 10 do print int i ; print string " " done ;; # let i = ref 1 in while!i <=10 do print int!i ; print string " " ; i :=!i + 1 Programmation fonctionnelle ou impérative? Privilégier la programmation fonctionnelle Utiliser la programmation impérative si besoin (séquence ou for) Savoir mixer si besoin Générateur d identifiants uniques But : Écrire initid :()->() et getid :()->string qui, à chaque appel, fournit un identifiant unique : # initid();; # getid();; - : string = "i1" # getid();; - : string = "i2"... initid() et getid() : version impérative 1 Version purement fonctionnelle? Impossible : utilise un effet de bord. 2 Version impérative alors : # let idvalue = ref 0;; # let initid () = idvalue := 0;; val initid : unit -> unit = <fun> besoin d une variable globale! # let getid () = idvalue :=!idvalue+1 ; "i" ˆ (string of int!idvalue);; val getid : unit -> string = <fun> Mais c est vraiment très laid! idvalue :=... est modifiable pour tous!!

initid() et getid() : version mixte but : utiliser une référence (prog. impérative) mais utiliser la prog. fonctionnelle pour encapsuler la référence. # let idfactory () = let idvalue = ref 0 in let initid() = idvalue :=0 and getid() = idvalue :=!idvalue+1 ; "i" ˆ (string of int!idvalue) in (initid,getid) ;; val idfactory : unit -> (unit -> unit) * (unit -> string) = <fun> # let (ia,ga) = idfactory();; # let (ib,gb) = idfactory();; # ia () ;ga();; # ib () ;ga();; # ga() ˆ gb();; - : string = "i1" - : string = "i2" - : string = "i3i1" Les exceptions # let f x y = x / y;; Quelle est la valeur de f 3 0 ou de f (-1) 0? On aimerait retourner ± mais aucun int n encode + ou Quelle est la valeur de f 0 0? On aimerait retourner une «valeur indéfinie» mais aucun int n encode cette valeur Problème : que doit-on faire? Solution : 1 ne surtout pas retourner de valeur int 2 trouver un mécanisme indiquant que l on ne peut retourner de valeur «valide» = c est le mécanisme des exceptions. Les exceptions # let f x y = x / y ;; let y = f 10 3 ;; let z = f 3 0;; y : int = 3 Exception : Division by zero Remarque : pas de «z :» devant Exception = pas de liaison (z,division by zero) = Division by zero n est pas une valeur retournée Description d une exception une valeur de type exn. on ne la retourne pas : on la lève (raise) on ne crée pas de liaison dont elle est la valeur : on la rattrape (try... with) Le mécanisme des exceptions (1/3) Description du mécanisme 1 Quand une exception est levée (via un raise), tous les calculs en suspens sont arrêtés. 2 On remonte récursivement les instructions qui ont entraîné ces calculs jusqu à rencontrer un try... with qui englobe ces instructions et récupère l exception. 3 Si on ne trouve pas de try... with, le programme se termine. # let f x y = print int (x / y) ;; f 4 0 ;; f 10 2;; val f : int -> int -> unit = <fun> Exception : Division by zero. pas de try... with = on n exécute pas f 10 2

Le mécanisme des exceptions (2/3) # let f x y = x / y ;; let g x y = 1 + f x y ;; let h x y = try print int (g x y) with Division by zero -> print string "erreur\n" ;; h 1 0;; val g : int -> int -> int = <fun> val h : int -> int -> unit = <fun> erreur 1 (g 1 0) appelle f 1 0 qui lève l exception 2 exception non rattrapée (pas de try... with) = on remonte (sans les effectuer) les calculs de f en g puis en h 3 on remonte au try... with Division by zero 4 exception rattrapée = exécution du print string Le mécanisme des exceptions (3/3) # let f x y = (x / y) ;; let g x y = 1 + f x y ;; let h x y = try print int (g x y) with Not found -> print string "erreur\n" ;; h 1 0;; val g : int -> int -> int = <fun> val h : int -> int -> unit = <fun> Exception : Division by zero. Ici, le try... with ne récupère que l exception Not found = Division by zero n est pas rattrapée Créer une nouvelle exception Déclarer une nouvelle exception sans argument Il suffit d utiliser le mot-clé exception : # exception Mon exception de la mort qui tue;; exception Mon exception de la mort qui tue L exception peut alors être levée/rattrapée Tout nom d exception doit commencer par une majuscule Déclarer une nouvelle exception avec argument exception nom exception of type argument # exception Exn with arg of int;; exception Exn with arg of int Lever une exception Comment lever une exception sans argument raise nom exception : # let f x y = if y = 0 then raise Division by zero else x / y;; Comment lever une exception avec argument raise (nom exception argument) : # let f x y = if y = 0 then raise (Failure "message") else x / y;; raise : exn -> a = (raise nom exception) est de type a = peut être utilisé dans n importe quelle fonction

Le failwith Une exception très utilisée : Failure # raise (Failure "texte");; Trop compliqué à écrire pour un informaticien = remplacé par la fonction failwith : # let failwith texte = raise (Failure texte);; gain à utiliser failwith : on gagne 8 caractères par rapport au raise Si vous tapez à 240 caractères / minute et que vous écrivez 10 failwith par jour, alors après 1 an de programmation, vous aurez gagné 2 heures!!!!