Algorithmique et Programmation A). Introduction : Quand on utilise une carte à microprocesseur ou un microcontrôleur, il faut fournir au processeur, les instructions à exécuter pour réaliser la fonction désirée. Pour cela, on doit lui fournir un programme exécutable. Programme executable Pour créer ce programme exécutable, il faut analyser de manière rigoureuse les tâches à faire exécuter au microprocesseur et en déduire les actions à effectuer, pour les traduire en programme. B). Etude et traduction : Après l’étude des tâches à réaliser, il faut traduire et décomposer le travail à effectuer en sous tâches à l’aide I ). I) Présentation : Il est impossible d'écrire un programme correct du premier coup, depuis la première ligne jusqu'à la dernière. Un programme est l'aboutissement d'un travail méthodique résumé par le schéma suivant : Algorithmique et programmation 1 JFA07 PROBLEME DEFINITION 1 ANALYSE 2 CORRECTIONS 4 TRADUCTION 3 TESTS 5 1°). Première étape : Définition du problème : Il faut être capable de définir très précisément tout ce que l'on attend du programme. Pour cela il faut connaître quelles sont les informations nécessaires à la résolution du problème : qui va les fournir et sous quelle forme, est-on sûr de la validité de ces données ou faut-il les contrôler pour s'assurer quelles sont conformes à ce que l'on avait prévu ? Il faut également réfléchir à la présentation des résultat. Exemple : Ecrire un programme qui permet d’entrer 10 nombres. 2°). Seconde étape : Analyse structurée et pseudo code ou algorigramme : Une fois les données déterminées et les résultats explicités, il ne reste plus qu'à trouver la méthode qui permet d'obtenir les résultats à partir des données. Si la solution n'est pas évidente du premier coup d'oeil, il est nécessaire : - de le découper en sous-problèmes, - et de le structurer. Lorsqu'un problème est trop complexe, il faut le découper en plusieurs tâches distinctes, auxquelles on attribue un nom significatif, de manière que le problème paraisse résolu avec la résolution des sousproblèmes. Puis on traite chaque tâche suivant le même processus, en la subdivisant en sous-tâches jusqu'à ce que celles-ci deviennent évidentes à résoudre. La structuration consiste à organiser les sous-tâches obtenues par la méthode de découpage, de manière que leur agencement réponde effectivement au problème posé. Une fois cet agencement trouvé, il reste à le traduire en pseudo code. Exemple : Comptage de 10 nombres saisis au clavier : Algorithmique et programmation 2 JFA07 En Pseudo Code : Variables : COMPTEUR : entier NOMBRE : réel Début COMPTEUR = 0 Tantque (COMPTEUR < 10) faire Saisir NOMBRE (on saisit le nombre) COMPTEUR = COMPTEUR + 1 (on incrémente la variable) Fintantque Fin En organigramme : 3°). Troisième étape : traduction : Une fois la décision prise du langage utilisé, si l'analyse et la structuration et la traduction en pseudo code (ou en algorigramme) ont été faite correctement, la traduction ou le codage est simple à réaliser. Exemple : en langage C : Main () Int COMPTEUR ; Float NOMBRE ; { COMPTEUR = 0 ; While (COMPTEUR < 10) do { Getch (NOMBRE) ; COMPTEUR = COMPTEUR + 1 ; } Algorithmique et programmation 3 JFA07 } 4°). Quatrième étape : Tests : Il reste maintenant à passer la dernière étape, qui est en faite l'aboutissement de tout notre travail, à savoir si notre programme remplit bien les tâches prévues. 5°). Cinquième étape : Corrections : Cette étape est normalement inutile si l'analyse et la structuration ont été faites correctement. Mais l'erreur est humaine ! 6°). Sixième étape : Documentation : Cette étape est souvent négligée à tort car elle permet une meilleure utilisation du programme, et surtout une maintenance aisée. Il faut penser à l'utilisateur qui ne connaît pas forcément bien l'informatique. Vous vous êtes sûrement déjà retrouvé devant un programme avec sa documentation et ne pas savoir par où commencer. II ). DEFINITION DU PROBLEME : 1°). Définition des variables d'entrées et de sorties : On devra établir la liste des variables d'entrée et de sortie dont le programme a besoin. On pourra se poser les questions suivantes : - Sous quelle forme se présentent ces entrées ou ces sorties (bit, octet, caractère, texte, ...) - Quelle est la nature de ces entrées ou de ces sorties. (temporaires, constantes, variables) Il faudra leur choisir un nom évocateur de ce qu'elles représentent et ne pas hésiter à mettre un commentaire en face de leur déclaration. Exemple : compteur boucle, nom, voyelle, ... et non toto, tata, titi ... 2°). Contraintes supplémentaires : Avant de s'attaquer à la résolution du problème, il faut encore répondre à quelques questions : - Quelle est la procédure de base qui transforme les entrées en sorties ? - Y a-t-il des contraintes de temps ? - Y a-t-il des contraintes mémoires ? - Y a-t-il des cas particuliers à traiter ? - Quelle est la précision des résultats à fournir ? - Comment le programme doit-il traiter les erreurs d'exécution, de débordement, d'entrées, de sorties ? Toutes ces questions sont à se poser avant d'écrire la moindre ligne de programme. Algorithmique et programmation 4 JFA07 III ). CONCEPTION DU PROGRAMME : 1°). Principes de bases de la conception d'un programme : Une fois le problème résolu et découpé, il faut le traduire en algorithme. Et c’est la version traduite de l’algorithme qui sera notre programme. Ce programme dit source sera aussi traduit ensuite en un programme exécutable par l'ordinateur. Un algorithme doit être clair et lisible, pour cela un peu de soin dans sa présentation est nécessaire. Aucun flou artistique n'est tolérable. L'analyse/programmation peut donc être résumée dans le schéma suivant : ANALYSE PROCESSUS A AUTOMATISER ALGORITHME REALISATION ? PROGRAMME EXECUTABLE PROGRAMMATION COMPILATION PROGRAMME ECRIT EN LANGAGE EVOLUE L'analyse et la programmation sont à notre charge,la compilation est à la charge d'un programme traducteur, appelé compilateur. L’algorithme peut*être présenté sous deux formes : En organigramme ou, en pseudo code. 2°). Qu'est ce qu'un algorithme ? Un algorithme est une série d’actes ou d’opérations élémentaires qu’il faut exécuter en séquence pour accomplir une tâche quelconque, en suivant un enchaînement strict. Remarque : Lorsqu’il sera demandé d’élaborer un algorithme, la méthode pour atteindre cet objectif sera de rédiger en français la succession des opérations élémentaires (phases courtes et précises) puis de passer à une écriture conventionnelle appelée pseudo-code. 3°). Algorithme : Structure. 1. Un algorithme en pseudo-code ou sous forme d'organigramme, un programme en langage évolué sont toujours structurés de façon suivante: Déclarations, Constantes Algorithmique et programmation 5 JFA07 Variables Programme, début Initialisation des variables traitements fin 2. Il faut systématiquement déclarer toutes les variables, et préciser leur type (caractère, chaîne de n caractères, entier, réel, booléen ou logique, etc.) et les constantes. Toute constante dans le corps d'un algorithme doit être déclarée. Par exemple, si nous voulons saisir une suite de 10 éléments, il vaut mieux déclarer en constante N=10 puis utiliser N dans l'algorithme ou le programme. Car si nous devons changer le programme pour traiter 8 ou 14 éléments, il suffit d'écrire N=8 ou N=14. 3. L'usage des commentaires doit être systématisé. En tête de programme, il doit se trouver un commentaire disant ce que fait le programme. De même toute partie délicate du traitement doit être commentée. Il en est de même pour les variables, leur identificateur doit être explicite et un commentaire doit en préciser l'utilité dans l'algorithme ou le programme. Un commentaire peut se placer n'importe où (entre {}) dans l'algorithme. 4°). Les organigrammes : Les organigrammes ne sont en rien une méthode de conception de programme, mais plutôt un outil et un moyen d'y arriver ! a) Avantages des organigrammes : - L'intérêt fondamental réside dans sa représentation imagée. * les symboles standards sont normalisés * Ils peuvent être compris par des personnes n'ayant aucune connaissance de la programmation. * Ils peuvent servir à diviser le projet entier en sous-tâches. Ils serviront alors à évaluer les progrès accomplis. * Ils décomposent les séquences d'opérations et aident ainsi à trouver les erreurs. b) Inconvénients des organigrammes : - Ils sont difficiles à concevoir, dessiner, ou modifier dans tous les cas. - Il n'existe pas de méthode simple pour mettre au point, optimiser, ou tester un organigramme. - Ils tendent à devenir encombrants : il est difficile de décider entre l'introduction de détails utiles et le nombres de ces détails qui les rendrait à peine plus lisibles. - Ils ne montrent que l'organisation du programme, mais pas celle des données ou la structure des entrées-sorties. Algorithmique et programmation 6 JFA07 - Ils ne sont d'aucun secours pour les problèmes d'ordre matériel ou temporel. Ils ne suggèrent même pas où de tels problèmes pourraient bien surgir. - Ils n'autorisent pas une programmation structurée si l'on y prête pas attention. Les renvois, les flèches, les boucles peuvent réaliser un joli méli-mélo. c) Conclusion : Les organigrammes constituent une technique utile pour la documentation des programmes. En tant qu'outil de conception, ils ne peuvent cependant offrir qu'un moyen de commencer et d'éclaircir les idées. d) Symboles normalisés des organigrammes : Voir annexes. IV ). PROGRAMMATION : 1°). Notation algorithmique : Nous disposons de deux notations strictement équivalentes : Organigrammes, Pseudo-code. Ce sont deux représentations d'un même processus, elles sont donc identiques. Un organigramme est une description plus visuelle à l'aide de schémas; le pseudo-code est plus proche de notre langage. a) Le début et la fin d’un programme ou d’un sous programme. Cette notation permet de situer le début et la fin du programme. Dans un sous-programme on écrira le nom du sous-programme plutôt que « début ». Exemple: Pseudo Code Organigramme Début DEBUT instructions instructions instructions Fin FIN Elles sont représentées dans un rectangle avec les cotés arrondis. Il y ne doit y avoir qu’un seul début et une seule fin Traduction en langage C : Structure en C : Main() { Instructions ; Algorithmique et programmation 7 JFA07 } b) La plus simple : la structure séquentielle. Une séquence d'instructions est une suite d'instructions. Elles seront exécutées les unes derrière les autres. Cela peut être des affectations ou des opérations. Exemple: Pseudo Code Organigramme A = 10 ; A=10 B = A+5 ; B=A+5 Elles sont représentées dans un rectangle Chaque structure est une boîte. Il y a une entrée, une sortie. Traduction en langage C : Structure en C : Attention, chaque ligne se termine par un point virgule : A=10 ; B=A+5 ; c) Le bloc : Pour assembler une suite d'instructions qui représente une partie complète on peut la mettre dans un bloc. Elles seront aussi exécutées les unes derrière les autres. Exemple: Pseudo Code Organigramme A = 10 ; B = A+5 ; A=10 B=A+5 Elles sont représentées dans un rectangle Chaque structure est une boîte. Il y a une entrée, une sortie. Traduction en langage C : Structure en C : Algorithmique et programmation 8 JFA07 Un bloc commence par une accolade et se termine par une accolade ; et chaque ligne se termine par un point virgule : { A=10 ; B=A+5 ; } d) Les entrées sorties : Les entrées sorties sont considérées comme des opérations à part car elles sont représentées de manière différentes, mais c’est toujours une structure séquentielle. Par exemple pour exécuter l'opération correspondant à l'allumage d'une diode électroluminescente, ou pour aller lire un mot binaire sur le clavier de la serrure à code. Exemple: Pseudo Code Organigramme LIRE A ; ECRIRE B ; LIRE A ECRIRE B Elles sont représentées dans un losange. Traduction en langage C : Structure en C : getch(A) ; printf(B) ; e) La structure alternative. Elle sert à représenter des actions "optionnelles" ; dans certains cas, il faut exécuter une action, dans l'autre une action différente. Suivant le résultat du test on exécute une action ou une autre. Dans le cas de l'exemple ci-dessus suivant la valeur de A, B vaut 1 ou 0. Un algorithme se lisant de haut en bas, nous ne pouvons donc utiliser qu'une seule des deux branches : pas d'erreur possible. Les réponse à la condition peuvent être écrite de manière lisible (oui, non) ou le non peut-être représenté par une barre oblique ou par un petit rond sur une des sorties. Algorithmique et programmation 9 JFA07 Exemple: Pseudo Code Si A<10 Alors B=1 ; Sinon B=0 ; FinSi Organigramme oui A<10 ? B=1 non B=0 Elles sont représentées dans un losange. Traduction en langage C : Structure en C : if (A<10) { B=1 ; } else { B=0 ; } Remarque : pourquoi ce finsi? Derrière le finsi, il peut très bien y avoir d'autres actions. Il faut donc marquer la limite entre les actions optionnelles et celles qui ne le sont pas. Le finsi correspond au point de rencontre des flèches qui sortent des boites de l'organigramme. Si il n'y a qu'un seul cas, la partie sinon peut est inexistante. On peut très bien écrire : Algorithmique et programmation 10 JFA07 Exemple: Pseudo Code Si A<10 Alors B=0 ; FinSi Organigramme oui A<10 ? non B=0 Traduction en langage C : Structure en C : if (A<10) { B=0 ; } f) La structure répétitive. Cette structure nous permet de représenter des processus à caractère répétitif. La condition est évaluée puis la suite d'actions est exécutée. La suite d'actions est alors répétée tant que la condition reste vraie. Dans ce cas, il se peut que la suite d'actions ne soit pas réalisée si la condition est fausse dès le début. Exemple: Pseudo Code Organigramme Tantque A<10 Faire B=B+1 ; FinTantque A<10 ? non oui B = B+ 1 Traduction en langage C : Structure en C : While (A<10) { B=B+1 ; Algorithmique et programmation 11 JFA07 } Remarque : pourquoi ce fintantque? De même derrière le fintantque, il peut très bien y avoir d'autres actions. Il faut donc marquer la limite entre les actions optionnelles et celles qui ne le sont pas. Le fintantque correspond à la fin des instructions à répéter. g) La deuxième structure répétitive. Cette structure permet de réaliser une action ou une suite d'actions tant que la condition de branchement est réalisée. Elle est réalisée au moins une fois ! Exemple: Pseudo Code Organigramme Faire B=B+1 ; Tant que (A<10) B = B+ 1 oui A<10 ? non Traduction en langage C : Structure en C : do { B=B+1 ; } while (A<10) h) La structure Répétitive avec compteur. Nous avons vu que certains algorithmes nécessitaient un comptage d'éléments ou de situations (exemple: comptage des lettres au clavier ou comptage du nombre de fois qu'il y a deux mêmes lettres successivement), pour ce faire, on utilisera une variable entière que l'on incrémentera à chaque fois que la situation à compter se produit. Il existe une autre structure de contrôle permettant de représenter un tel algorithme, la boucle pour: pour COMPTEUR 1, <10, +1 faire | | saisir NOMBRE | finpour Une telle boucle sous-entend l'initialisation du compteur (ici COMPTEUR), l'incrémentation au fur à mesure (ici +1) et le test (COMPTEUR<10). Algorithmique et programmation 12 JFA07 Syntaxe : effectuer un traitement pour un compteur, aussi appelé indice de boucle, I variant d'une valeur initiale VI, jusqu'à une valeur finale VF, avec un pas PAS. pour I VI,VF,PAS faire | traitement finpour Si le pas est omis, on considère qu'il est égal à 1. I vaudra VI, puis VI + PAS, puis VI + 2xPAS, etc. Si le pas est positif, le processus s'exécute tant que I est inférieur à VF.Si il est négatif, le processus s'exécute tant que I est supérieur à VF. Cette structure nous permet de représenter des processus à caractère répétitif. La condition est évaluée puis la suite d'actions est exécutée. La suite d'actions est alors répétée tant que la condition reste vraie. Dans ce cas, il se peut que la suite d'actions ne soit pas réalisée si la condition est fausse dès le début. Exemple: Pseudo Code Organigramme Pour Y 50000,0, -1 Faire B=B+1 ; FinPour Traduction en langage C : Structure en C : For (Y=5000 ; Y>=0 ; Y=Y-1) { B=B+1 ; } i) Renvoi vers un autre point du programme Quand le programme est assez complexe on peut remplacer une longue ligne de connexion par des repères numérotés pour clarifier la représentation. Algorithmique et programmation 13 JFA07 j) Appel d’un sous programme. Ce bloc comporte le nom du sous-programme à exécuter. Le sous-programme est un élément indépendant du programme principal. Lorsqu'un appel de sous-programme est rencontré, l'exécution s'interrompt dans le programme en cours, elle se poursuit dans le sous-programme. Dès que dans le sous-programme on rencontre l'instruction de fin de sous-programme, l'exécution revient au programme l'ayant appelé là où il s'était interrompu. Le sous-programme est une entité où on y regroupe un ensemble de lignes qui réalisent une fonction. On devrait trouver pour chaque sous-programme : A). la définition précise de la fonction réalisée ; B). les définitions des entrées et sorties de la fonction, exactement de la même manière que pour une fonction de l'électronique câblée. Algorithmique et programmation 14 JFA07 Symbole d’organigramme Algorithmique et programmation 20 JFA07