Algorithmique et Programmation (1/3)



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

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

Recherche dans un tableau

ACTIVITÉ DE PROGRAMMATION

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

I. Introduction aux fonctions : les fonctions standards

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

Utilisation d objets : String et ArrayList

Algorithmique et Programmation, IMA


Java Licence Professionnelle CISII,

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

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

Algorithmique avec Algobox

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

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

Cours d Informatique

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

Premiers Pas en Programmation Objet : les Classes et les Objets

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Généralités sur le Langage Java et éléments syntaxiques.

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Cours d Algorithmique et de Langage C v 3.0

Programmer en JAVA. par Tama

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

CORRECTION EXERCICES ALGORITHME 1

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

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

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

Chap III : Les tableaux

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

Algorithmique avec Algobox

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

Initiation à la programmation en Python

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)

Cours d algorithmique pour la classe de 2nde

Conventions d écriture et outils de mise au point

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

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

Série TD 3. Exercice 4.1. Exercice 4.2 Cet algorithme est destiné à prédire l'avenir, et il doit être infaillible! Exercice 4.3. Exercice 4.

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

Programmation Objet - Cours II

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

Chapitre 10. Les interfaces Comparable et Comparator 1

P r ob lé m a t iq u e d e la g é n é r icit é. Pr in cip e d e la g é n é r icit é e n Ja v a ( 1 /3 )

Auto-évaluation Programmation en Java

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

TP, première séquence d exercices.

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

STAGE IREM 0- Premiers pas en Python

Algorithmique et programmation : les bases (VBA) Corrigé

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

Cours 1: Java et les objets

Cours Informatique Master STEP

TD/TP PAC - Programmation n 3

OCL - Object Constraint Language

4. Groupement d objets

Héritage presque multiple en Java (1/2)

Algorithmes récursifs

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

Les chaînes de caractères

TP1 : Initiation à Java et Eclipse

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

Initiation. àl algorithmique et à la programmation. en C

Algorithmique & programmation

Langage Java. Classe de première SI

Chapitre 2. Classes et objets

Une introduction à Java

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

Structurer ses données : les tableaux. Introduction à la programmation

Cours 1 : Qu est-ce que la programmation?

Algorithmique, Structures de données et langage C

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

ALGORITHMIQUE ET PROGRAMMATION En C

Organigramme / Algorigramme Dossier élève 1 SI

Adama MBODJI MBODJ.SYSTEM

Compte-rendu de projet de Système de gestion de base de données

Le prototype de la fonction main()

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

TP 1. Prise en main du langage Python

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

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

Projet L1, S2, 2015: Simulation de fourmis, Soutenance la semaine du 4 mai.

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

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

as Architecture des Systèmes d Information

Algorithme. Table des matières

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Les structures de données. Rajae El Ouazzani

Rappels sur les suites - Algorithme

Tp 1 correction. Structures de données (IF2)

REALISATION d'un. ORDONNANCEUR à ECHEANCES

Programmation Orientée Objet Java

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

1 Recherche en table par balayage

Traduction des Langages : Le Compilateur Micro Java

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

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

Transcription:

Algorithmique et Programmation (1/3) Objectifs : Approfondir l'algorithmique abordée au premier semestre : nouveaux types de données (énumérations, types composés), algorithmes de recherche, algorithmes de tris, récursivité Aborder de nouveaux aspects de l'algorithmique : complexité des algorithmes Références : Algorithmes en Java, R. Sedgewick, Pearson Education Programmation Cours et Exercices, G. Chaty & J. Vicard, Ellipses Algorithmes et structures de données avec ADA, C++ et Java, A. Guerid, P. Breguet & H. Rothlisberger, PPUR Page du module : www.u-picardie.fr/~furst/algo_prog.php Page du module de S1 : http://home.mis.u-picardie.fr/~groult/enseignement/introinfo/ 1

Algorithmique et Programmation (2/3) Informatique : sciences et techniques du traitement automatisé de l'information, c'est à dire des données (information structurée). On doit définir quelle information traiter : représentation et encodage des données On doit définir comment traiter l'information : algorithme On doit faire exécuter cet algorithme par une machine : programmation «Computer Science is no more about computers than astronomy is about telescopes.» Edsger Dijkstra (prix Turing 1972) 2

