gilles.hunault@univ-angers.fr

   galg - Gestion d'ALGorithmes


Présentation de Galg

     1. Ce que fait Galg

     2. Utilisation en mode analyse, exécution et traduction

     3. Exemples d'algorithmes

           3.1 Bonjour

           3.2 Table de multiplication

           3.3 Occurences du maximum dans un tableau

    


1. Ce que fait Galg

La version en ligne de commandes du langage galg gère des fichiers textes correspondant à des algorithmes.

On peut l'utiliser de quatre façons différentes :

avec l'option -a,
pour analyser et vérifier un algorithme écrit dans la syntaxe déposée
avec l'option -o,
pour traduire un algorithme vérifié dans un langage de programmation comme C, Rexx, Perl, Java... ; il est alors possible d'exécuter dans la foulée le programme avec passage de paramètres via la sous-option -x,
avec l'option -t,
pour transformer, aménager des fichiers textes avec une syntaxe assez libre, voire souple en des algorithmes avec une syntaxe déposée 
avec l'option le script galg-valide,
pour valider que l'algorithme correspond à une solution correcte et exhaustive

Galg traduit actuellement en :

     c c++ dbase java pascal perl php python r rexx tcl

D'autres options sont possibles :

-l   donne la liste des langages implémentés
-e   fournit la liste des erreurs standards détectées

De plus :

galg permet de post-modifier la traduction d'un algorithme en programme, c'est à dire de remplacer une expression grace à une table de correspondance liée au fichier algorithme,

galg peut inclure des sous-programmes déjà validés après la traduction, ou insérer en ligne des instructions particulières si le langage le requiert.

 


return1  Retour en haut du document     return2  Retour à la page principale de Galg

 

2. Syntaxe, utilisation en mode analyse, traduction et exécution

 

Prenons un premier exemple, celui ultra-classique d'un bonjour simplifié. Voici le texte de l'algorithme, contenu dans le fichier bjr.alg


     # auteur : gH
     # un bonjour minimal

     écrire  " Bonjour. "

Pour le faire analyser par galg, il suffit de taper en ligne de commande :


     galg -a bjr.alg

galg produit alors le listing nommé bjr.lst qui numérote les lignes et les instructions :


 Fichier bjr.lst issu de galg -a bjr.alg
 =======================================

  ERR  LIG  |  INS
       001  |         # auteur : gH
       002  |         # un bonjour minimal
       003  |
       004  |  001    écrire  " Bonjour. "

Si on prend un exemple un peu plus conséquent, avec une demande de prénom, l'affichage de la date et de l'heure, la conversion du prénom en majuscules, l'algorithme est à peine modifié, puisqu'il s'écrit, disons dans le fichier bonjour.alg soient les lignes


     # auteur : gH
     # un bonjour amélioré
     écrire  " Bonjour "
     écrire  " Quel est ton prénom ? "
     lire    pren
     écrire  " A ", heure()," le ", date()," au revoir " , maju(pren)

La traduction en Rexx est assurée par la commande


     galg -a bonjour.alg -o rexx

Le fichier produit est bonjour.rex dont le contenu est


     /* # auteur : gH */
     /* # un bonjour amélioré */
     say " Bonjour "
     say " Quel est ton prénom ? "
     pull pren
     say " A "heure()" le "date()" au revoir "maju(pren)
     exit 0

Ce fichier produit n'est pas directement utilisable à cause des fonctions utilisées :

heure() n'existe pas en Rexx ;
la fonction correspondante se nomme time(),
date() existe en Rexx mais donne la date en anglais ;
il faudrait mettre date("E") pour un affichage européanisé,
maju() n'existe pas en Rexx ;
la fonction correspondante pour les caractères non accentués se nomme translate(),

