COMPLEMENTS ALGORITHMIQUES I. Les tableaux A. Tableau à une dimension 1) définition Un tableau est une structure de données regroupant une suite de variables de même type. Par définition, un tableau a une dimension, a une taille définie une fois pour toute, contient des éléments de même type. Pour déclarer un tableau, il est nécessaire d'indiquer sa dimension, sa taille et le type de ses éléments. Syntaxe en notation BNF <tableau de dimension 1> ::= <identificateur> : Tableau(1..<taille>) de <type> Soit N un entier positif, déclaré en tant que constante, on peut déclarer un tableau de la manière suivante : TAB1 : tableau (1..N) de entier Ici, le tableau a pour identificateur TAB dimension 1 taille N éléments de type entier On atteint un élément du tableau par son indice i i appartient à [1,N] Par exemple TAB1(3) Comme toute variable, un tableau se déclare en début d'algorithme. JOUR Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche 1 2 3 4 5 6 7 Ce tableau se déclare de la manière suivante, JOUR : tableau (1..7) de chaîne JOUR(1) = ′Lundi′ JOUR(4) = ′Jeudi′ JOUR(8) = indéterminé Un programme ne doit jamais être amené à dépasser les limites d’un tableau. 2) exercice Ecrire un algorithme permettant de créer puis de remplir un tableau à une dimension avec des entiers donnés par l'utilisateur. Une fois ce tableau rempli, il sera édité à l'écran. 1er algorithme en utilisant TANTQUE 2e algorithme en utilisant POUR Programme Premier_tableau CONST n=10 VAR i : entier tab : tableau(1..n) de entier DEBUT AFFICHER 'Premier tableau' POUR i←1 à n FAIRE AFFICHER 'Entrez la valeur n° ',i SAISIR tab(i) FPOUR AFFICHER 'Contenu du tableau : ' POUR i←1 à n FAIRE AFFICHER tab(i),' ' FPOUR FIN Programme Premier_tableau CONST n=10 VAR i : entier tab : tableau(1..n) de entier DEBUT AFFICHER 'Premier tableau' i←1 TANTQUE i<=n FAIRE AFFICHER 'Entrez la valeur n° ',i SAISIR tab(i) i←i+1 FINFAIRE AFFICHER 'Contenu du tableau : ' i←1 TANTQUE i<=n FAIRE AFFICHER tab(i),' ' i←i+1 FINFAIRE FIN B. Tableaux à deux dimensions 1) définition *** 2) exercice *** II. Algorithmes de traitement de tableaux A. Recherche du minimum et du maximum dans un tableau à 1 dimension 1) recherche du maximum *** 2) recherche du minimum et du maximum *** B. Recherche d'un élément dans un tableau 1) cas d'un tableau non ordonné *** 2) cas d'un tableau ordonné *** C. Etablissement d'une table de multiplication *** III. Notions de sous-programmes Cette notion intervient lorsque l'on affaire à des traitements qui se reproduisent souvent et qu'il serait intéressant de : - pouvoir écrire une fois pour toute pouvoir appeler comme s'il constituait une nouvelle instruction Ex : saisie et affichage d'un tableau A. Procédures 1) définition Une procédure est un sous-programme écrit à l'intérieur ou éventuellement à l'extérieur d'un programme principal, assurant de manière autonome un traitement particulier. Ce traitement peut alors être répété dans le programme principal par simple appel de la procédure. Remarque : la notion de procédure comporte 2 aspects qu'il est très important de distinguer : - la définition de la procédure appelée déclaration de procédure, qui est placée en tête de l'algorithme principal après la déclaration des variables, et qui décrit le traitement effectué par la procédure. - l'utilisation de la procédure appelée appel de la procédure, qui se situe dans le bloc de l'algorithme complet. 2) syntaxe En notation BNF <procédure> ::= <entête de procédure><bloc> <entête de procédure> ::= procédure<identificateur><liste des paramètres> <liste des paramètres> ::= | (<identificateur>{,<identificateur>}*:<type>{;<identificateur>{,<identificateur>}*:<type>}*) Ex : procédure AA procédure AA (x:entier) procédure AA (x,y,z:entier) procédure AA (x,y,z:entier; a:booléen; b,c,d,e:réel) Le bloc contient toutes les rubriques d’un algorithme complet : - déclaration de variables, qui seront alors des variables locales à la procédure - éventuellement la déclaration de procédures qui seront utilisées dans le corps de celle-ci - une suite d’instructions entourée par les mots début et fin. Remarque : la déclaration des procédures est dans la partie déclarative de l’algorithme et leurs appels apparaissent dans le corps de l’algorithme comme une instruction quelconque. 3) exemples . Exemples simples programme B procédure Bonj début afficher 'Bonjour' fin !programme principal début Bonj fin programme B' var mot1, mot2 : chaîne procédure Bonj1 (X:chaîne) début afficher X fin début afficher 'Entrez un mot' saisir mot1 Bonj1(mot1) afficher 'Entrez un 2ème mot' saisir mot2 Bonj1(mot2) fin Bonjour Entrez un mot Bonjour Bonjour Entrez un 2ème mot Au revoir Au revoir . On reprend l’algorithme de recherche du maximum dans un tableau non ordonné, en créant 2 procédures : - une procédure litvecteur pour remplir le tableau - une procédure recherchemax qui recherche puis affiche le maximum et l’indice de sa première occurrence. De plus, le programme principal demandera à l’utilisateur la taille du tableau sur lequel il désire travailler, cette info sera transmise aux deux procédures. L’utilisateur pourra relancer le programme autant de fois qu’il le désire. *** Algo Maxbis *** 4) paramètres formels et paramètres effectifs Les exemples montrent que les noms des objets utilisés dans la déclaration ne sont pas les mêmes que ceux utilisés dans l’appel. En effet une procédure peut être utilisée dans plusieurs algorithmes. Il faut donc dissocier les noms d’objet de la déclaration et les noms d’objet de l’appel. Les paramètres utilisés lors de la déclaration de la procédure sont appelés paramètres formels, ils indiquent le type des qui seront qui seront transmis et permettent de réserver la plage mémoire nécessaire pour les stocker. Les paramètres effectifs sont les noms des objets utilisés par l’algorithme, ils sont transmis à la procédure au moment où elle est appelée. Les paramètres effectifs doivent avoir exactement le même type et la même signification que les paramètres formels, utilisés dans l’entête de la procédure. Par contre, ils n’ont pas nécessairement le même nom. Par exemple, dans le programme Maxbis, les paramètres taillevect et taillevecteur sont des paramètres formels des procédures litvecteur et recherchemax. L’appel à ces procédures se fait par les instructions litvecteur(L) et recherchemax(L). L est appelé paramètre effectif. Le mécanisme d’appel et d’exécution d’une procédure est le suivant : - - le programme appelant va transmettre à la procédure les arguments effectifs cette procédure va donc effectuer ses calculs sur ces arguments, et au moment de son exécution (c'est-à-dire après la transmission des paramètres) tout va se passer comme si les instructions de la procédure appelée s’étaient insérées dans le programme appelant à la place de l’instruction d’appel. Quand l’exécution de l’instruction d’appel est terminée, le programme appelant passe à l’exécution de l’instruction qui suit l’instruction d’appel. Ex : Lors de l’appel de litvecteur(L) on a L = paramètre effectif et taillevect = paramètre formel. - Les paramètres effectifs sont transmis à la procédure, c'est-à-dire que la variable taillevect va prendre la valeur de la variable L (ou que l’adresse de la variable taillevect va être la même que la variable L) - La procédure sera exécutée, comme si le mot début de l’algorithme de la procédure litvecteur était suivi de l’instruction taillevect prend la valeur de L. - A la fin de l’exécution de la procédure litvecteur, c’est l’instruction recherchemax(L) qui sera exécutée. Les paramètres ont deux rôles : - Transmettre la procédure, au moment de l’appel, les valeurs nécessaires à son exécution - Au moment du retour, transmettre au programme appelant le ou les résultats du traitement effectué. Il y a plusieurs mécanismes de passage des arguments et des programmes appelés. 5) passage des paramètres La façon dont la valeur des paramètres sont transmises est très importante et doit absolument être pris en compte pour éviter les effets inattendus. Tout tourne autour de la question suivante : les arguments sont ils modifiés par l’exécution de cette procédure ? Si oui, quelles valeurs auront-ils à la fin de cette exécution dans le programme appelant ? On distingue deux types de transmission de paramètres : - le passage de paramètres par valeur - le passage de paramètres par adresse (ou par variable) a) passage par valeur Dans ce mode de transmission, c’est la valeur des arguments qui est transmise au sous-programme appelé. Il y a recopie des valeurs initiales des paramètres effectifs dans une zone locale du sous-programme. programme PARAM var A : entier procédure plus1(X : entier) début X←X+1 Afficher X fin !Programme principal début A←0 afficher A plus1(A) afficher A fin Avant l’appel de plus1, on a la situation suivante : - L’objet A contient la valeur 0 - L’objet A est représenté en mémoire centrale par un mot mémoire dont le contenu est 0 Au moment de l’appel, il y a recopie du contenu du mot associé à A dans un objet X de la zone réservé à la zone plus1, autrement dit la valeur de A est recopiée dans X. Au cours de l’exécution de plus1, le traitement portera sur l’objet local X associé à la procédure, il n’affectera pas du tout le contenu de l’objet A. Juste avant le retour au programme principal, on aura : Ainsi les variables du programme principal ne sont pas affectées par les trait… Avec ce mode ce mode de transmission de paramètres par valeur, l’exécution du programme PARAM donne : b) passage par adresse Dans ce mode de transmission, on associe aux variables utilisées dans le sous-programme l’adresse des variables correspondantes du programme principal. Dans la liste des paramètres de l’entête de la procédure, les variables transmises par adresse ou variable seront précédées par VAR. 6)… *** B. Fonctions 1) passage des paramètres C’est un sous-programme semblable à la procédure, mais une fonction calcule une valeur d’un type donné et renvoie cette valeur au programme appelant à travers le nom donné à la fonction. 2) syntaxe *** C. Applications : Manipulation d’un tableau ordonné à une dimension *** polycopié *** IV. A. Généralités ***