|
||||||||||||||||||||||||||||||||||||||||||||
|
Deux minutes de culture Muhammed ibn Mussa al-Chwarismis, géographe et astronome, vers les années 1188 sous le règne du Calif Al-Mamun de Bagdad, a trouvé que quand il n'y a plus rien, il ne reste plus rien. Une lapalissade me direz-vous, mais vous savez aussi bien que moi qu'il faut se méfier des évidences évidentes. C'est là que l'on se plante souvent. Il faut toujours rappeler les notions fondamentales qui paraissent simples, voire simplistes, pour ne pas pêcher par orgeuil. Je disais donc que Muhammed a fait l'apprentissage du "vide". C'est à cause (!) de lui que l'on met un petit cercle afin que l'emplacement ne soit pas vide et que l'on ne puisse pas confondre la deuxième position avec la première. D'autre part et pour mémoire, je vous rappelle que c'est de l'Inde que vint le "nul", une, sinon la plus importante notion et qui se perpétue jusqu'à aujourd'hui, se répandant largement en mathématiques mais malheureusement ailleurs aussi (art ?). Non, ne craignez rien, vous êtes bien en train de lire un article sur le BASIC de l'Amiga, ce n'est pas une erreur de composition ! Vous vous demandez alors (ou plus) quel est le rapport avec le BASIC... Ce n'est que vers le début du XXIIe siècle (comme le temps passe !) que les livres de al-Chwarismis apparaissent en Espagne et sont traduit en latin, Le titre du premier livre qui s'attaquait aux égalités, continu d'exister dans le langage des mathématiques sous le nom de "algèbre". Le titre de son deuxième livre, un abécédaire de l'art de calculer, a été traduit par "Algoritmi" que le traducteur a latinisé en "algorithmus". C'est ce nom qui est resté. Pour représenter un algorithme, la méthode utilisée le plus couramment est celle de Nassi et Sheiderman. Elle se laisse traduire sans grand problème, dans tous les langages de programmation. Je vous signale qu'il existe d'autres moyens de représentation de programmation structurée. Vous avez le diagramme (souvent pour le Pascal), l'organigramme (pour le BASIC)... Je vous citerais quelques livres en fin d'article que vous pourrez découvrir partout. Les algorithmes que je présente sont donc en notation BASIC. Je viens de faire une introduction culturelle ! Arf ! Ça change du classique : "la dernière fois nous avions...". Enfin, ça y est ! C'est vraiment reparti pour la programmation en BASIC pure et dure. Discours sur la méthode Ce n'est pas un jeu des cartes... (ici il faut sourire !). Après vous avoir "bassiné" depuis bientôt... euh... longtemps déjà... enfin pendant deux chapitres, sur les diverses commandes de l'AmigaBasic, nous attaquons enfin la vraie partie de programmation (à non sens). Je viens de revoir mes premiers programmes. A les lire, c'est le cafouillis complet. Je voulais prendre un programme de l'Oric Atmos et le convertir en AmigaBasic. Comme je programmais mal en ce temps-là... Difficile de retrouver les variables, les boucles, qui fait quoi... Alors voilà, c'est décidé, vous allez faire de la programmation structurée. Oui, je sais que les programmeurs du dimanche trouvent cela inutile, mais je vous certifie que les pros ne peuvent pas s'en passer. Bon, je ne vais pas vous faire un cours comme à MIAGE ou un quelconque cours d'info, je ne suis pas assez "qualifié" pour cela, je vais essayer de vous faire accepter cette programmation structurée par des moyens simples. Que ceux qui ne se sentent pas capable, ou trop capable, tournent la page ! C'est fait ? Bien... nous voilà entre nous. Au début était la struture Vous allez pouvoir juger sur pièce avec un exemple de représentation d'un programme structuré (graph 1). Mais avant d'en arriver là, la première des questions à se poser, c'est de savoir si votre problème peut se programmer ! Est-il possible de le résoudre avec l'ordinateur ? Pour ce faire, vous devez trouver une méthode qui vous permette d'y arriver. J'ai lu (dans une de mes références citées) les étapes élémentaires de la construction des programmes (paradigmes). Je vous cite de mémoire ces principales étapes :
Non, ne souriez pas à cette notion de temps qui est très importante. Croyez-vous intéressant de trouver la solution d'un problème avec un algorithme qui nécessite des jours pour afficher un résultat ? En informatique, vous passez le plus souvent votre temps à modifier des algorithmes dans le but d'optimiser la rapidité d'exécution. Il faut savoir choisir le bon algorithme pour votre programme. Le coup classique c'est les opérations de tri. Selon votre taille de fichier, vous utiliserez le tri par insertion (méthode des joueurs de cartes), sélection (programme simple mais lent), Shell (simple et relativement rapide), heap (arbre binaire qui permet un choix rapide des éléments), quick (l'un des plus rapide et s'utilise pour de grand champs), bubble (remonte comme un ballon les éléments), shaker (demande moins de comparaisons que le bubble mais est plus compliqué). Que ceux qui n'ont dit que le rapport avec le Pascal n'est pas à taire se lèvent ! Non... pas tous... quoi ? Je viens d'en faire la démonstration ! M'enfin, quoi n'étant pas plus royaliste que le roi, je vais vous décortiquer un exemple simple de programmation structurée que j'ai vu souvent dans des livres, à savoir, le calcul de l'égalité ax2 + bx + c = 0. En règle générale, une telle égalité a deux solutions : ![]() ![]() ![]() ![]() ![]() Graph 1 : exemple structuré Avant de vous écrire un exemple de mauvais programme BASIC (listing 1) et immédiatement après le structuré (listing 2), je vais essayer de vous présenter la forme algorithmique de cette résolution d'égalité du second degré (graph 2). ![]() Graph 2 : programme structuré ![]() Listing 1 Pour vous aider, je vais vous expliquer la représentation graphique de la programmation structurée. Il existe la méthode dite "TopDownDesign". Elle pose le problème de manière grossière pour tendre vers une solution. Cette construction sera affinée au fur et à mesure jusqu'à devenir un programme qui fonctionne. C'est ainsi que je vais procéder. ![]() Listing 2, le structuré
En premier lieu, je vous propose de bien regarder mon tableau qui est un condensé des représentations graphiques des différents blocs (tableau 1). C'est avec ces quelques graphes que vous pouvez inventer, développer, construire un programme structuré. Le premier bloc qui nous intéresse c'est la condition qui se traduit en BASIC par IF. Ce que nous voulons tester c'est "a=0". Si cette condition est vraie, nous poursuivons dans la colonne du "oui". Dans l'autre cas, nous allons du côté du "non" et résolvons l'égalité (voir graph 1). ![]() Tableau 1 : tableau pour programmation structurée avec explication et exemple BASIC Afin de reconnaître le fait que le programme structuré que l'on vient d'écrire est un vrai programme, complet, et pas un extrait, on ajoute un cadre au diagramme (graph 2). Le plus gros travail est fait. Nous avons posé et dégrossit le problème. Dans le tableau que j'ai fait, vous pouvez voir la forme du bloc pour les boucles. Le premier graphique donne le principe de la boucle et où vous indiquez ce que vous voulez faire exécuter ou répéter. Dans notre exemple mathématique, on utilise justement cette forme de boucle : répète "a, b, c différent de 0". Comme cet exemple est un programme terminé, on ajoute un cadre autour comme le montre le graph 2. Maintenant, nous allons affiner notre graph en nous occupant de la résolution linéaire (graph 3) aucune difficulté particulière si ce n'est que je tiens compte par une condition du cas ou "b" est aussi égal à "0". Par contre, dans la résolution de l'égalité nous devons d'abord savoir si la racine delta (notée "d") n'est pas négative. Si c'est le cas, il faut que le programme annonce que ce n'est pas possible puisque je ne veux rester que dans les nombres réels. ![]() Graph 3 : solution de l'égalité linéaire ![]() Graph 4 : solution égalité du second degré ![]() Graph 5 : structure de la partie 5 Après avoir décortiqué ce programme, son écriture dans un langage donné, n'est plus qu'une question de routine. Vous pouvez remarquer que ça ne ressemble pas à du BASIC... Mais dans mon tableau, vous trouvez la structure du bloc avec les renseignements BASIC correspondants. En règle générale, je vous conseille de traduire chaque bloc séparément afin d'aller à la chasse aux erreurs. Les routines Reprenons le listing 1. Avec votre habitude de programmer en BASIC, vous savez maintenant que vous pouvez exécuter des répétitions avec des boucles. L'utilisation de FOR... NEXT n'est pas bonne dans mon cas car le nombre de répétitions est fixé d'office au début. Par contre, avec WHILE... WEND, l'AmigaBasic nous offre une autre possibilité de programmer une boucle. Quand vous faites tourner votre programme et qu'il rencontre une boucle comme WHILE, il teste d'abord la condition (dans mon programme : a, b, c différent de "A") et il exécute tout ce qui se trouve entre les deux mots. Arrivé au WEND, le programme retourne au début vérifier si la condition est toujours valable. Tout ceci s'exécute tant que la condition est vraie. Si ce n'est plus le cas, le programme avance à la prochaine commande après le WEND. A noter que si dès le début, la condition était fausse, la partie entre WHILE et WEND ne sera jamais exécutée donc, immédiatement déviée. La partie de programmation pour résoudre l'égalité linéaire (listing 2 et 3) est déjà plus transparente. La partie du oui/non est réalisée techniquement avec la commande IF... THEN... ELSE... ENDIF qui se retrouve aussi dans l'égalité du second degré. ![]() Listing 3 Avec le IF, si la condition est vraie, alors tout ce qui est entre THEN et ELSE sera exécuté. S'il n'y a pas de ELSE, c'est ce qui se trouve entre THEN et ENDIF qui sera pris en considération. Si la condition est fausse, les commandes après ELSE ou s'il n' y a pas de ELSE, le programme se positionne vers ENDIF. S'il n'y a pas de ELSE du tout, cela serait une perte de temps et de place parce que cette alternative doit figurer comme le THEN avec le IF. C'est pourquoi que j'utilise le bloc structuré, représenté par le graph 7. ![]() Graph 7 : bloc modifier avec modification ![]() Listing 4 Voyons maintenant la représentation des structures peu employées. Dans le tableau 1, j'ai mis deux boucles, une qui passe au-delà de la boucle sans s'exécuter et l'autre qui s'exécute au moins une fois. L'AmigaBasic n'a pas de commande pour cette dernière mais la simulation se fait par :
Cette simulation est la seule exception dans la programmation structurée qui permette l'utilisation de GOTO. Sa seule raison d'exister c'est d'indiquer la fin du programme et permet donc de recommencer le tout. Non, pas d'objection, car si vous programmez correctement en structuré, vous n'aurez nul besoin de cette commande. Même la commande IF... GOTO peut ne pas être utilisée car le IF... THEN... ELSE... ENDIF peut s'y substituer. La dernière boucle c'est celle avec sortie prématurée. Ce n'est qu'avec un GOTO que nous pouvons sortir de cette manière. Mais ce n'est à utiliser qu'avec précaution. Là où nous pouvons le mettre, c'est dans le cas de recherche d'erreur comme dans : ![]() ![]() ![]() Graph 6 : structure complète du programme ![]() Listing 5 Je remarque que j'ai passé beaucoup de temps sur cet article... je le considère comme principal et j'espère qu'il profitera aux (nombreux ?) lecteurs de l'initiation à l'AmigaBasic. Je ne peux pas vous parler d'autres formes de représentation pour la programmation facile les diagrammes en Pascal, les organigrammes en BASIC (j'avais encore une page de tableau pour les organigrammes). J'ai dépassé le niveau du langage de programmation pour théoriser un problème. Le reste n'est qu'une question d'écriture ! Bibliographie Éditeur Dunod Programmation mathématique, Théories et algorithmes Tome 2 - M. Minoux. Les bases de la programmation - J. Arsac. Raisonner pour programmer - Anna Gram. Éditeur Eyrolles Méthodes de programmation - B. Meyer, C. Baudoin. Programmation avancée - J. C. Boussard, R. Mahl. Initiation à la programmation - C. Delannoy. Graphes et algorithmes - M. Gondran, M. Minoux. Arbres, tables et algorithmes - J. Guyot, C. Vial. Algorithmes et structures de doonées - N. Wirth.
|