L'alternative simple avec Delphi Pascal - Tu dois devenir capable de Savoir

La page est créée Didier Pelletier
 
CONTINUER À LIRE
L'alternative simple avec Delphi Pascal

L'alternative simple avec Delphi Pascal
Tu dois devenir capable de
Savoir
      1. Commenter et illustrer les variantes de l'alternative.

Savoir faire
      1. Énoncer une situation d'alternative simple ou complexe dans le formalise " si... alors... sinon... " et
         selon l'arbre binaire de décision.
      2. Écrire des programmes contenant des alternatives simples, complexes ou à une branche en langage
         Pascal.

Un jeu à programmer
                                   Énoncé du problème
                                   Deux joueurs A et B cachent la main derrière le dos. Au signal du meneur
                                   de jeu, les deux joueurs tendent la main en même temps. Chacun choisit de
                                   présenter un certain nombre de doigts (de 0 à 5).
                                   Si la somme des doigts montrés est paire, A gagne; dans le cas contraire, B
                                   gagne.
                                   L'ordinateur doit être capable de décider du gagnant.
                                   Super! Voilà un jeu qui va nous faire gagner beaucoup d'argent si nous le
                                   mettons dans le commerce!
Je crains que cette remarque légèrement ironique soit fondée. En tous les cas, ce petit jeu va nous
permettre, pour la première fois, de voir l'ordinateur prendre des décisions.
Ah! On va enfin voir un ordinateur capable de réfléchir?
Malheureusement, l'ordinateur intelligent, ce n'est pas encore pour tout de suite. Nous allons encore devoir
être intelligents à sa place et lui indiquer comment prendre une décision dans des cas relativement simples.

Comment faire ?
Comme dans tout problème à résoudre avec un ordinateur, il faut se poser les trois questions classiques :
Il faut déterminer, dans l'ordre chronologique, quelles sont:
    Les données, les résultats, la méthode de travail
   La méthode de travail, les résultats, les données
   Les données, la méthode de travail, les résultats

C'est la façon de travailler qui a déjà été exposée dans une leçon antérieure. Si la réponse à la question qui
précède n'est pas évidente pour toi, il est sans doute utile de revoir cette leçon.

Analyse du problème et de sa résolution
Données
      1. le nombre de doigts montrés par le joueur A
      2. le nombre de doigts montrés par le joueur B

Résultat
Le nom du gagnant

http://info.sio2.be/delphi/4/                                                                               1/9
L'alternative simple avec Delphi Pascal

Résolution
      1. Prendre connaissance du nombre de doigts montrés par le
         joueur A.
      2. Prendre connaissance du nombre de doigts montrés par le
         joueur B.
      3. Calculer une information complémentaire: la somme des
         nombres de doigts montrés.
      4. communiquer le nom du gagnant: si la somme est paire, dire
         que le joueur A est gagnant, sinon dire que le joueur B est
         gagnant.

Comment faire faire?
S'il nous est assez facile d'exprimer la façon de résoudre ce problème par nous-mêmes, il se pose
maintenant le problème de savoir comment faire résoudre le problème par un ordinateur.
Nous reconnaissons cependant une situation déjà bien connue et étudiée dans le cadre de l'étude du
tableur : l’alternative.
L’étape 4 pourrait s’exprimer
Si < la somme est paire >
Alors déclarer que le gagnant est A
Sinon déclarer que le gagnant est B
Fin Si
Cette analyse est absolument imparable et digne d'un génie, mais ça ne nous dit rien sur la façon dont
l'ordinateur peut déterminer si un nombre est pair!
Relativement exact! Il va donc peut-être falloir ruser un peu. Et utiliser les connaissances acquises durant la
leçon précédente.

Pair ou impair ?
Comment l'ordinateur peut-il déterminer qu'un nombre est pair?

  Par définition, un nombre est pair si le reste de la division entière de ce nombre par 2 est nul.