Pour indiquer ces correspondances à galg il suffit de mettre dans le meme répertoire que le fichier bonjour.alg le fichier bonjour.tdc qui contient donc


     maju(           translate(
     heure(          time(
     date()          date("E")

galg détecte automatiquement cette table de correspondance et vient alors effectuer les remplacements terme à terme, après avoir traduit en Rexx, soit le fichier correct :


     /* # auteur : gH */
     /* # un bonjour amélioré */
     say " Bonjour "
     say " Quel est ton prénom ? "
     pull pren
     say " A "time()" le "date("E")" au revoir "translate(pren)
     exit 0

Terminons par une véritable traduction en Rexx de la fonction maju qui prend en compte les caractères accentués. Admettons que le fichier maju.rex contient le texte du sous-programme correspondant. Il suffit alors de ne garder dans la table de correspondance que les deux lignes


     heure(          time(
     date()          date("E")

et de rajouter la ligne


     #> maju.rex

à la fin de l'algorithme pour que galg incorpore automatiquement ce fichier au bout de la traduction, faisant ainsi de bonjour.rex un fichier complet et qui correspond à ce que l'on veut.

Si Rexx est installé et s'appelle par la commande regina, alors la ligne de commande


     galg -a bonjour.alg -o rexx -x

effectue l'analyse de l'algorithme, le traduit et exécute le fichier produit. Signalons au passage qu'il est possible de passer des paramètres après le paramètre -x et que la liste des langages avec la commande associée s'obtient par


     galg -l

La liste des fonctions traduites en interne par galg s'obtient avec l'option -f. Par exemple :


     galg -f  tcl

donne la liste des fonctions reconnues pour le langage tcl.

A noter : le script galg-execute automatise la phase d'analyse, de traduction (en R) et d'exécution avec de nombreuses fonctions prédéfinies. Ce script est utilisé dans l'interface Web de G-ALG.

 

return1  Retour en haut du document     return2  Retour à la page principale de Galg

 

 

3. Exemples d'algorithmes

 

galg utilise une syntaxe concise, lisible, non ambigue mais stricte. L'option -t décrite dans le Manuel de l'Utilisateur permet de s'affranchir de certaines contraintes en laissant galg réaménager le texte.

La syntaxe, ses règles et sa justification sont données dans le Manuel d'Algorithmiques Raisonnées.

En deux mots : chaque instruction commence par un mot clé, chaque structure a un début et une fin unique, on ne dépasse pas une complexité de 3 pour les emboitements de structures et d'expression. La commande


     galg -e

liste les erreurs principales qui sont détectées. On trouve aussi dans le manuel de l'utlisateur des exemples de fichier avec erreur et leur correction afin d'aider à l'apprentissage de la syntaxe.

Pour tester Galg et la traduction dans les langages, nous avons mis au point une dizaine d'algorithmes de référence. Au fil des années, plus de 200 algorithmes sont aujourd'hui disponibles, qui utilisent Galg et sont directement traduisibles et donc exécutables.

Mais bien sur Galg peut traduire n'importe quel algorithme... les légères adaptations à apporter concernent seulement l'aménagement de l'algorithme en vue de la traduction, surtout si le langage est typé.

3.1 Exemple : bonjour

Cet algorithme dit "Bonjour" puis demande un prénom, affiche la date et l'heure puis le prénom converti en majuscules. Il utilise trois fonctions standards nommées date, heure et maju. Voir la section 1. pour apprendre à les remplacer par une instruction équivalente ou par tout un sous-programme si on veut traduire dans un langage.

L'algorithme est


     # auteur : gH
     # un bonjour amélioré
     écrire  " Bonjour "
     écrire  " Quel est ton prénom ? "
     lire    pren
     écrire  " A ", heure()," le ", date()," au revoir " , maju(pren)

3.2 Exemple : table de multiplication

Cet algorithme vient demander un nombre positif compris entre 1 et 100 puis affiche de façon bien cadrée (unité sous unité, dizaine sous dizaine etc.) la table de multiplication de ce nombre.

Voici l'algorithme :


   # auteur : gh

   # demande initiale

   écrire  " Donner un entier compris entre 1 et 100 "
   lire nbChoisi

   # relance éventuelle

   tant_que (non entier(nbChoisi) et (nbChoisi<1) et (nbChoisi>100))
       écrire " nombre incorrect. donner un nombre ENTIER ENTRE 1 ET 100 "
       lire nbChoisi
   fin_tant_que # nombre invalide

   # boucle d'affichage

   pour indb de1a 10
       affecter produit <-- nbChoisi*indb
       écrire format(indb,2,0) , " fois " , nbChoisi , " = " , format(produit,5,0)
   fin_pour # indb de1a 10

3.3 Exemple : occurences du maximum dans un tableau

Cet algorithme initialise un tableau d'entiers avec la fonction initTab puis calcule en une seule boucle combien de fois le plus grand élément du tableau apparait.

L'algorithme est :


     # auteur : gh

     # initialisation du tableau avec 15 éléments
     # entiers entre 10 et 100

     affecter nbElt <-- 15
     appeler init_Tab( monT , nbElt , 10 , 100 )

     # détermination du max et comptage du nb d'occurences
     # du max en une seule boucle

     # initialisation de la valeur du maximum (valMax)
     # et de son nombre d'occurences (nbMax)

     affecter valMax  <-- monT[ nbElt ]
     affecter nbMax   <-- 1

     # on parcourt alors le tableau
     # sans utiliser le dernier élément déja comptabilisé

     pour indb de1a nbElt-1
          affecter eltCourant <-- monT[ indb ]
          si eltCourant > valMax
             alors # nouveau maximum local
                   affecter valMax  <-- eltCourant
                   affecter nbMax   <-- 1
             sinon
                   si eltCourant = valMax
                      alors # une fois de plus le maximum
                            affecter nbMax <-- nbMax + 1
                   fin_si # nouvelle occurence du maximum
          fin_si # nouveau maximum
     fin_pour # indb de1a 10

     # affichage de fin

     écrire " Le maximum dans le tableau est : " , valMax
     écrire " et il apparait " , nbMax , " fois."
     écrire " Pour vérification, voici les éléments du tableau : "

     appeler affiche_Tab( monT , 1 , nbElt , 4)

Le listing commenté par galg en est :


 Fichier maxocc.lst issu de galg -a  maxocc.alg
 ===============================================
   06/07/2001 22:40.53

  ERR  LIG  |  INS PRO CER
       001  |              # auteur : gh
       002  |
       003  |              # initialisation du tableau avec 15 éléments
       004  |              # entiers entre 10 et 100
       005  |
       006  |  001         affecter nbElt <-- 15
       007  |  002         appeler init_Tab( monT , nbElt , 10 , 100 )
       008  |
       009  |              # détermination du max et comptage du nb d'occurences
       010  |              # du max en une seule boucle
       011  |
       012  |              # initialisation de la valeur du maximum (valMax)
       013  |              # et de son nombre d'occurences (nbMax)
       014  |
       015  |  003         affecter valMax  <-- monT[ nbElt ]
       016  |  004         affecter nbMax   <-- 1
       017  |
       018  |              # on parcourt alors le tableau
       019  |              # sans utiliser le dernier élément déja comptabilisé
       020  |
       021  |  005 001     pour indb de1a nbElt-1
       022  |  005 001          affecter eltCourant <-- monT[ indb ]
       023  |  005 002          si eltCourant > valMax
       024  |  005 002             alors # nouveau maximum local
       025  |  005 002                   affecter valMax  <-- eltCourant
       026  |  005 002                   affecter nbMax   <-- 1
       027  |  005 002             sinon
       028  |  005 003                   si eltCourant = valMax
       029  |  005 003                      alors # une fois de plus le maximum
       030  |  005 003                            affecter nbMax <-- nbMax + 1
       031  |  005 003                   fin_si # nouvelle occurence du maximum
       032  |  005 002          fin_si # nouveau maximum
       033  |  005 001     fin_pour # indb de1a 10
       034  |
       035  |              # affichage de fin
       036  |
       037  |  006         écrire " Le maximum dans le tableau est : " , valMax
       038  |  007         écrire " et il apparait " , nbMax , " fois."
       039  |  008         écrire " Pour vérification, voici les éléments du tableau : "
       040  |
       041  |  009         appeler affiche_Tab( monT , 1 , nbElt , 4)

 

return1  Retour en haut du document     return2  Retour à la page principale de Galg