Chapitre 1 LES COMPOSANTS ÉLÉMENTAIRES DES ALGORITHMES 1.1. La notion d’algorithme L’algorithmique est une matière indispensable pour la formation en informatique. Elle sert à apprendre à communiquer avec l’ordinateur dans le but de réaliser des programmes. Concevoir un algorithme performant pour la resolution d’un problème donné est une étape essentielle qui doit précéder la programmation. Une fois l’algorithme est mis en øeuvre, un étape de vérification est réalisée. Cette étape sert à tester si le programme est correct, valide et robuste aux erreurs. Ensuite la traduction de cet algorithme en programme est réalisée. Cette étape est appelée implémentation. Notons bien qu’il existe plusieurs approche de programmation, nous citons : L’approche fonctionnelle le programme est exprimé par des appels de fonctions mathématiques. Un exemple de cette approche est le langage LISP. L’approche procédurale la notion de fonctions mathématiques existe toujours, le programme est composé d’une suite d’instructions. L’execution de ce programme implique un changement dans l’état de la mémoire de l’ordinateur. C’est pour cela qu’on parlera d’un automate. Le C est un exemple de ce type de langage. L’approche logique le programme est représenté ici en utilisant des formules logiques. Cette approche est adaptée à la resolution d’une classe donnée de problèmes en liaison avec l’intelligence artificielle. Prolog est un langage de programmation logique. L’approche objet le programmes est vu comme un ensemble d’objets qui se communiquent entre eux et a appartiennent à des classes hiérarchisée. C++ et Java sont des langages objet. Essayons maintenant de définir le mot algorithme, Nous citons ici quelque définition de l’algorithme : Selon Courtin et Kowarski, 1989 Un algorithme est une suite d’actions que devra effectuer un automate pour arriver,en un temps fini, à un résultat déterminé (qui sera appelé postcondition) à partir d’une situation donnée (appelé precondition. Selon Aho et Ullman, 1993 Un algorithme est une spécification précise et non ambiguë d’une séquence d’étapes pouvant être exécutées d’une façon automatique. Selon l’encyclopedia universalis, paris édition 1984 Un algorithme est la spécification d’un schéma de calcul, sous forme d’un suite d’opérations élémentaires obéissant à un enchaînement déterminé. Nous remarquons que ces définitions supposent plus une approche procedurale de programmation. 1.2. L’action écrire Cette action signifie que l’automate effectue un affichage sur un écran. PRECONDITIONS POSTCONDITIONS Affichage de 1 2 puis de 4 5 écrire(’1’,’2’) écrire(’4’,’5’) Les paramètres sont toujours séparés par des virgules. A la fin du déroulement de cette action on voit afficher sur l’écran : 1 1.4. L’ITÉRATION CHAPITRE 1. LES COMPOSANTS ÉLÉMENTAIRES DES ALGORITHMES 12 45 1.3. Les entiers 1.3.1. Les opérations Cinq opérations de base sont définies sur les entiers. Soit n et p deux entiers : l’addition représentée par n + p la soustraction représentée par n − p La multiplication représentée par n ∗ p La partie entière du quotient représentée par n div p Le reste de la division représentée par n mod p Par exemple nous pouvons écrire l’algorithme suivant : PRECONDITIONS POSTCONDITIONS tableaux des carrées de 1 à 3 écrire(’1’,1 ∗ 1) écrire(’4’,2 ∗ 2) écrire(’3’,3 ∗ 3) 1.3.2. Les variables entières Une variable entière correspond à la déclaration d’un identificateur qui comprendra un entier lors du déclenchement de l’automate. La déclaration est une étape nécessaire pour déclarer cette variable avant son utilisation dans les actions d’un algorithme. Pour déclarer une variable nous utilisons le mot VAR. Les déclarations seront toujours placées avant les actions d’un algorithme donné. Ensuite on peut affecter une valeur à une variable en utilisant l’action affectation et ceci en utilisant le mot ←. Par exemple, l’algorithme suivant affecte à z la valeur 8 : VAR x,y,z : ENTIER x←3 y←3 z ←x+y 1.4. l’itération Si nous fixons comme objectif la réalisation d’un algorithme qui affiche les carrées des nombres de 1 à 10, nous remarquons que l’algorithme devient très long. De plus, nous remarquons la répétition de la même action plusieurs fois, en changeant son contenu. Nous pouvons écrire ce même algorithme d’une façon plus condensée en utilisant la notion de l’invariant. Par exemple l’algorithme qui affiche des nombres entiers de 1 à 10 utilise la notion d’itération. Nous pouvons utiliser d’autre types d’opérations de comparaisons comme :≤, <, ≥, >, 6=, =. Maria Malek - EISTI - CPI1 2 CHAPITRE 1. LES COMPOSANTS ÉLÉMENTAIRES DES ALGORITHMES 1.5. LA NOTION DE PROCÉDURE TANTQUE CONDITIONS FAIRE ACTIONS FIN TANTQUE VAR nb : ENTIER nb ← 1 TANTQUE nb ≤ 10 FAIRE ecrire (nb, nb ∗ nb) nb ← nb + 1 FIN TANTQUE 1.5. La notion de procédure La procedure est une suite d’actions, à laquelle on donne un nom pour qu’on puisse l’appeler ultérieurement. 1.5.1. Déclaration On déclare une procédure en lui affectant un nom, et en donnant la liste des paramètres. Ensuite le corps de la procédure est composée d’une partie déclarative contenant les variables locales, et une partie actions contenant la liste des instructions. Par exemple, on peut ainsi écrire la procédure qui calcule les carrées des nombres de debut jusqu’à f in : PROCEDURE NOM (PARMETRES) VARIABLES LOCALES ACTIONS PROCEDURE CalculCarrés (debut,fin : ENTIER) VAR nb : ENTIER nb ← debut TANTQUE nb ≤ f in FAIRE ecrire (nb, nb ∗ nb) nb ← nb + 1 FIN TANTQUE 1.5.2. Appel L’appel de la procédure est une action contenant le nom de la procédure avec les listes de paramètres effectifs. De cette façon nous pouvons appeler la procedure CalculCarrés plusieurs fois avec différents paramètres. 1.5.3. Paramètres d’entrées et de sortie Nous avons vu que nous pouvons passer des paramètres en entrée dans l’appel de la procédure. Autrement dit, Ces paramètres doivent être associés à une valeur au moment de l’appel de la procédure. De même nous pouvons spécifier dans Maria Malek - EISTI - CPI1 3 1.8. LES CARACTÈRES CHAPITRE 1. LES COMPOSANTS ÉLÉMENTAIRES DES ALGORITHMES CalculCarrés(1,10) {Affiche les carrées entre 1 et 10 } CalculCarrés(20,25) {Affiche les carrées entre 20 et 25 } la partie PARAMÈTRES d’une procédure des paramètres de sortie, autrement dit des paramètres dont la valeur sera calculée après l’execution de la procédure. Pour faire la différence entre les paramètres d’entrée et de sortie d’une procédure nous utilisons les deux lettres E et S avant l’identification des paramètre. Par exemple si on veut stocker le carré d’un nombre donné, nous devons déclarer une variable de sortie dans la partie PARAMÈTRES de la procédure. PROCEDURE CalculCarré( E nb : ENTIER, S res : ENTIER) VAR nb : ENTIER res ← nb ∗ nb Au moment de l’appel nous pouvons récupérer la valeur calculée pour l’afficher : VAR X : entier CalculCarré(3,X) ecrire(X) 1.6. La notion de fonction La fonction peut être vue comme une procédure qui prend une valeur qui sera la valeur de sortie. La valeur que prend une fonction correspond à une valeur de sortie. Par exemple, nous pouvons écrire une fonction pour le calcul du carré. FONCTION carré(nb : ENTIER) : ENTIER RETOURNER nb ∗ nb Une nouvelle version de la procédure CalculCarré peut être écrite en utilisant des appels de successifs de la fonction carré. 1.7. L’action conditionnelle L’action conditionnelle permet d’effectuer une suite d’actions selon la valeur booléene de certaines conditions. Deux syntaxes sont possibles : La première utilise le mot clé SI et la deuxième utilise les deux mots clés SI et SINON. Nous pouvons écrire par exemple une fonction max qui retourne la valeur maximale de deux entiers. A noter que l’action RETOURNER permet d’arrêter l’execution de la fonction par l’automate. 1.8. Les caractères On dit qu’une variable est de type car si elle prend comme valeur un caractère qui peut être une lettre, une ponctuation, un chiffre ou un espace. Nous pouvons appliquer aux caractères les opérations de comparaisons sachant qu’il existe un ordre prédéfini sur les caractères : < ponctuations <0 00 < .. <0 90 <0 A0 < .. <0 Z 0 <0 a0 < .. <0 z 0 . De même on dira qu’une variable est de types Chaîne de caractères si elle prend une valeur qui correspond à une suite de caractères. L’ordre défini sur les chaînes de caractères est le même ordre utilisé dans le dictionnaire (exemple ’Maria’<’Marie’). Maria Malek - EISTI - CPI1 4 CHAPITRE 1. LES COMPOSANTS ÉLÉMENTAIRES DES ALGORITHMES 1.10. LA NOTION D’INVARIANT PROCEDURE CalculCarrés (debut,fin : ENTIER) VAR nb : ENTIER nb ← debut TANTQUE nb ≤ f in FAIRE ecrire (nb, carré(nb)) nb ← nb + 1 FIN TANTQUE SI CONDITIONS ALORS ACTIONS FIN SI SI CONDITIONS ALORS ACTIONS1 SINON ACTIONS2 FIN SI FONCTION max(a,b : ENTIER) : ENTIER SI a ≤ b ALORS RETOURNER(b) SINON RETOURNER(a) FIN SI 1.9. Les booléens Une variable de type booléen est une variable qui ne peut prendre que deux valeurs qui sont vrai ou faux. Les opérations possibles sont : le et logique, le ou logique et la négation. Par exemple la fonction premier teste si un nombre est premier et retourne vrai ou faux. 1.10. La notion d’invariant L’invariant d’une boucle est une assertion (exprimé par une phrase logique) qui est vraie chaque fois que nous atteignons un endroit particulier dans la boucle. Par exemple, soit l’algorithme qui affiche les p premiers nombres premiers. Remarquons que l’assertion : i nombres premiers sont écrits est vraie tout le temps et on peut le montrer par récurrence. Maria Malek - EISTI - CPI1 5 1.12. LES PARAMÈTRES CHAPITRE 1. LES COMPOSANTS ÉLÉMENTAIRES DES ALGORITHMES FONCTION premier (n : ENTIER) : booléen VAR i : ENTIER ; prem : booléen i←2 prem ← vrai TANTQUE i < n et prem FAIRE SI nmodi = 0 ALORS prem ← f aux SINON i←i+1 FIN SI FIN TANTQUE RETOURNER prem PROCEDURE tabprem( E p : ENTIER) VAR i,nb : ENTIER i←0 nb ← 1 TANTQUE i < p FAIRE { Assertion : i nombres premiers sont écrits} SI premier(nb) ALORS ecrire(nb) i←i+1 FIN SI nb ← nb + 1 FIN TANTQUE 1.11. Construction d’un algorithme itératif Pour construire un algorithme récursif, nous essayons au départ d’effectuer un raisonnement par récurrence qui permet dans un premier temps de trouver l’itération et l’invariant. Ensuite, l’algorithme est construit et contient deux parties : la partie initialisation et l’action itérative. Exemple appliquer cette méthodologie sur la fonction puissance(n,p). 1.12. Les paramètres Nous avons présenté deux types de paramètre : paramètre d’entrée et paramètre de sortie. Nous présentons dans ce chapitre un troisième type de paramètres : ce sont les paramètres modifiables qu’on désignera par la suite par ES. Par exemple nous codons la procédure qui permute deux entiers en utilisant ce type de paramètre. Maria Malek - EISTI - CPI1 6 CHAPITRE 1. LES COMPOSANTS ÉLÉMENTAIRES DES ALGORITHMES FONCTION puissance(n,p : ENTIER) : ENTIER VAR r,i : ENTIER i←1 r←n TANTQUE i < p FAIRE r ←r∗n i←i+1 FIN TANTQUE RETOURNER r PROCEDURE permut( ES a,b : ENTIER) VAR c : ENTIER c←a a←b b←c Maria Malek - EISTI - CPI1 7 1.12. LES PARAMÈTRES