Exemples
      •   le reste de la division de 24 par 2 est 0 (le quotient est 12, mais cela n'a pas d'importance); donc 24
          est pair.
      •   le reste de la division de 7 par 2 est 1; donc 7 n'est pas pair.
Un ordinateur peut calculer le reste d'une division entière. Pour lui faire faire cette opération, on utilise
l'opérateur mod.
      •   24 mod 2 vaut 0
      •   7 mod 2 vaut 1

Traduction
L'expression "la somme est paire" peut donc être traduite dans un langage mathématique sous la forme:
                                              (Somme mod 2) = 0
Il s'agit d'une expression logique, une expression qui peut être vraie ou fausse.

Révision
Revois les pages 2 à 6 du chapitre concernant l'alternative dans le cadre du tableur.
Comment pourrait-on traduire l'expression logique: " le nombre X est impair " ?

http://info.sio2.be/delphi/4/                                                                                   2/9
L'alternative simple avec Delphi Pascal

   (NombreX mod 3) = 0
   (NombreX mod 2) = 1
   (NombreX div 2) = 1

Résolution commentée
Présentation d'une interface possible
L’interface peut se présenter comme sur l’illustration suivante :

Les deux zones de saisie de texte portent les noms respectifs JoueurA et
JoueurB.
Le texte indiquant le vainqueur porte le nom vainqueur.
Le bouton est appelé Arbitre.
      •   Etablis une interface du même type que celle qui est illustrée ci-dessus.
      •   Par un double clic de souris sur le bouton Arbitre, ouvre le gestionnaire de l'événement Click
          associé à ce bouton.

Commentaire de la résolution
Le début du texte de la procédure associée à la pression du bouton Arbitre peut alors s’écrire comme ci-
dessous. Nous allons d'abord parcourir ce texte et le commenter avant de le frapper au clavier.
Le début présente peu de caractéristiques nouvelles.

      •   L'ordinateur prend connaissance du nombre de doigts présentés par le joueur A.
      •   Il prend connaissance du nombre de doigts présentés par le joueur B.
      •   Une variable supplémentaire (Somme) permet de recueillir le total du nombre de doigts présentés.
      •   Des commentaires ont été introduits dans le texte du programme. Ces remarques sont placées
          entre des accolades et ne sont pas prises en compte par le compilateur. Elles ne sont utiles -et
          parfois indispensables- que pour le lecteur humain du programme.
      •   Tu peux maintenant frapper le début du texte de la procédure, tel qu'il est décrit ci-dessus.
La traduction de la structure alternative telle qu'elle a été décrite à la page précédente est très simple, en
langage d'algorithme.

Si < la somme est paire >                           Si (Somme mod 2) = 0
Alors le gagnant est A                              Alors le gagnant est A
Sinon le gagnant est B                              Sinon le gagnant est B
Fin Si                                              Fin Si

La traduction en pseudo-langage Pascal est alors immédiate.
if (Somme mod 2) = 0
then le gagnant est A
else le gagnant est B ;
La fin de la procédure en langage Pascal s'écrira alors:

http://info.sio2.be/delphi/4/                                                                                    3/9
L'alternative simple avec Delphi Pascal

      •   la structure if xxx then xxx else xxx ne constitue qu’une seule entité. Il n’y a donc pas lieu d’y
          introduire des séparateurs d’instructions « ; ».
      •   Le séparateur « ; » qui clôture la dernière ligne (else vainqueur.Caption := 'Le joueur B gagne' ;) est
          même superflu puisque aucune instruction supplémentaire ne suit.
      •   Tu peux maintenant terminer la rédaction du texte de la procédure selon le modèle complet présenté
          ci-dessous.

      •   Compile et exécute le programme en mode Pas à pas.
      •   Ajoute un point de suivi sur la variable Somme.

