Obligement - L'Amiga au maximum

Mardi 16 avril 2024 - 14:26  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

Actualité (récente)
Actualité (archive)
Comparatifs
Dossiers
Entrevues
Matériel (tests)
Matériel (bidouilles)
Points de vue
En pratique
Programmation
Reportages
Quizz
Tests de jeux
Tests de logiciels
Tests de compilations
Trucs et astuces
Articles divers

Articles in english


Réseaux sociaux

Suivez-nous sur X




Liste des jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z,
ALL


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Galeries

Menu des galeries

BD d'Amiga Spécial
Caricatures Dudai
Caricatures Jet d'ail
Diagrammes de Jay Miner
Images insolites
Fin de jeux (de A à E)
Fin de Jeux (de F à O)
Fin de jeux (de P à Z)
Galerie de Mike Dafunk
Logos d'Obligement
Pubs pour matériels
Systèmes d'exploitation
Trombinoscope Alchimie 7
Vidéos


Téléchargement

Documents
Jeux
Logiciels
Magazines
Divers


Liens

Associations
Jeux
Logiciels
Matériel
Magazines et médias
Pages personnelles
Réparateurs
Revendeurs
Scène démo
Sites de téléchargement
Divers


Partenaires

Annuaire Amiga

Amedia Computer

Relec


A Propos

A propos d'Obligement

A Propos


Contact

David Brunet

Courriel

 


