gilles.hunault@univ-angers.frgalg - Gestion d'ALGorithmes
Présentation de Galg
2. Utilisation en mode analyse, exécution et traduction
3.1 Bonjour
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éeavec 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éeavec l'option le script galg-valide, pour valider que l'algorithme correspond à une solution correcte et exhaustiveGalg traduit actuellement en :
c c++ dbase java pascal perl php python r rexx tclD'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.
Retour en haut du document 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.alggalg 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 rexxLe 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 0Ce 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 0Terminons 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 -xeffectue 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 -lLa liste des fonctions traduites en interne par galg s'obtient avec l'option -f. Par exemple :
galg -f tcldonne 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.
Retour en haut du document 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 -eliste 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 103.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)Retour en haut du document Retour à la page principale de Galg