L'alternative avec instruction composée
Une amélioration du programme
Pour améliorer la proclamation des résultats, on propose que :
      •   le nom du gagnant soit indiqué, mais, en plus, que
      •   la zone de texte correspondant à son jeu soit mise en évidence en
          rouge.
Il y a donc, cette fois, deux actions à réaliser dans le cadre de l'alternative.
Si (Somme mod 2) = 0
Alors
     1. Déclarer que le gagnant est A
     2. Mettre en rouge la zone du joueur A
Sinon
     1. Déclarer que le gagnant est B
     2. Mettre en rouge la zone du joueur B
Fin Si
Chacun des cas est alors traité par une instruction composée.
Une instruction composée est une instruction formée de plusieurs instructions simples.
En langage Pascal, une instruction composée est délimitée par deux marqueurs begin et end.
if < expression logique >
then
begin
< instruction a >;
< instruction b >;
...
end {pas de séparateur}
else
begin
< instruction 1 >;
< instruction 2 >;
...

http://info.sio2.be/delphi/4/                                                                                  4/9
L'alternative simple avec Delphi Pascal

end;
Le nombre d’instructions dans une instruction composée n’est pas limité.
Le séparateur « ; » est utilisé entre chacune des instructions simples qui composent les instructions
composées. Par contre, il ne peut se trouver dans le corps de la structure if…then…else…
On peut donc maintenant compléter le programme au niveau de l'alternative.

Compile et exécute le programme dans cette nouvelle variante. Appelle le professeur en cas de problème.
Quand tu as terminé, soumets-lui ton travail.
Vous appelez ça une solution, vous ? Moi, je constate vraiment un gros problème dès que je joue deux fois.
Eh bien, disons qu'il ne doit pas être trop difficile de trouver une solution à ce problème.
En langage Pascal, une instruction composée est toujours formée de:
  Une instruction simple
  Deux instructions simples
  Un nombre indéterminé d'instructions simples
En langage Pascal, une instruction composée est délimitée par
  Une paire d'accolades {xxx}
  Une paire de crochets [xxx]
  Les mots "begin" et "end"
En langage Pascal, une instruction simple est séparée de l'instruction simple suivante par
  Les mots " begin " et " end "
  Le signe " ; "
  Une accolade fermante " } "
Un commentaire, dans un programme écrit en langage Pascal est délimité par
  Une paire d'accolades {xxx}
  Une paire de chevrons 
  Les mots " begin " et " end "

L'alternative à une branche
Exemples
L'alternative classique présente deux branches:
" Lucky Luke est prisonnier des indiens qui l’ont attaché au poteau de torture pour le scalper. La cavalerie
arrivera-t-elle à temps ? "
Si la cavalerie arrive
Alors Lucky Luke est sauvé
Sinon Lucky Luke est scalpé
Fin Si
Dans certains cas, il n'est pas nécessaire d'envisager le sinon de l'alternative.
        "Il ne faut pas allumer de feu près d’une réserve de dynamite de peur de provoquer une
        explosion."

http://info.sio2.be/delphi/4/                                                                                  5/9
L'alternative simple avec Delphi Pascal

Si on allume du feu près de la dynamite
Alors on risque une explosion
Sinon ???
Fin Si
On optera alors pour une version " allégée " de la phrase alternative, dans laquelle on n'envisage qu'une
seule branche.
Si on allume du feu près de la dynamite
Alors on risque une explosion
Fin Si

Une application simple
On demande d'écrire un programme qui transforme un nombre fourni par l'utilisateur dans une zone de
saisie en sa valeur absolue.
La résolution est simple:
      •   si le nombre X fourni est négatif, on renvoie -X
      •   si le nombre X fourni est positif, on laisse la valeur telle qu'elle.
