Décomposition et paramétrage des algorithmes Cours 3 Décomposition et paramétrage des algorithmes
1 - Introduction Algorithme trop long, trop complexe décomposition en plusieurs algorithmes, chacun résolvant une partie du problème posé. (Ces algorithmes « s’appellent » entre eux) Jusqu’ici, nous avons vu 2 types d’instructions : celles qui traitent directement l’information : l’affectation ( = ) la lecture/écriture vers écran/clavier (lire, écrire) celles qui commandent le déroulement du programme : structures de contrôle (si…alors…fsi) boucles(tant que, répéter, pour …) Nous verrons dans ce chapitre un troisième type d’instruction : l’appel depuis un algorithme (l’appelant) d’un autre algorithme (l’appelé)
2 - Décomposition 1 – Appel simple Exemple : un algorithme Appelant réalise deux séries de calculs, et fait toujours précéder et suivre ces calculs par deux lignes de 60 étoiles. Pour cela, il fait appel à un algorithme étoile qui affiche ces deux lignes d ’étoiles. Algorithme étoile() // affiche 2 lignes de 60 étoiles aux i,j: entier; début pour i de 1 à 2 faire pour j de 1 à 60 faire écrire(’*’); fait; écrire("\n"); fait fin étoile Algorithme Appelant() //… début étoile(); //calculs étoile(); //calculs étoile(); fin Appelant Remarque : peu importe comment a été conçu et écrit l’algorithme étoile: Pour l’utiliser, il suffit de connaître ses spécifications (son en-tête).
on souhaite préciser à étoile la largeur de la ligne à afficher. 2 – Passage de paramètre(s) Rappel: un paramètre est une variable reçue en entrée par un algorithme. Même exemple que précédemment mais: on souhaite préciser à étoile la largeur de la ligne à afficher. On modifie donc étoile en conséquence: On ajoute à étoile un paramètre : un identificateur + son type
distinguer paramètre formel et paramètre effectif Dans Appelant, lors de l’appel de étoile, on précise dorénavant la valeur que l’on souhaite attribuer au paramètre nb. Sinon étoile ne peut pas fonctionner. Lors de l'exécution de l'appel, cette valeur est copiée dans nb. distinguer paramètre formel et paramètre effectif Un paramètre formel est une variable formelle - sans valeur - déclarée dans l'en-tête d'un algorithme. Un paramètre effectif est une variable ou une valeur qui est copiée dans le paramètre formel correspondant au moment de l'appel.
On souhaite maintenant pouvoir préciser dans étoile (qui devient lignes): le symbole à utiliser le nombre de lignes le nombre de symboles par ligne Remarques : 1. un appel contient autant de paramètres effectifs qu’il y a de paramètres formels dans l'algorithme appelé; 2. la correspondance paramètre formel/paramètre effectif est établie en fonction de leur ordre dans l’appel et dans l’en-tête ; 3. chaque paramètre effectif doit être du même type que le paramètre formel lui correspondant. 4. les paramètres formels et effectifs associés n'ont pas forcément le même nom.
3 – Pourquoi décomposer des algorithmes? A - Algorithme plus lisible, résolution facilitée Algorithme tri_sélection(tab: tab100Entiers) // Trie 100 entiers et affiche le résultat aux i, posmin : entier; début pour i de 1 à 99 faire posmin = cherchePosMin(tab, i, 100); échange(tab, i, posmin); fait affiche(tab); fin tri_sélection Fonction cherchePosMin(tab:tab100Entiers, deb, fin: entier) retourne entier {deb<=fin, deb>=1, fin<=100} //Cherche le minima d'une portion du tableau aux i, posmin: entier; posmin = deb; pour i de deb+1 à fin faire si tab[i] < tab[posmin] alors posmin = i; fsi; retourne posmin; fin chercheMin Algorithme échange(R tab:tab100Entiers, i,j :entier) //Echange deux cases d'un tableau aux t: entier; t = tab[i]; tab[i] = tab[j]; tab[j] = t; fin échange Algorithme affiche(tab:tab100Entiers) //Affiche le tableau aux i: entier; pour i de 1 à 100 faire écrire(tab[i]); fin affiche Algorithme tri_sélection(tab: tab100Entiers) // Trie 100 entiers et affiche le résultat aux i, j, posmin, temp: entier; début pour i de 1 à 99 faire posmin = i; pour j de i+1 à 100 faire si tab[j] < tab[posmin] alors posmin = j; fsi fait temp = tab[i]; tab[i] = tab[posmin]; tab[posmin] = i; pour i de 1 à 100 faire écrire(tab[i]); fin tri_sélection
(Principe objet. Ex: recherche de position du minima du tri, voiture) 3 – Pourquoi décomposer des algorithmes? A - Algorithme plus lisible, résolution facilitée B - Réutilisation dans un même programme (ex: étoile) entre différents programmes (ex: tri) C - Modification d'une sous-partie: seul le respect de l'interface importe (Principe objet. Ex: recherche de position du minima du tri, voiture)
ON MODIFIE LA SYNTAXE D'ÉCRITURE DES ALGORITHMES ! A PARTIR DE MAINTENANT, ON MODIFIE LA SYNTAXE D'ÉCRITURE DES ALGORITHMES
3 – Les différents modes de transmission des paramètres Chaque paramètre d'un algorithme sera maintenant décrit par son nom de variable, son type et son mode de transmission (R ou V). Algorithme truc(R a: entier) Ce mode de transmission indique si le paramètre effectif est : une Valeur fournie par l’algorithme appelant à l'algorithme appelé une Référence accessible et donc modifiable par les deux algorithmes concernés: l'appelé et l'appelant
LES PARAMÈTRES PASSÉS PAR VALEUR SONT DES ENTRÉES. 1 – Le passage par valeur (noté V) Comportement utilisé depuis le début de l'année Seules les valeurs des paramètres effectifs sont transmises, le paramètre formel (appelé) est une copie du paramètre effectif (appelant) Avantage: garantie que les paramètres effectifs sont intacts après l'appel (ex: moyenne) Inconvénient: impossible de récupérer un résultat! (ex: moyenne) LES PARAMÈTRES PASSÉS PAR VALEUR SONT DES ENTRÉES.
Dans ce mode, le paramètre effectif et le paramètre formel 2 – Le passage par référence (noté R) Dans ce mode, le paramètre effectif et le paramètre formel (dont les noms peuvent différer) désignent une seule et même variable modifiable par les deux algorithmes : l'appelé et l'appelant. Exemple: moyenne d'entiers avec V ou R
Autre exemple: permutation d'entiers On veut créer un algorithme qui permute deux valeurs. LES PARAMÈTRES PASSÉS PAR RÉFÉRENCE SONT : SOIT DES SORTIES (Ex: moyenne) SOIT DES ENTRÉES/SORTIES (Ex: permutation).
4 – Procédures et fonctions Du point de vue des SORTIES, quels sont les différents types d'algorithmes que nous pouvons rencontrer? On appelle fonction tout algorithme n'ayant qu'une seule sortie. Fonction des algorithmes sans sortie des algorithmes à une seule sortie des algorithmes à plusieurs sorties Pour ces algorithmes, au lieu d'écrire l'en-tête suivant : algorithme moyenne (V a, b : flottant, R m: flottant) on pourra écrire: fonction moyenne (V a, b : flottant) retourne flottant Tous les autres algorithmes sont appelés "procédures" : procédure étoile(V nblignes, nbsymb: entier, V symbole: caractère)
Des fonctions, pour quoi faire? syntaxe rapprochée des fonctions mathématiques intégration des appels dans des expressions Ex: moyenne : fonction ou procédure?
Pourquoi ne pas utiliser que des fonctions? REMARQUE 1 Pourquoi ne pas utiliser que des fonctions? Ex: algo « moyenne et somme »: multi-affectation? utilisation des structures?
REMARQUE 2 Le choix des E/S dans un algorithme a des conséquences importantes sur l'utilisation de cet algorithme. Ex: moyenne de deux entiers et affichage affichage ou saisie interdisent un usage interne de la fonction
REMARQUE 3 L'introduction du mot-clé retourne implique éventuellement l'existence de plusieurs points de sortie dans une fonction ou une procédure. Ex: …
REMARQUE 4 Il ne faut pas oublier qu'un appel de fonction ou procédure peut masquer un algorithme complexe et coûteux. Ex: factorielle au carré
5 – Application: gestion de polynômes 1 – Quelle représentation utiliser? Nous choisissons de créer un type Polynôme : c'est une structure contenant un tableau des coefficients et un degré. (Le degré du polynôme représenté est donc limité par la taille du tableau.) Ex: Quelle représentation pour f(x) = 9.5 - 8.1 x + 3.2 x2 + 4.1 x4 ? 5 – Application: gestion de polynômes
2 – Opérations à implanter Les opérations que nous voulons effectuer sur ces polynômes sont : la saisie d’un polynôme l’affichage d’un polynôme le calcul de la valeur d’un polynôme f en x : f (x) le calcul de la dérivée d’un polynôme le calcul du produit de deux polynômes f et g