top of page

3. Premiers programmes

 

Notion de programme

 

Grâce aux instructions vues précédemment, nous pouvons déjà décrire des algorithmes complexes mais nous ne savons pas encore "programmer". On parle de "programme" dès lors qu'on dispose d'une description d'un traitement informatique qui est mémorisée et qui peut être invoquée à volonté.

Définition de fonctions : instruction define

A cette fin, la Programmatrice permet de définir des fonctions. Cela peut être réalisé de différentes façons mais la plus simple consiste à utiliser la nouvelle instruction define.

DefinitionFonction.png

Supposons, par exemple, que l'on veuille définir une fonction pour afficher les N premiers nombres impairs. On pourra pour cela définir une fonction nommée afficheImpairs par la commande :

  • define afficheImpairs

S'ouvrira alors une petite fenêtre permettant de saisir les deux parties de la définition d'une fonction : son entête et son corps.

Dans l'entête, on indique entre parenthèses les paramètres de la fonction. Ici, un nombre N de type int (entier).

Dans le corps, on saisit les instructions définissant le traitement à effectuer par la fonction.

Une fois la nouvelle fonction définie (comme dans la figure), on l'invoque en fournissant une valeur pour le paramètre :

  • afficheImpairs 4

Résultat de fonction

Le terme "fonction" utilisé signifie que les éléments de programmes définis sous ce vocable rendent un résultat, une valeur. Dans l'exemple que nous venons prendre, il s'agit d'un résultat particulier : le terme ok. Mais ce n'en est pas moins une valeur. D'ailleurs, entrez la valeur ok dans la fenêtre de commande et voyez que la Programmatrice comprend ce mot et rend le résultat... auquel on peut s'attendre.

Nous donnons parfois le nom de procédures à ces fonctions dont le résultat est ok. Il est possible de spécifier qu'il s'agit d'une telle fonction en terminant l'entête par un ";". Par exemple : afficheImpairs (N:int);

Mais les fonctions peuvent rendre un résultat d'un autre type : entier, chaîne de caractère etc. Dans ce cas, on le spécifie en indiquant ce type en fin d'entête, après ':'. Par exemple, on peut définir de la façon suivante une fonction qui rend le double d'un entier donné :

double.png

Saisie d'une donnée par l'utilisateur

L'instruction read permet au programme de demander une donnée à l'utilisateur. Dans le programme hello ci-contre, une question est posée à l'utilisateur pour qu'il donne son nom.

Remarque : la fonction hello ne prend pas de paramètre. Et on l'appelle sans fournir d'argument.

 

  • définissez et invoquer le petit programme hello pour voir concrètement comment se déroule son exécution.

hello.png

Fonction function !

En fait, l'instruction define définit une variable de type Function. On constate facilement en listant les éléments contenus dans le répertoire courant :

  • ls /v

Pour ne pas alourdir la liste affichée, la mention [FUNC] est écrite à la place de la définition particulière de la fonction. Il est néanmoins possible de donner une écriture textuelle de définition de fonction grâce à la fonction function dont la syntaxe complète est :

function <entête> begin <corps> end. Grâce à cette fonction, on aurait pu définir, par exemple, la fonction double ci-dessus, par la commande suivante :

  • add double : Function =
    function double (a:int):int
    begin
       2*a
    end

 

Ou plus concisément... sans oublier le ";" à la fin :

  • function double (a:int):int
    begin
       2*a
    end;

Pourquoi ne faut-il pas oublier le ";" ? C'est un peu "subtil" mais la raison est celle-ci : la fonction function donne en réalité un résultat de type Function donc, normalement (sans le ";"), on devrait voir s'afficher la mention [FUNC] qui remplace la valeur. Mais le ";", qui est l'opérateur des séquences, requiert une valeur ok à gauche comme on l'a vu, on tente donc d'effectuer une conversion de Function à ok, or la Programmatrice implémente une telle règle de conversion et celle-ci a justement pour "effet de bord" d'effectuer le add tel qu'il est écrit au-dessus avec comme nom de variable celui donné comme mot-clé dans l'entête.

Si vous trouvez cette explication un peu "obscure", ce n'est pas grave, mais retenez de ne pas oublier le ";".

Tant qu'on en est à expliquer les points un peu compliqués, en voici un autre. Vous avez peut-être remarqué que le nom de la fonction apparaît deux fois : comme nom de la variable Function et dans l'entête de la définition. Est-ce que cela ne fait pas doublon ?

En réalité, les deux ne désignent pas la même chose et peuvent être nommés différemment : l'un est un nom de variable (comme on l'a vu) et l'autre est un élément de la forme syntaxique définie et indique comment s'écrit l'appel à la fonction dans une expression.

Nous verrons un peu tard comment définir des formes syntaxiques un peu plus élaborées.

Un petit jeu pour terminer

Avec ce que vous savez maintenant, nous vous proposons en guise de travaux pratiques de développer un petit programme intitulé le "jeu du nombre mystérieux".

L'ordinateur choisira aléatoirement un nombre entre 1 et 1000 ; puis l'utilisateur essaiera de le trouver en faisant des propositions. A chaque fois, l'ordinateur indiquera si le nombre proposé est trop grand, trop petit ou de la bonne valeur. Et lorsque le joueur aura trouvé, le programme s'arrêtera.

Pour cela, vous pourrez utiliser la fonction prédéfinie Math.random qui rend un nombre entier choisi aléatoirement entre 0 et N-1 si N est fourni en argument.

Et encore un détail utile : l'opérateur servant à tester l'égalité de 2 valeurs est noté '==' (pour le distinguer du '=' de l'affectation).

A vous donc maintenant d'écrire ce programme !

Quand vous aurez terminé, vous pourrez regarder quelle solution se cache ci-contre en survolant le rectangle gris.

Puis, pour aller plus loin, ajoutez le comptage du nombre d'essais du joueur et affichez-le à la fin.

function nbMysterieux;
begin
  write "Trouvez un nombre compris entre 1 et 1000";
  var n = Math.random(1000) + 1;
  var p : int;
  repeat
     read "Donnez un nombre :", p;
     if p<n then
        write p ++ " est trop petit !"
     elif p>n then
        write p ++ " est trop grand !"
     fi
  until p == n;
  write p ++ " : Vous avez gagné !"
end;

Conseils

Pour les formes syntaxiques qui s'écrivent sur plusieurs lignes (comme repeat ... until ou encore if ... then ... elif ... fi, ci-dessus), il est conseillé d'utiliser une règle d'indentation systématique : mots-clés alignés verticalement, et parties entre les mots-clés décalées de 3 espaces. D'autre part, lorsque vous écrivez un programme, il est bon de prendre l'habitude d'écrire d'abord verticalement tous les mots-clés de la forme puis de revenir remplir les parties entre mots-clés.

Ce genre de pratique est précieux pour éviter les erreurs de syntaxe.

Et notez enfin que, sur la ligne de commande, pour nous faciliter la vie, on peut utiliser la complétion c'est-à-dire taper seulement le début d'un nom ou d'un mot-clé, puis la touche Tab qui affiche automatiquement la suite du mot. Par exemple, pour lancer le jeu du nombre mystérieux, il suffit de taper "nb" puis Tab.

Si plusieurs mots commencent par les lettres saisies, il suffit de taper Tab plusieurs fois, jusqu'à obtenir le mot voulu.

bottom of page