Si le nombre X fourni est négatif
Alors changer la valeur de X en (-X)
Sinon ne rien faire
Fin Si
Dans ce cas précis, il ne faut strictement rien changer à la valeur du nombre donné s'il est positif.
Le modèle de l'alternative complète peut donc être simplifié.
Si le nombre X fourni est négatif
Alors changer la valeur de X en (-X)
Fin Si
Au cas où aucune instruction n’est donnée quand l’expression logique n’est pas vérifiée, l’alternative ne
contient qu’une seule branche. On omet alors simplement la partie « else ».
if X < 0
then changer la valeur de X en (-X) ;
      •   Établis une fiche contenant une zone de saisie et un bouton. Lorsque le bouton est cliqué, la valeur
          numérique écrite dans la zone de saisie est transformée en sa valeur absolue.

Exercice résolu
Dans certains cas, il n'est pas possible d'exprimer aisément la situation d'alternative
parce que les conditions ne sont pas simples. Si l'on se trouve dans une telle
situation, alors il faut utiliser une méthode pour construire l'alternative. Nous
utiliserons la méthode par construction d'un arbre binaire de décision.

Problème
Écrire un programme qui détermine si une année dont on donne le millésime est
bissextile (ce problème est traité ailleurs, dans ce cours, dans le cadre de l'étude de
l'alternative dans le tableur).
Une année est bissextile si son millésime est multiple de 4; cependant, les années
dont le millésime est multiple de 100 ne sont bissextiles que si c'est aussi un multiple
de 400 (1900 n'était pas bissextile, 2000 l'a été).
Il faut bien mettre en évidence toutes les conditions particulières à envisager lors de la résolution du
problème. Il faut évaluer si:
      •   le millésime est un multiple de 4;
      •   le millésime est un multiple de 100;

http://info.sio2.be/delphi/4/                                                                               6/9
L'alternative simple avec Delphi Pascal

      •   le millésime est un multiple de 400.

Construction d'un arbre binaire de décision
Examine attentivement l'arborescence ci-dessous durant la lecture de l'explication de sa construction.
Choisissons une de ces conditions particulières et
voyons ce qu'il convient de faire si elle est vraie et
si elle est fausse. Nous commencerons par la
condition « multiple de 4 ».
Si la condition est fausse, l'année n'est pas
bissextile et c'est fini, sinon, il faut encore travailler.
Quelle question faut-il se poser si le millésime est
multiple de 4? Il faut voir si c'est un multiple de 100.
Si la condition est fausse, alors l'année est
bissextile et c'est fini, sinon, il faut encore travailler.
Si la condition est vraie, alors l'année est bissextile,
sinon, elle n'est pas bissextile. Dans tous les cas, le
travail est terminé.
La structure de décision se présente sous la forme
d’un arbre inversé, c’est-à-dire dont la racine serait en haut et les branches en bas.
Dans le formalisme Si...Alors...Sinon..., ce tableau pourrait s’exprimer:
Si 
Alors
Si 
Alors
Si 
Alors " Bissextile "
Sinon " Non Bissextile "
Fin Si
Sinon
" Non bissextile "
Fin Si
Sinon
" Non bissextile "
Fin Si
     • Vérifie, à l'aide de l'abre binaire de décision ou de la structure si...alors...sinon, que les années 1930,
         2003 et 2100 ne sont pas bissextiles.
     • Vérifie ensuite que 1980, 1800 et 2400 sont des années bissextiles.

Résolution commentée
L'interface du programme Delphi correspondant peut s'imaginer sur le modèle ci-dessous.
      •   La zone de texte contenant l'année à tester s'appelle Annee
      •   Le texte " Oui " ou " Non " qui s'indique en fonction du caractère
          bissextile ou non de l'année s'appelle reponse.
Si l'on suit l'exemple de formalisme " si ... alors ... sinon... " présenté ci-dessus,
on peut alors écrire le texte Pascal correspondant selon la forme présentée ci-
dessous.

http://info.sio2.be/delphi/4/                                                                                 7/9
L'alternative simple avec Delphi Pascal

Dans la structure alternative complexe, un seul séparateur d'instruction ";" doit être introduit : tout à fait à la
fin.
      •   Recopie, compile et exécute l'exemple.
      •   Vérifie qu'il fonctionne correctement dans tous les cas possibles.
Serait-il possible de reconstruire complètement l'arbre binaire ou la structure " si... alors... sinon..." , pour
l'exemple de l'année bissextile, en commençant par le test " le millésime est un multiple de 400 "?
On commencerait donc par :
Si 
Alors
    .......
      •   Reconstitue l'ensemble de la structure puis modifie le programme Delphi afin qu'il corresponde à
          cette nouvelle analyse.
      •   Compile, exécute et vérifie le bon fonctionnement du programme.

Exercices
Pour chacun de ces exercices, l’écriture de l’arbre binaire de décision ou de la phrase alternative est
indispensable.
1. L'ordinateur prend connaissance de deux nombres a et b frappés au clavier; il indique ensuite lequel de
ces deux nombres est le plus grand. Il faut traiter le cas d'égalité.
2. Déterminer la racine carrée d'un nombre X donné. Indiquer si cela n'est pas possible. Utiliser la fonction
"racine" ("sqrt" pour "square root", en Pascal).
3. Déterminer le plus grand et le plus petit de trois nombres qui sont livrés à l'ordinateur.
4. On demande d'écrire un programme qui soit capable de calculer la somme, la différence, le produit et le
quotient de deux nombres fournis au clavier par l'utilisateur.
L'énoncé de ce problème paraît extrêmement simple; il existe cependant une petite difficulté liée au fait qu'il
est possible que l'utilisateur fournisse un second nombre = 0. Le calcul du quotient pose alors un problème:
il n'est pas possible de diviser un nombre par 0 ! Le programme doit refuser de réaliser l'opération et inviter
l'utilisateur à être plus attentif.
5. Écrire un programme qui demande à l'utilisateur de réaliser une addition. Si le résultat fourni est correct, le
programme félicite l'élève; sinon, il lui signale son erreur en des termes très polis (une variante consisterait à
faire envoyer une bordée d'injures du type de celles du capitaine Haddock en cas d'erreur).
Astuce : il existe une fonction random() qui renvoie une valeur au hasard comprise dans des bornes que l'on
peut spécifier.
Ex: random (10) renvoie une valeur entière au hasard comprise entre 0 et 9.
On peut donc faire "imaginer" de nouvelles opérations au programme à chaque exécution. Voir aussi la
procédure Randomize dans l’aide en ligne de Delphi.
6. Écrire un programme d'utilité contestable, mais qui permet de remplacer une pièce de monnaie par un
ordinateur dans le jeu de pile ou face. L'ordinateur doit donc simuler le lancer d'une pièce et annoncer " pile "
ou " face ".
Exécuter un grand nombre de fois le programme pour s'assurer que le nombre de "piles" est bien équivalent
au nombre de " faces ".
7. Rendre le jeux des doigts envisagés dans l’introduction de ce chapitre plus intéressant : un des deux

http://info.sio2.be/delphi/4/                                                                                       8/9
L'alternative simple avec Delphi Pascal

joueurs est l’ordinateur. Celui-ci choisit, au hasard, un certain nombre de doigts en utilisant la fonction
random( ). Le reste du jeu est identique.
8. Le prix d'entrée à un spectacle est de 4,30€ par personne; toutefois les groupes peuvent avoir droit à une
réduction. Si le nombre d'étudiants constituant le groupe est supérieur au nombre de personnes non
étudiantes, le prix par personne, étudiante ou non, est de 2,50€. Ecrire le programme qui calcule le prix
d'entrée à ce spectacle.
9. Reprendre tous les exercices envisagés dans le cadre de l’étude de l’alternative avec un tableur.

http://info.sio2.be/delphi/4/                                                                                 9/9
Vous pouvez aussi lire