Algorithmique et Programmation (3/3) TYPES ABSTRAITS DE DONNEES EN ENTREE ALGORITHME sur le papier TYPES ABSTRAITS DE DONNEES EN SORTIE implémenté par implémenté par implémenté par TYPES CONCRETS DE DONNEES EN ENTREE PROGRAMME dans des fichiers TYPES CONCRETS DE DONNEES EN SORTIE implémenté par DONNEES implémenté par TRAITEMENT (exécution d'un programme) implémenté par dans le processeur et la mémoire RESULTAT 3

Variable Dans un programme, les données sont manipulées via des variables : - une variable est une case mémoire - une variable est désignée par un nom (identifiant) - une variable a un type de donnée (implicite dans certains langages) - une variable contient une valeur du type et cette valeur peut varier Cycle de vie d'une variable : - déclaration de la variable (nom et type) - affectations de valeurs à la variable - suppression de la variable (souvent automatique) 4

Instructions Déclaration de variable : entier i; Affectation de valeur à une variable : i <- 23; Expressions numériques et logiques : ((i+2) * (j-t/23)) mod 4 (a ou (b et non c)) xor d Lecture au clavier / Ecriture à l 'écran : écrire "donnez votre nom"; chaine c; lire c; 5

Structures de contrôle Instructions conditionnelles : si (température > 12) alors écrire "je vais me baigner"; finsi si (a >= 16) alors écrire "mention bien"; sinon écrire "peut mieux faire"; finsi Boucles : chaine c <- ""; tantque (c "q") faire écrire "taper une chaine (q pour quitter)"; lire c; fintantque pour (i allant de 1 à 30 pas 1) faire écrire "ceci est le " + i + "ème tour de boucle"; finpour 6

Algorithme Un algorithme est une suite d'instructions séquentielles, éventuellement structurées par des conditionnelles et des boucles. algorithme TestPrimalité // nom de l'algorithme (optionnel) // déclarations des variables entier x,d; booléen b; début // début des instructions écrire "donnez un entier positif"; lire x; d <- 2; b <- false; tantque (non b et d*d <= x) faire si ((x mod d) == 0) alors écrire x+" n'est pas premier car il est divisible par "+d; b <- vrai; finsi d <- d+1; fintantque si (non b) a=alors écrire x+" est premier"; finsi fin 7

Comment écrire un algorithme (1/3) Problème : écrire un algorithme qui calcule le PGCD de deux nombres 1- Bien comprendre le problème et, si le principe de l'algorithme n'est pas donné, trouver un principe de résolution Méthode d'euclide (~300 av. JC) : soient deux nombres entiers positifs A et B tels que A >= B. Si le reste R de la division de A par B est 0, le PGCD de A et B est B. Sinon, le PGCD de A et B est le PGCD de B et de R. 2- Si on ne comprend pas bien le principe, l'utiliser sur un exemple Soit à calculer le PGCD de 123 et 27. 123 27 27 15 15 12 12 3 15 4 12 1 3 1 0 4 Le PGCD de 123 et 27 est donc 3. 8

Comment écrire un algorithme (2/3) 4- Si besoin, réaliser un organigramme pour mieux comprendre entier A,B,R ; écrire ''donner un entier positif'' ; lire A ; écrire ''donner un entier positif plus petit que le précédent'' ; lire B ; R A mod B ; FAUX R=0 VRAI A B ; B R ; écrire ''le PGCD est '' + B ; 9

Comment écrire un algorithme (3/3) 5- Ecrire l'algorithme entier A,B,R; début écrire "donner un entier positif"; lire A; écrire "donner un entier positif plus petit que le précédent"; lire B; R <- A mod B; tantque (R 0) faire A <- B; B <- R; R <- A mod B; fintantque écrire "le PGCD de A et B est " + B; fin 6- Il peut être utile, voire nécessaire, de prouver l'algorithme - l'algorithme va t'il toujours s'arrêter? - quand l'algorithme s'arrêtera, donnera t-il le bon résultat? 7- Il peut être utile d'évaluer l'efficacité de l'algorithme - n'existe t-il pas un algorithme plus rapide pour calculer le PGCD? 10

Fonction Une fonction est un bloc d'instructions qui peut être appelé dans un autre bloc. - la fonction a un nom (pour pouvoir être appelé) - la fonction a des paramètres, contenant des valeurs ou des références sur des variables - une fonction peut renvoyer une valeur au code qui l'a appelée. Le type de donnée de cette valeur est le type de retour de la fonction. Une fonction peut ne rien renvoyer (on parle alors parfois de procédure). paramètres entier A entier B pgcd type de retour entier 11

Déclaration de fonction La déclaration d'une fonction comporte une signature qui indique comment utiliser la fonction en précisant son nom et ses entrées/sorties, et un corps qui est le code de la fonction. signature corps fonction avec retour entier pgcd(entier A, entier B) entier R; début R <- A mod B; tantque (R 0) faire A <- B; B <- R; R <- A mod B; fintantque retourne B; fin Une fonction peut ne pas avoir de retour (et donc de type de retour). fonction sans retour ecritbonjour() début écrire "Bonjour"; fin 12

Appel de fonction On appelle une fonction par son nom, en lui fournissant les valeurs correspondant à ses paramètres (s'il y en a). Si la fonction renvoie une valeur, on peut la récupérer dans une variable ou l'utiliser directement. caractère c; entier A, B; début c ='O'; tantque (c 'N') faire écrire "voulez vous continuer (O/N)"; lire c; si (c 'N') alors écrire "donner un entier positif"; lire A; écrire "donner un entier positif plus petit que le précédent"; lire B; écrire "le PGCD de A et B est " + pgcd(a,b); finsi fintantque fin 13

Paramètres et entrées/sorties Attention : les paramètres d'une fonction servent à lui transmettre des valeurs. Il est donc redondant de lire au clavier des valeurs transmises par paramètres. Il est également absurde de redéfinir les paramètres dans le corps de la fonction. fonction avec retour entier pgcd(entier A, entier B) entier A,B,R; début écrire "donner A"; lire A; écrire "donner B"; lire B; R <- A mod B; tantque (R 0) faire A <- B; B <- R; R <- A mod B; fintantque retourne B; fin 14

Appel de fonction dans une fonction fonction avec retour entier plusgrand2(entier a, entier b) début si (a<b) alors retourne b; sinon retourne a; finsi; fin fonction avec retour entier plusgrand3(entier a, entier b, entier c) début retourne plusgrand2(plusgrand2(a,b),c); fin algorithme MonAlgo entier toto, titi, tutu; début lire toto; lire titi; lire tutu; écrire "le plus grand est " + plusgrand3(toto,titi,tutu); fin 15

Passage de paramètres (1/3) Un paramètre peut être transmis à une fonction par valeur : la valeur est clonée et la fonction travaille sur une variable interne. fonction avec retour entier multiplie2(entier x) début x <- 2*x; retourne x; fin entier x,y; x <- 12; y <- multiplie2(x); écrire "x vaut " + x; x y x 12? 24? 12 24 En algorithmique, on supposera que les paramètres de type primitif (entier, réel, booléen, caractère) sont toujours passés par valeur. C'est le cas en Java. 16

Passage de paramètres (2/3) Un paramètre peut être transmis à une fonction par référence : la fonction travaille sur la case mémoire correspondant à la variable qui stocke la valeur. fonction avec retour entier multiplie2(entier x) début x <- 2*x; retourne x; fin entier x,y; x <- 12; y <- multiplie2(x); écrire "x vaut " + x; x x y 12 24? 24? En algorithmique, on supposera que les paramètres de type composés (tableaux, enregistrements, etc) sont toujours passés par référence. C'est le cas en Java. 17

Passage de paramètres (3/3) Les langages de programmation permettent souvent de choisir la façon dont les paramètres sont passés aux fonctions. Exemple de passage d'un entier par référence en langage C : void multiplie2(int* i){ *i = (*i)*2; } int i; i = 3; multiplie2(&i); Exemple de passage d'un entier par référence en langage ADA : procedure multiplie2(i : in out Integer) is begin i := i*2; end multiplie2 i : Integer; i = 3; multiplie2(i); 18

Types de données Un type de données est défini par un ensemble de valeurs et un ensemble d'opérations. On distingue les types de données abtraits (au niveau algorithmique) et les types de données concrets (au niveau des langages de programmation). Exemples : - le type abstrait entier a pour valeurs tous les entiers positifs ou négatifs, et pour opérations +, -, *, / et mod (ainsi que l'opération externe =). - le type concret int en Java a pour valeurs les entiers compris entre 2 31-1 et -2 31 et pour opérations +, -, *, / et mod (ainsi que l'opération externe ==). Les types de données servent à faciliter la programmation et surtout à tester à la compilation la correction des programmes. 19

Création de types de données Certains langages permettent de créer des sous types de types existants en restreignant l'ensemble des valeurs et/ou les opérations. Exemple en ADA : subtype Age is INTEGER range 0..100; subtype Lettre is Character range 'a'..'z'; La plupart des langages permettent de créer de nouveaux types. - en créant des ensembles de valeurs définies par le programmeur : énumérations, ensembles, unions. - en assemblant des variables au sein de types composés : tableaux, enregistrement, listes, arbres, graphes, etc. 20

Types énumérés (1/4) Un type énuméré (ou énumération) est un type dont les valeurs sont données in extenso par le programmeur. Un type énuméré permet de définir des valeurs n'existant pas dans les types fournis par le langage. Un type énuméré s'utilise comme n'importe quel type pour typer des variables ou des paramètres. Exemple : type énuméré en Java (ou C ou C++ ou C#) enum ArcEnCiel {rouge, orange, jaune, vert, bleu, indigo, magenta, violet}; ArcEnciel aec = ArcEnCiel.jaune; enum Primaire {rouge, vert, bleu}; Primaire p = Primaire.rouge; Remarque : en Java, une valeur d'un type énuméré doit être préfixée par le nom du type, pour éviter toute ambiguité. En algorithmique, ce n'est pas nécessaire. 21

Types énumérés (2/4) Certains langages (dont Java et C) permettent de donner aux types énumérés des valeurs d'autres types stockées dans des variables. Exemple en Java : int vrai = 1; int faux = 0; String possible = "possible"; enum ValeurDeVerite {vrai, faux, possible}; Tous les langages permettant les types énumérés offrent des opérations d'égalité et d'inégalité sur ces types. Exemple en Java : ValeurDeVerite vv1, vv2;... if ((vv1 == vv2) && (vv1!= ValeurDeVerite.faux)) System.out.println("Tout est possible"); 22

Types énumérés (3/4) Il existe souvent une relation d'ordre sur les valeurs énumérées. Exemple : en Java v.ordinal() renvoie le numéro d'ordre de v dans le type. enum ArcEnCiel {rouge, orange, jaune, vert, bleu, indigo, magenta, violet}; ArcEnciel aec1, aec2; aec1 = ArcEnCiel.rouge; // aec1.ordinal() vaut 0 aec2 = ArcEnCiel.bleu; // aec2.ordinal() vaut 4 if (aec1.ordinal() > aec2.ordinal()) {...} Il peut exister des opérations de parcours des valeurs d'un type énuméré. Exemple en Java : for (ArcEnCiel aec : ArcEnCiel.values()) { System.out.println(aec.name()); } 23

Types énumérés (4/4) Le programmeur peut toujours ajouter des opérations sur un type énuméré qu'il a créé, en écrivant des fonctions. fonction avec retour ValeurDeVerite et(valeurdeverite vv1, ValeurDeVerite vv2) début si (vv1 = ValeurDeVerite.vrai) alors si (vv2 = ValeurDeVerite.vrai) alors retourne ValeurDeVerite.vrai; sinon si (vv2 = ValeurDeVerite.possible) alors retourne ValeurDeVerite.possible; sinon retourne ValeurDeVerite.faux; finsi finsi finsi si (vv1 = ValeurDeVerite.faux) alors retourne ValeurDeVerite.faux; finsi si (vv1 = ValeurDeVerite.possible) alors si ((vv2 = ValeurDeVerite.vrai) ou (vv1 = ValeurDeVerite.possible)) retourne ValeurDeVerite.possible; sinon retourne ValeurDeVerite.faux; finsi finsi fin 24

Types énumérés en algorithmique En algorithmique, pour les types énumérés, on adoptera la syntaxe la plus courante qui est celle du langage C (syntaxe reprise en C++ et en Java, entre autres). Les types énumérés seront déclarés dans la partie déclaration, avec les déclarations de variables. algorithme MonAlgorithme entier vrai, faux; chaine possible; enum ValeurDeVerite {vrai, faux, possible}; ValeurDeVerite vv1,vv2; début vrai <- 1; faux <- 0; possible <- "possible"; vv1 <- ValeurDeVerite.possible; vv2 <- ValeurDeVerite.faux; fin Comme en Java, on considère que les valeurs des types énumérés sont passés aux fonctions par référence. 25

Types composés Les données sont souvent complexes et les types primitifs (entier, booléen,...) ne suffisent pas à les représenter de façon efficace. Exemple : on veut représenter dans un programme les notes de 100 étudiants inscrits dans 5 modules : il faut 500 variables. réel notemodule1etudiant1, notemodule1etudiant2, notemodule1etudiant3,... notemodule2etudiant1,........., notemodule5etudiant100; Un type de données composé (ou structuré) est un type dont les valeurs sont composées de plusieurs valeurs. notemodule1etudiant1 notemodule1etudiant2... notemodule1etudiant99 notemodule1etudiant100... notemodule5etudiant1 notemodule5etudiant2... notemodule5etudiant99 notemodule5etudiant100 26

Tableaux Un type tableau est un type composé dont chaque valeur est composée d'autres valeurs (les cases du tableau), toutes du même type, et indicées par un type discret ordonné. Généralement, les indices sont des entiers, allant de 0 à la longueur du tableau-1. Exemple : tableau de 100 réels. notes notes[0] notes[1] notes[99] 12.0? 7.5?... 8.5 12 réel[100] notes; notes[0] <- 12.0; notes[1] <- 7.5;... notes[99] <- 8.5; Remarque : un type tableau est un type, un tableau est une valeur du type Exemple : - tableau de caractères est un type - le tableau de caractères ['t','o','t','o'] est une valeur de type tableau de caractères 27

Déclaration d'un tableau Comme toute variable, une variable de type tableau possède un nom et un type (celui de ses éléments). Un tableau possède également un nombre d'éléments. Exemple : déclaration de tableaux dans une syntaxe C ou C++ // déclaration d'un tableau de chaines de 12 cases char*[12] montableaudechaines; // déclaration d'un tableau d'entiers de 5 cases int montableaudentiers[5]; En algorithmique, on utilisera la même syntaxe (deux formes possibles) : <type des éléments>[<nombre d'éléments>] <nom de la variable>; <type des éléments> <nom de la variable>[<nombre d'éléments>]; Remarque : déclarer le tableau entraine la déclaration de toutes les variables contenues dans le tableau mais pas leur initialisation! 28

Accès aux cases d'un tableau On accède à une case d'un tableau en précisant son indice entre crochets. chaine[3] montableaudechaines; montableaudechaines[0] <- "toto"; montableaudechaines[1] <- "titi"; montableaudechaines[2] <- "tutu"; écrire montableaudechaines[1]; montableaudechaines[0] <- montableaudechaines[3]; Remarques : - une tentative d'accès à une case qui n'existe pas fera planter le programme! - accéder à une case non initialisée peut conduire à des erreurs d'exécution. 29

Initialisation d'un tableau (1/2) Exemple : initialisation à 1.0 des cases d'un tableau de 38 réels réel[38] montableaudereels; entier i; début pour (i allant de 0 à 37 pas 1) faire montableaudereels[i] <- 1.0; finpour fin Exemple : initialisation d'un tableau de 45 caractères à 'a' pour les cases d'indice pair et à 'b' pour les cases d'indice impair. caractère[45] t; entier i; début pour (i allant de 0 à 44 pas 1) faire si(i mod 2 = 0) alors t[i] <- 'a'; sinon t[i] <- 'b'; finsi finpour fin 30

Initialisation d'un tableau (2/2) Beaucoup de langages proposent une syntaxe pour initialiser les valeurs d'un tableau par énumération. - initialisation et déclaration sont alors regroupées dans la même instruction - on ne précise pas la taille du tableau dans la partie déclaration Cette méthode n'est utile que pour de petits tableaux. Exemples : // déclaration et remplissage d'un tableau de réels réel[] montableaudereels <- {3.2,4.0,3.14,2.78,10.6}; // déclaration et remplissage d'un tableau de chaines chaine montableaudechaines[] <- {"toto","titi","tutu","tete"}; 31

Longueur d'un tableau L'opérateur longueur (length en Java) permet de connaitre la taille d'un tableau. chaine[12] montableaudechaines; booléen[montableaudechaines.longueur*2] tableaudebooleens; début... écrire "le tableau a " + montableaudechaines.longueur + " éléments"; fin Remarques : - la taille d'un tableau ne peut pas varier - il faut savoir, avant de créer un tableau, de combien de cases on a besoin - il ne faut pas déclarer plus de cases que ce dont on a besoin, pour éviter d'occuper de la place en mémoire pour rien - si on ne sait vraiment pas de combien de cases on aura besoin, il existe des structures linéaires dynamiques (listes) dont la taille peut varier (cf. cours de L2) 32

Déclaration de types tableau Certains langages permettent la déclaration des types tableau (et non uniquement la déclaration des tableaux). // déclaration d'un type tableau de 5 entiers en ADA type MonTypeTableau is array(0.. 5) of Integer; // utilisation du type tableau pour déclarer un tableau MonTypeTableau montableau; // déclaration d'un type tableau de 5 entiers en Java class MonTypeTableau{ int[] t = new int[5]; } // utilisation du type tableau pour déclarer un tableau MonTypeTableau montableau = new MonTypeTableau(); MonTableau.t[0] <- 2;... En pratique, il est souvent sans intérêt de créer des types tableaux. 33

Tableau paramètre Rappel : les tableaux passés en paramètres de fonctions le sont par référence. fonction sans retour multiplie2tab(entier[] t) entier i; début pour (i allant de 0 à t.longueur-1 pas de 1) faire t[i] <- t[i]*2; finpour fin entier[] tab <- {1,2,3}; multiplie2tab(tab); écrire tab[0]; tab t i [1,2,3] [2,4,6]... 34

Tableau dynamique (1/2) Problèmes posés lorsqu'on fixe le nombre d'éléments d'un tableau à la déclaration : - on est obligé de savoir à l'avance combien il y aura de cases dans les tableaux retournés par les fonctions // fonction retournant le tableau des noms des étudiants d'un groupe chaine[12] fonction nomsetudiants(int numerogroupe)... chaine[35] etudiantsdugroupe2 = nomsetudiants(2); - on est obligé de connaitre à l'avance le nombre de cases d'un tableau passé en paramètre d'une fonction // fonction retournant la moyenne des réels du tableau paramètre réel fonction calculmoyenne(réel[56] notes)... réel[35] notesgroupe3 =... réel m <- calculmoyenne(notesgroupe3); 35

Tableau dynamique (2/2) Un tableau est dit statique si sa taille est fixée à la déclaration et dynamique si sa taille est fixée plus tard. chaine[27] montableaustatique chaine[] montableaudynamique... redim montableaudynamique[27]; // redimensionnement Les tableaux dynamiques permettent aux fonctions de travailler sur des tableaux de taille arbitraire. chaine[] fonction nomsetudiants(int numerogroupe)... chaine[] etudiantsdugroupe2 = nomsetudiants(2); reel fonction calculmoyenne(reel[] notes)... 36

Déclaration de tableau en Java En Java, les tableaux sont toujours dynamiques : // déclaration d'un tableau de chaines en Java String[] montableaudechaines; // redimemsionnement du tableau montableaudechaines = new String[12]; // déclaration et redimemsionnement sur la même ligne String[] monautretableau = new String[12]; // déclaration et redimemsionnement d'un tableau d'entiers int montableaudentiers[] = new int[23]; double tab[12]; // erreur à la compilation Remarque : dans la partie déclaration, les crochets peuvent être placés avant ou après le nom du tableau, mais attention en cas de déclaration multiple. int[] t1,t2; // t1 et t2 sont des tableaux d'entiers int t1,t2[]; // t1 est un entier et t2 un tableau d'entiers int t1[],t2; // t1 est un tableau d'entiers et t2 un entier 37

Tableaux dynamiques en algorithmique Rappel : déclaration d'un tableau statique. <type des éléments>[<nombre d'éléments>] <nom de la variable>; <type des éléments> <nom de la variable>[<nombre d'éléments>]; Déclaration et redimensionnement d'un tableau dynamique : deux syntaxes possibles pour la déclaration, une seule pour le redimensionnement. <type des éléments>[] <nom de la variable>; <type des éléments> <nom de la variable>[]; redim <nom de la variable>[<nombre d'éléments>]; 38

Tableau vide (1/2) Pour des raisons pratiques, il peut être nécessaire de traiter des tableaux vides. Exemple : fonction qui renvoie le tableau des entiers pairs contenus dans un tableau d'entiers passé en paramètre. fonction avec retour entier[] pairs(entier[] t) entier[] resultat; entier i,nb; début nb <- 0; pour (i allant de 0 à t.longueur-1 pas 1) faire si (t[i] mod 2 = 0) alors nb <- nb+1; finsi finpour redim resultat[nb]; nb <- 0; pour (i allant de 0 à t.longueur-1 pas 1) faire si (t[i] mod 2 = 0) alors resultat[nb] <- t[i]; nb <- nb+1; finsi finpour retourne resultat; fin 39

Tableau vide (2/2) En algorithmique, on s'autorise à créer des tableaux vides de toutes les manières imaginables. On peut tester si un tableau est vide en testant sa longueur. entier[] titi; // titi est vide redim titi[0]; // titi est toujours vide entier[0] tutu; // tutu est vide entier[] tata <- {}; // tata est vide entier[] toto <- {3,5,75,231}; entier[] t <- pairs(toto); si(t.longueur = 0) alors... En Java, un tableau qui n'a pas été dimensionné sera égal à null. int[] titi; // le compilateur indiquera une erreur d'initialisation int[] tete = new int[0]; // tete est vide int[0] tutu; // interdit en Java, les tableaux sont forcément dynamiques int[] tata <- {}; // tata est vide int[] toto <- {3,5,75,231}; int[] t <- pairs(toto); if(t!= null && t.length!= 0){... 40

Tableaux associatifs Il est possible d'indicer les tableaux par n'importe quel type énuméré ordonné, pas seulement pas des entiers de 0 à la longueur du tableau 1. Exemples : tableau d'entiers indicé par les valeurs du type ArcEnCiel en Java 34 123... 67... rouge orange violet enum ArcEnCiel {rouge, orange, jaune, vert, bleu, indigo, magenta, violet}; HashTable<ArcEnCiel,Integer> t = new HashTable<ArcEnCiel,Integer>(); t.put(arcenciel.rouge,34); t.put(arcenciel.orange,123);... t.put(arcenciel.violet,67);... t.get(arcenciel.orange); // renvoie 123 41

Enregistrement (1/2) Exemple : on veut représenter dans un programme les données décrivant 50 personnes avec pour chacune un nom, un prénom, un âge et une taille. chaîne nom1, prénom1; entier age1; réel taille1;... chaîne nom50, prénom50; entier âge50; réel taille50;... nom1 <- "Duchmol"; prenom1 <- "Robert"; age1 <- 24; taille1 <- 1.80; Un enregistrement est un type composé qui permet de regrouper des valeurs de types différents. 42

Enregistrement (2/2) Un enregistrement a un nom et un certains nombre de champs, qui sont des variables typées. L'accès à un champ se fait en préfixant l'identifiant du champ par le nom de la variable qui contient l'enregistrement. algorithme monalgorithme // déclaration d'un enregistrement enregistrement Personne chaine nom; chaine prenom; entier age; réel taille; finenregistrement... Personne p1, p2; début // Initialisation d'un enregistrement p1.nom <- "Duchmol"; p1.prenom <- "Robert"; p1.age <- 24; p1.taille <- 1.80;... fin Remarque : un enregistrement est un type, mais les valeurs du type sont aussi appelées enregistrement (comme pour les types primitifs). 43

Enregistrement en Java public class MonProgramme{ } static class Personne{ String nom; String prenom; int age; float taille; } public static void main(string arg[]){ Personne p1 = new Personne(); Personne p2 = new Personne(); p1.nom = "Duchmol"; p1.prenom = "Robert"; p1.age = 24; p1.taille = 1.80;... } Rappel : les enregistrements passés en paramètre de fonction le sont par référence (en Java et en algorithmique). 44