Programmation : AmigaBasic - programmation structuré : apprendre à utiliser les boucles IF... THEN... ELSE... ENDIF
(Article écrit par Christian Sager et extrait d'A-News (Amiga News) - juillet 1990)


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 :
  • Désigner : en fait nommer et poser le problème.
  • Typer : c'est connaître les propriétés.
  • Affaiblir : réduire la complexité.
  • Renforcer : ajouter des contraintes.
  • Sérialiser : sous-problèmes de décomposition.
  • Et aussi répartir, identifier, paramétrer, représenter.
Cette recherche de méthode se nomme aussi "algorithme" (admirez et avouez que mon introduction à cette partie n'était pas tirée par les cheveux !). Ce n'est rien d'autre que de trouver la ou les solutions qui permettent à l'ordinateur de résoudre le problème posé, le plus clairement et en peu de temps.

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 :

AmigaBasic

Mais on peut encore l'exprimer différemment en posant :

AmigaBasic

Si delta >= 0, les deux racines sont :

AmigaBasic

Si delta=0, racine double :

AmigaBasic

De même, nous pouvons calculer x4, x5. Ces deux dernières racines sont dans le cas où delta < 0. Je me contenterais de faire mon calcul dans R sans me plonger dans les complexes (ces précisions sont pour les mordus de maths. Le problème le plus délicat, c'est de transposer ce genre de formule en quelque chose de linéaire. Du point de vue solution algorithmique, nous avons les deux formules. Pour x1 = (-b I SQR (b x b - 4 x a x c))/(2 x A), la transposition serait :

AmigaBasic
Graph 1 : exemple structuré

Pour la plupart des variations, notre algorithme fonctionne mais voilà, il faut aussi traiter des cas particuliers. L'algorithme n'est pas utilisable si le premier coefficient est nul, nous aurons la forme de bx + c = 0 donc x - c/b. Notre algorithme n'est toujours pas utilisable dans le cas d'une racine négative. Si vous ne tenez pas compte des cas particuliers, vous pouvez être sûr que le premier utilisateur donnera ce cas à résoudre et provoquera un arrêt du programme si ce n'est un "Guru". Aucun programme réellement travaillé et pensé n'aura de difficulté de ce type. Il y en aura d'autres... mais ne soyons pas pessimistes !

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).

AmigaBasic
Graph 2 : programme structuré

Quand vous regardez le listing 1, vous comprendrez que je n'aime pas les GOTO, c'est une fonction qui devrait disparaître du langage BASIC. Je ne sais plus vraiment ce qui fait quoi et pour modifier quoi que ce soit c'est la galère. Je vous avoue pourtant avoir exagéré dans un but pédagogique. De toute façon, dans une programmation structurée le GOTO n'est pas nécessaire (en programmation Pascal, il n'y a qu'une tolérance c'est pour revenir au début du programme). Ce concept (structuré) permet de développer des parties de programmes, de les tester, les optimiser. Si d'aventure vous voulez modifier une partie, vous ne le faites que sur cette partie. C'est la programmation par module. Cet avantage dans la programmation est réduit à néant avec l'utilisation des GOTO qui permet de sauter d'un module à l'autre. Les blocs seront tellement imbriqués quand pour une petite amélioration vous serez obligé de tout réécrire.

AmigaBasic
Listing 1

En gros

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.

AmigaBasic
Listing 2, le structuré

Notre problème se pose ainsi "en gros" :
  • 1. Donner les valeurs de a, b, c.
  • 2. Résoudre l'égalité linéaire.
  • 3. Résoudre l'égalité.
Les actions 2 et 3 s'excluent mutuellement car on ne peut calculer que l'une ou l'autre solution. C'est par le test de la valeur de la variable "a" que l'on sait quelle égalité est à résoudre. Je vais vous faire une représentation graphique qui est bien plus parlante que plusieurs paragraphes de texte.

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).

AmigaBasic
Tableau 1 : tableau pour programmation structurée avec explication et exemple BASIC

Si nous transformons cette représentation en programme, ce dernier se terminerait ici. Pour essayer une autre égalité, il faut redémarrer. Pas intéressant comme programme, non ? Je vais donc faire en sorte que l'on puisse répéter sans "start" et se laisser le choix d'arrêter quand bon nous semble. Pour se faire, on peut décider que si l'on donne a toutes les variables concernées la valeur "A" le programme s'arrête. Vous pouvez remarquer la forme de la structure dans le tableau 1. Au début de la boucle, nous indiquons la condition qui permet d'exécuter la boucle ou de la répéter. Pour mon exemple, on utilise le graph 1 comme structure et la condition de répétition se pose sous la forme de "a, b, c différent de 0".

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.

AmigaBasic
Graph 3 : solution de l'égalité linéaire

Il ne nous reste plus que deux solutions : "d" est nul ou supérieur à "0". Ces deux cas sont traités séparément. Essayez de bien suivre cette partie qui va vous permettre de manipuler les graphs. Je vois que je n'ai plus de place dans le graph 4. Je suis donc obligé d'insérer un autre graph pour poursuivre la programmation.

AmigaBasic
Graph 4 : solution égalité du second degré

AmigaBasic
Graph 5 : structure de la partie 5

Enfin, après avoir développé les différents blocs, nous allons les insérer dans la structure principale (graph 2). L'avantage de la programmation structurée et de la représentation graphique, c'est l'aperçu d'ensemble que l'on a et la possibilité de reprendre un bloc individuellement et l'encastrer dans un autre programme. Mais n'oubliez pas une règle importante : ne jamais faire de graph plus grand qu'une feuille de papier normale et si vous voulez agrandir, notez (voir graph 4) à l'intérieur le prochain module à insérer.

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é.

AmigaBasic
Listing 3

L'alternative ?

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.

AmigaBasic
Graph 7 : bloc modifier avec modification

Dans une optique de phase-test, j'ai introduit deux entrées de données. Si le programme fonctionne sans problèmes, alors il ne vous reste plus qu'à supprimer cette partie de test et à rassembler le tout pour avoir votre solution (listing 4). Afin de pouvoir facilement reconnaître les emboîtements dans le programme, je positionne les informations d'un bloc de structure dans la même colonne.

AmigaBasic
Listing 4

Je viens de vous donner le principal de la technique de la programmation structurée. J'aurais aimé vous l'exposer plus amplement mais manque de place et peut-être d'intérêt pour vous.

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 :

begin :
   (corps de la boucle)
IF (Cond.) GOTO begin

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 :

AmigaBasic
AmigaBasic

Plus intéressant que "IF (traitement erreur) GOTO Label", l'AmigaBasic vous offre "ON ERROR GOTO" qui fait le saut vers le traitement de l'erreur. Vous verrez cela par la suite. Voyez aussi le résultat en BASIC de toutes les explications précédentes. Vous voulez la solution écrite du graph 6 ? Serais-je assez sympa pour la programmer en notation BASIC ? Je vous l'écris dans un autre langage et vous le retraduisez en AmigaBasic ? Hmm... j'allais oublier que nous ne sommes qu'à l'initiation (poussée !). Je vais donc vous proposez les listings pour accompagner les différents graphs.

AmigaBasic
Graph 6 : structure complète du programme

AmigaBasic
Listing 5

Pour conclure

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.


[Retour en haut] / [Retour aux articles] [Article précédent] / [Article suivant]