26
8 3989 TG PA 01 111 Travaux pratiques 3 Les structures conditionnelles Comme d'habitude, ce TP suit le plan de la séquence de cours correspondante. Consigne 1 : créez un nouveau projet pour ce TP de la séquence 3 (moi, par exemple, j'ap- pelle TP3 ce nouveau projet, ce qui fait que Windev l'appelle EXPRESS_TP3). Partie 1 La structure conditionnelle : Si…Alors…Sinon…FinSi 1. Présentation de la structure En Windev, il existe deux syntaxes pour écrire un SiAlorsSinonFinSi. Pour afficher la fenêtre d'aide relative à la structure SiAlorsSinonFinSi, placez vous dans n'importe quelle partie de code de la fenêtre, tapez si, sélectionnez le si que vous venez de taper, et appuyez sur la touche F1 de votre clavier. Première syntaxe possible : SI condition ALORS // instructions [SINON instructions ] FIN Dans cette syntaxe, vous pouvez remarquer que : le ALORS est sur la même ligne que le SINON, et que les instructions sont écrites après cette ligne ; le SINON est optionnel, il est tout seul sur une ligne et les éventuelles instructions qui le concernent sont écrites à partir de la ligne en dessous. Deuxième syntaxe possible : SI condition ALORS instruction SINON instruction Ici, on peut remarquer que : cette forme est à utiliser si on a une seule instruction dans le ALORS, et une seule instruction dans le SINON ; le SINON n'est pas optionnel ; il n'y a pas le mot réservé FIN pour annoncer la fin de la structure ; les instructions suivant le ALORS et le SINON sont sur la même ligne. 83989TGPA0107-seq03TP.indd 111 6/09/07 11:00:41

Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

  • Upload
    hakhanh

  • View
    257

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01111

Travaux pratiques 3

Les structures conditionnelles

Comme d'habitude, ce TP suit le plan de la séquence de cours correspondante.

Consigne 1 : créez un nouveau projet pour ce TP de la séquence 3 (moi, par exemple, j'ap-pelle TP3 ce nouveau projet, ce qui fait que Windev l'appelle EXPRESS_TP3).

Partie 1

La structure conditionnelle : Si…Alors…Sinon…FinSi

1. Présentation de la structure

En Windev, il existe deux syntaxes pour écrire un Si…Alors…Sinon…FinSi.

Pour afficher la fenêtre d'aide relative à la structure Si…Alors…Sinon…FinSi, placez vous dans n'importe quelle partie de code de la fenêtre, tapez si, sélectionnez le si que vous venez de taper, et appuyez sur la touche F1 de votre clavier.

Première syntaxe possible :

SI condition ALORS

// instructions

[SINON

instructions ]

FIN

Dans cette syntaxe, vous pouvez remarquer que :

• le ALORS est sur la même ligne que le SINON, et que les instructions sont écrites après cette ligne ;

• le SINON est optionnel, il est tout seul sur une ligne et les éventuelles instructions qui le concernent sont écrites à partir de la ligne en dessous.

Deuxième syntaxe possible :

SI condition ALORS instruction SINON instruction

Ici, on peut remarquer que :

• cette forme est à utiliser si on a une seule instruction dans le ALORS, et une seule instruction dans le SINON ;

• le SINON n'est pas optionnel ;

• il n'y a pas le mot réservé FIN pour annoncer la fin de la structure ;

• les instructions suivant le ALORS et le SINON sont sur la même ligne.

83989TGPA0107-seq03TP.indd 111 6/09/07 11:00:41

Page 2: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01112

Travaux pratiques 3

En tous cas, j'ai eu beau chercher dans l'aide de Windev, je n'ai pas trouvé un seul exemple utilisant la seconde syntaxe qui à mon avis enlève beaucoup de clarté au code, d'une part car il n'y a pas le mot FIN et d'autre part car le SINON est sur la même ligne que les instructions du ALORS.

Ce que je vous propose donc, c'est de n'utiliser que la première syntaxe qui a l'avantage de se rapprocher beaucoup plus de ce qu'on fait en algo.

Consigne 2 : pour se chauffer les doigts, je vous propose de commencer par créer une fenê-tre dans laquelle on va traduire le premier exemple d'algo du cours, l'algo Multiple de 3.Posez sur une fenêtre vierge un champ de saisie, type numérique, appelez-le saisieNombre, et dans l'événement de sortie de ce champ, tapez le code suivant :

SI modulo (saisieNombre, 3) = 0 ALORS

Info("Vous avez saisi le nombre ", saisieNombre)

info("Ce nombre est un multiple de 3")

FIN

Rappelez-vous que si on veut que l'événement de sortie soit activable, le champ de saisie ne doit pas être le seul objet présent de la fenêtre.

Le problème est qu'on n'a pas forcément envie de mettre un autre objet graphique sur la fenêtre, surtout s'il n'a aucune utilité, cela pourrait dérouter l'utilisateur.

Alors je vous donne une astuce : ce qu'on peut faire, c'est poser un autre objet graphique sur la fenêtre, mais le cacher en écartant la fenêtre, en mettant l'objet par exemple en bas à droite de la fenêtre, puis en rétrécissant à nouveau la fenêtre et en empêchant l'utilisateur de modifier la taille de la fenêtre. Voici en détail la démarche à suivre :

• Poser l'objet que l'on veut ensuite cacher (ici, je pose un bouton),

• Réduire la fenêtre à la dimension voulue, de manière à cacher l'objet (j'ai réduit la taille de la fenêtre avec la souris de manière à cacher le bouton),

Vous pouvez constater sur la copie d'écran ci-dessus que le bouton n'est pas visible sur la fenêtre mais que Windev nous affiche quand-même le bouton à l'endroit où il devrait être si la fenêtre était plus large.

• Empêcher l'utilisateur de modifier manuellement la taille de la fenêtre lors de son exé-cution. Dans la description de la fenêtre, sur l'onglet IHM, dans la zone Paramètres, je décoche la case Redimensionnable.

83989TGPA0107-seq03TP.indd 112 6/09/07 11:00:41

Page 3: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01113

Voilà. Ces manipulations, à l'exécution, donnent le résultat suivant :

Bon, maintenant, je peux avoir envie d'afficher le résultat des manipulations ailleurs que dans une boîte Info.

Je peux, par exemple, vouloir afficher ça dans la barre de message en bas de la fenêtre : D'abord, je commence par rajouter une barre de message à ma fenêtre, je vais dans la des-cription de ma fenêtre, et sur l'onglet Style, je coche la case Barre de message.

Puis, dans le code, je remplace l'instruction Info par l'instruction Message.

Exemple : Message("Vous avez saisi le nombre ", saisieNombre).

Et j'exécute la fenêtre.

83989TGPA0107-seq03TP.indd 113 6/09/07 11:00:42

Page 4: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01114

Travaux pratiques 3

Ah ! Une erreur, à propos de laquelle Windev me fournit les explications suivantes

Erreur à la ligne 2 du traitement Sortie de saisieNombre.

Vous avez appelé la fonction Message.

Le passage du paramètre 1 a provoqué une erreur.

Le champ Vous avez saisi le nombre est inconnu.

Pour vérifier la syntaxe d'utilisation de la procédure Message, je sélectionne Message dans mon code, puis j'appuie sur la touche F1 de mon clavier.

Cette fenêtre d'aide m'apprend que la procédure Message ne prend qu'une seule chaîne de caractères en paramètre.

Dans l'instruction Message("Vous avez saisi le nombre ", saisieNombre), c'est vrai que je passe 2 paramètres, séparés par une virgule. Bon, pour que ça ne fasse plus qu'un paramètre, je modifie l'instruction comme suit Message("Vous avez saisi le nombre "+ saisieNombre) (c'est-à-dire que je concatène la chaîne de caractères Vous avez saisi le nombre avec la valeur saisie par l'utilisateur).

Et hop ! J'exécute ! Je saisis 12.

Ca marche, mais seul le 2e message Ce nombre est un multiple de 3 s'affiche.

Pour comprendre ce qui se passe, je vais modifier le code comme suit, saisir un nombre qui n'est pas multiple de 3 et exécuter la fenêtre :

Message("Vous avez saisi le nombre " + saisieNombre)

SI modulo(saisieNombre,3) = 0 ALORS

Message("Ce nombre est un multiple de 3")

FIN

Normalement, le premier message doit s'afficher même si le nombre saisi n'est pas multiple de 3. Et GO !

Effectivement, ça fonctionne.Maintenant, je saisis un multiple de 3… et je ne vois à nouveau que le message Ce nombre est un multiple de 3 dans la barre de message.Bon, en fait, si je commande l'affichage successif de deux messages dans la barre de message, le premier message est tout de suite écrasé. J'essaierai de m'en souvenir.

Consigne 3 : pour tester le SINON, faites comme dans le cours, rajoutez une instruction au programme précédent « faisant en sorte que si le nombre saisi n'est pas multiple de 3, alors un message l'indique à l'utilisateur ».

Bon, vos doigts sont chauffés ? Alors on attaque les exercices de la partie 1.

83989TGPA0107-seq03TP.indd 114 6/09/07 11:00:42

Page 5: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01115

Exercice 21

Écrire l'algorithme d'affichage du plus grand de 2 nombres saisis au clavier.

Je vous conseille, pour cet exo, de créer 2 champs de saisie numériques et de lancer le traite-ment de comparaison à la sortie de chacun des 2 champs. Comment faire ?

Dans Windev, l'événement de sortie associé à un champ monChamp est une procédure que Windev appelle trtSortie. Pour que le même traitement puisse être appelé depuis deux objets différents, on peut entre autre, appeler l'événement de sortie d'un des objets dans l'événement de sortie de l'autre.Dans notre cas, vous pouvez choisir d'écrire le traitement de comparaison dans l'événement de sortie du champ de saisie saisieNb1 et, dans l'événement de sortie du Champ saisieNb2, écrire l'instruction ExécuteTraitement(saisieNb1, trtSortie), ce qui aura pour effet d'exécuter les instructions écrites dans l'événement de sortie du champ saisieNb1.

Lorsque vous testerez votre fenêtre, vous pourrez constater que le traitement de comparai-son est lancé, que vous sortiez du premier champ de saisie ou du deuxième.

Exercice 22

Écrire un algorithme qui simule le jeu de pile ou face.

Déroulement du jeu : l'utilisateur saisit la lettre P pour pile, et F pour face puis valide sa sai-sie (ou bien il clique sur le bouton « Pile » ou le bouton « Face » dans le cas d'une interface graphique et événementielle).

Le programme lui, choisit aléatoirement un nombre entre 0 et 1, si le nombre tiré au sort est 0, alors pile est gagnant, face est perdant, si le nombre tiré au sort est 1, alors pile est perdant et face est gagnant. Le programme affiche un message : gagné ou perdu.

Créez une nouvelle fenêtre pour cet exercice 22.

Remarque : par un heureux hasard (ha ! ha ! Elle est bien bonne), dans Windev, la fonc-tion qu'on a appelé hasard en algo s'appelle aussi Hasard.

Pour accéder à la page d'aide sur la fonction Hasard, je tape Hasard n'importe où dans le code, je sélectionne ce mot, et j'appuie sur la touche F1 de mon clavier.

83989TGPA0107-seq03TP.indd 115 6/09/07 11:00:43

Page 6: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01116

Travaux pratiques 3

Voici, quelque peu aménagé, ce que j'apprends dans cette page d'aide de Windev :

Fonction hasard. Plusieurs syntaxe possibles :La variable resultat est de type entier.

Syntaxe 1 : Obtenir un réel entre 0 et 1resultat= Hasard () // après appel de la fonction hasard (), resultat vaut soit 0, soit 1

Syntaxe 2 : Obtenir un entier entre 1 et a inclusresultat = Hasard(a) // après appel de la fonction hasard (a), resultat vaut entre 1 et a

Syntaxe 3 : Obtenir un entier compris entre a et bresultat = Hasard(a, b) // après appel de la fonction hasard (a,b), resultat a une valeur// comprise entre a et bNote : a et b doivent avoir des valeurs comprises entre 0 et 32767.

Remarque : la syntaxe 3 est la même que celle que nous avons utilisée en algo.Note : Si, avant d'appeler la fonction hasard, la procédure InitHasard n'est pas appelée, les valeurs aléatoires générées par Hasard seront les mêmes à chaque exécution du pro-gramme.

Moralité : il ne faudra pas oublier d'appeler cette procédure InitHasard.

On pourrait appeler cette procédure InitHasard, soit dans le code exécuté à l'ouverture du projet, ou bien dans le code exécuté à l'ouverture de la fenêtre.

Comment accède-t-on à ce code ?

En ce qui concerne le code du projet : en allant dans Projet | Code du projet et en tapant InitHasard dans la partie Initialisation de EXPRESS_TP3.

En ce qui concerne le code de la fenêtre : en faisant un clic droit à un endroit de la fenêtre où il n'y a aucun champ, et en choisissant Code dans le menu contextuel, puis en tapant InitHasard dans la partie Initialisation de la fenêtre ou bien dans la partie Prise de focus de la fenêtre, ce qui provoquera l'appel de la procédure InitHasard soit quand la fenêtre s'ouvre, soit quand l'utilisateur clique dedans si elle était déjà ouverte.

J'ai choisi les événements ci-dessus car nous devons être sûrs que la procédure InitHasard est appelée avant la fonction Hasard.

Voilà pour la fonction hasard.

Maintenant, je voudrais vous présenter l'objet Cases à options afin que vous proposiez à l'uti-lisateur le choix entre Pile ou Face en lui faisant cocher une option parmi celles proposées.

Dans Windev, les cases à options s'appellent des champs sélecteurs.

Vous en avez certainement utilisé dans les exercices proposés par le manuel d'autoformation.

83989TGPA0107-seq03TP.indd 116 6/09/07 11:00:43

Page 7: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01117

Sur la barre d'outils, les champs sélecteurs sont représentés par l'icône sélectionnée dans la copie d'écran ci-dessous.

Posez 1 champ sélecteur sur votre fenêtre.

Dans la description de votre champ sélecteur …

Dans la partie Options, double cliquez sur chaque option pour modifier son texte : écrivez Pile et en dessous, écrivez Face.

Vous devez obtenir le résultat suivant :

Ben oui mais je ne vois pas mon beau libellé Choisissez entre pile ou face que j'ai saisi dans la zone Libellé de la description de mon champ sélecteur.

Pour faire apparaître ce libellé, dans la description du champ sélecteur, sur l'onglet Style, dans la liste Position, je choisis autre chose que l'item Sans libellé qui est l'item actuellement sélectionné. Vous avez le choix entre Externe, A cheval ou Interne. Choisissez celui que vous voulez, l'essentiel, c'est que notre beau libellé soit visible.

Une fois que j'ai choisi le style de mon champ sélecteur et que j'ai validé, une fenêtre s'affi-che, me demandant si je veux utiliser ce style…Ben oui hein, sinon, je ne l'aurais pas choisi !! Je clique sur OK. Aaaah ! C'est mieux comme ça…

83989TGPA0107-seq03TP.indd 117 6/09/07 11:00:43

Page 8: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01118

Travaux pratiques 3

Testez votre fenêtre…Vous constatez que l'utilisateur peut choisir l'une ou l'autre des options Pile et Face.

Nous devons écrire un traitement qui prend en compte l'option choisie par l'utilisateur.

On a donc besoin de savoir quelle information nous renseigne sur l'option choisie par l'uti-lisateur.

Voilà ce que nous apprend l'aide de Windev à propos des champs sélecteurs :

• chaque option est repérée par un entier (allant de 1 à 48). Les options sont numéro-tées de haut en bas et de gauche à droite ;

• en programmation, un sélecteur est manipulé par un entier. Sa valeur correspond au rang de l'option sélectionnée ;

• l'événement à chaque modification du champ sélecteur est exécuté à chaque fois que le contenu du sélecteur est modifié (autrement dit à chaque fois que l'utilisateur choisit une autre option).

Donc, si j'ai bien compris, pour savoir quelle option l'utilisateur a choisi, je dois, dans l'évé-nement à chaque modification du champ sélecteur, tester si le choix concerne la première ou la deuxième option.

Bon, j'essaie en mettant le code suivant dans l'événement à chaque modification de mon champ sélecteur …

// A chaque modification de selecteurPileOuFace

Info(selecteurPileOuFace)

Quand Pile est cochée et que je coche Face, ça donne ça :

Quand Face est cochée et que je coche Pile, ça donne ça :

83989TGPA0107-seq03TP.indd 118 6/09/07 11:00:44

Page 9: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01119

Bon, maintenant, on va écrire le traitement correspondant à l'algo de l'exercice 22. On va écrire ce traitement dans l'événement A chaque modification de notre sélecteur selecteur-PileOuFace.

Dans ce traitement, la variable que l'on a appelée choixUtil dans l'algo, c'est le champ sélec-teur, que j'ai appelé selecteurPileOuFace. A part cela, le traitement à écrire est le même que dans l'algo, sauf qu'au lieu de tester si ChoixUtil = "P", on va tester si selecteurPileOuFace = 1, et qu'au lieu de tester si ChoixUtil = "F", on va tester si selecteurPileOuFace = 2…mais j'y pense…cela simplifie bigrement notre algorithme…Il va nous suffire de comparer le choix effectué par la fonction hasard avec l'option choisie par l'utilisateur. En effet, si l'utilisateur fait le même choix que l'ordinateur, il a gagné, sinon, il a perdu. Cette simplification est pos-sible car le choix d'une option est codée de manière numérique, comme le type de ce que renvoie la fonction hasard.

Ce qui donne :

SI selecteurPileOuFace = hasard(1,2) ALORS

Info("Gagné!!")

SINON

Info("Perdu!!")

FIN

Testez votre fenêtre. Ca fonctionne !!

Exercice 23

Écrire l'algorithme qui calcule et affiche le maximum de 3 nombres saisis au clavier par l'uti-lisateur. Attention, il n'est pas question de « sortir l'artillerie lourde » en cherchant quel est le plus grand nombre, quel est le 2e plus grand et quel est le plus petit. Tout ce qu'on veut, c'est le plus grand. Il n'est donc pas nécessaire de comparer ces 3 nombres 2 à 2, ce qui ferait 4 comparaisons. Deux comparaisons suffisent pour obtenir ce qu'on veut.

Je ne vous donne aucune consigne ni aide supplémentaire pour cet exercice : inspirez vous de l'exercice 21 et créez l'exo 23 sur le même modèle.

83989TGPA0107-seq03TP.indd 119 6/09/07 11:00:44

Page 10: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01120

Travaux pratiques 3

Partie 2

Imbrication de Si

On peut, dans Windev, imbriquer les si…alors…sinon…finsi exactement de la même manière qu'en algo.

Exercice 24

Même exercice que l'exercice 21 en prévoyant l'affichage d'un message au cas où les nom-bres saisis sont égaux.

Pour cet exo, reprenez l'exercice 21 et modifiez le code de manière à ce qu'il fasse ce qui est décrit dans l'algo de l'exercice 24.

Pensez à indenter (décaler) votre code afin qu'il reste lisible malgré les imbrications : utilisez les mêmes principes de présentation qu'en algo.

Voici un exemple de la façon dont on peut présenter le code en cas de conditionnelles imbriquées :

Exercice 25

Calcul du salaire d'un employé. L'utilisateur saisit le nombre d'heures travaillées, le salaire horaire et l'ancienneté de l'employé. Les retenues de sécurité sociale sont calculées à partir du salaire brut multiplié par le taux de retenue de la sécurité sociale qui est une constante valant 0.19. L'employé bénéficie d'une prime d'ancienneté qui équivaut à 2% du salaire brut pour + de 10 ans et -20 ans d'ancienneté et 5% du salaire brut si + 20 ans d'ancienneté.

Nous allons profiter de cet exo pour apprendre comment on déclare des constantes dans Windev.

• S'il s'agit d'une constante non visible à l'utilisateur, c'est extrêmement simple. Voici un exemple : tauxTVA est un Reel = 20.6Donc, dans Windev, pour déclarer une constante, il suffit de lui donner une valeur lors de la déclaration.Dans l'exo 25, vous pouvez déclarer le taux de retenue dans le code d'ouverture de la fenêtre : taux est un réel = 0.19

• S'il s'agit d'une constante que l'on veut rendre visible à l'utilisateur, alors il n'y a qu'à poser un champ de saisie sur la fenêtre, l'appeler par exemple saisieTaux, lui affecter une valeur initiale (par exemple dans le code d'ouverture de la fenêtre, en tapant saisieTaux = 0.19), et lui donner la propriété En Affichage, l'utilisateur ne pourra ainsi pas modifier sa valeur.

83989TGPA0107-seq03TP.indd 120 6/09/07 11:00:44

Page 11: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01121

Ce qui serait également intéressant pour cet exercice facile, c'est de rendre l'interface encore plus ergonomique en permettant à l'utilisateur de passer d'une zone de saisie à l'autre non seulement par la touche TAB de clavier, mais aussi simplement en appuyant sur entrée. Dans Windev, c'est très facile, car pour tous les champs de saisie qui n'ont pas été définis En affichage, on accède de l'un à l'autre soit avec TAB, soit en appuyant sur Entrée, mais vous découvrirez l'année prochaine qu'avec Delphi, cela nécessite que le développeur écrive lui-même les instructions de passage d'une zone à l'autre par appui sur la touche entrée.

Exercice 26

Écrire l'algorithme du jeu suivant : ce jeu se joue à 2 joueurs. Le premier joueur saisit un mot de 4 lettres à l'abri du regard du deuxième joueur. Puis, le deuxième joueur doit deviner quel est ce mot et le saisir. Il a droit à 3 essais. À chaque essai, le programme lui indique s'il a trouvé le mot ou bien, le cas échéant, quelles sont les bonnes lettres aux bonnes places parmi celles qu'il a saisies. Exemple : si le mot à trouver est « cape » et que le joueur a saisi « rate », le programme lui affiche : - a - e.

Si, au bout du 3e essai, le joueur n'a pas trouvé le mot, un message lui indique quel était le mot à trouver.

Là, on va s'amuser un peu : quand le joueur 1 saisira son mot secret, il s'affichera sous forme d'un mot de passe, afin que le joueur 2 ne puisse pas lire le mot qu'il doit deviner.

Pour ce faire, il suffit de poser sur votre nouvelle fenêtre fenexo26 un champ de saisie, l'ap-peler saisieMotATrouver, et de cocher le bouton radio Mot de passe dans la zone Type de la fenêtre de description du champ de saisie, comme ça…

83989TGPA0107-seq03TP.indd 121 6/09/07 11:00:45

Page 12: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01122

Travaux pratiques 3

Ce qui, lors de la saisie d'un mot, donne…

Maintenant, réfléchissons à la façon de traduire l'algorithme. On peut, en fait, adopter deux façons différentes de la traduire.

La première façon reste très proche de l'algo mais nécessite la création de 2 fenêtres : une pour le joueur 1 et l'autre pour le joueur 2. La seconde façon est plus conviviale car on ne crée qu'une seule fenêtre mais le code est assez différent de l'algo.

Je vous conseille vivement de prendre le temps de développer les 2 façons et de les exécuter chacune en pas à pas avec le debogueur pour bien comprendre la différence de fonctionne-ment entre les 2 méthodes. Ces deux façons vous sont décrites ci-dessous.

1. Première façon : une fenêtre pour chaque joueurTerminez la fenêtre fenexo26, le champ de saisie s'appelle saisieMotATrouver, le bouton s'appelle boutonJoueur2.

Pour la fenêtre dans laquelle le joueur 2 va saisir ses essais successifs, nous avons deux solu-tions.

Première solution : c'est le plus rapide. On utilise la fonction saisie fournie dans windev.

Pour tester comment s'utilise cette fonction, tapez le code suivant dans l'événement clic sur boutonJoueur2 :

essai est une chaîne

Saisie("Saisissez votre essai :", essai)

Info(essai)

83989TGPA0107-seq03TP.indd 122 6/09/07 11:00:45

Page 13: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01123

Testez votre fenêtre : lors de son ouverture, cliquez sur le bouton Joueur 2, puis saisissez quelque chose dans la zone de saisie Saisissez votre essai (moi, j'y ai saisie le mot test), et enfin, validez votre saisie…

Cela donne…

Ce test nous permet de comprendre que la fonction saisie affecte ce que l'utilisateur saisit (dans mon exemple, la chaîne de caractères test) à la variable qui lui est passée en paramètre (dans l'exemple, il s'agit de la variable essai).

83989TGPA0107-seq03TP.indd 123 6/09/07 11:00:46

Page 14: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01124

Travaux pratiques 3

Passons maintenant au code à écrire dans l'événement clic sur boutonJoueur2. Le voici ci-dessous, vous pouvez constater que ce code est très proche de l'algorithme.

essai est une chaîneSaisie("Saisissez votre premier essai :", essai) SI essai = saisieMotATrouver ALORS Info ("Bravo, tu as trouvé en 1 coup")SINON // dans windev, essai[1] s'écrit essai[[1]] SI essai[[1]] <> saisieMotATrouver[[1]] ALORS essai = "-" + essai[[2]] + essai[[3]] + essai[[4]] // dans windev, on ne peut pas modifier une chaîne caractère par // caractère, on est obligé de la réécrire en entier, // si on écrit essai[[1]] = "-", cela génère une erreur de syntaxe FIN SI essai[[2]] <> saisieMotATrouver[[2]] ALORS essai = essai[[1]] + "-" + essai[[3]] + essai[[4]] FIN SI essai[[3]] <> saisieMotATrouver[[3]] ALORS essai = essai[[1]] + essai[[2]] + "-" + essai[[4]] FIN SI essai[[4]] <> saisieMotATrouver[[4]] ALORS essai = essai[[1]] + essai[[2]] + essai[[3]]+ "-" FIN Saisie("Saisissez votre deuxième essai :", essai) SI essai = saisieMotATrouver ALORS Info ("Bravo, tu as trouvé en 2 coups") SINON SI essai[[1]] <> saisieMotATrouver[[1]] ALORS essai = "-" + essai[[2]] + essai[[3]] + essai[[4]] FIN SI essai[[2]] <> saisieMotATrouver[[2]] ALORS essai = essai[[1]] + "-" + essai[[3]] + essai[[4]] FIN SI essai[[3]] <> saisieMotATrouver[[3]] ALORS essai = essai[[1]] + essai[[2]] + "-" + essai[[4]] FIN SI essai[[4]] <> saisieMotATrouver[[4]] ALORS essai = essai[[1]] + essai[[2]] + essai[[3]] + "-" FIN Saisie("Saisissez votre troisième essai :", essai) SI essai = saisieMotATrouver ALORS Info ("Enfin, pas trop tôt") SINON Info ("Le mot à trouver était :", saisieMotATrouver) FIN

FIN

FIN

83989TGPA0107-seq03TP.indd 124 6/09/07 11:00:46

Page 15: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01125

Testez votre fenêtre. Pour la tester correctement, vous devez vérifier que toutes les situa-tions possibles fonctionnent, c'est-à-dire que votre fenêtre doit fonctionner si le joueur 2 trouve le bon mot au premier essai, s'il le trouve au deuxième essai, au troisième essai, ou bien s'il ne le trouve pas. Vous devez donc exécuter 4 fois minimum votre fenêtre pour la tester correctement.

Remarque : cette solution comporte un petit défaut : la taille des essais de l'utilisateur n'est pas limitée à 4 caractères et la fonction saisie, qui propose différents masques de saisie, n'a pas l'air de permettre de limiter la longueur de ce que saisit l'utilisateur.

Passons maintenant à la deuxième solution utilisable pour la saisie de ses essais successifs par le joueur 2.

Seconde solution : cette solution est un peu plus compliquée, mais pédagogiquement très intéressante. En outre, elle permet de limiter à 4 caractères la longueur des essais du joueur 2. On n'y utilise pas la fonction saisie. Par contre, on crée une deuxième fenêtre dans laquel-le le joueur 2 saisit ses essais, et les essais du joueur 2 sont passés en paramètre à la fenêtre fenexo26, c'est en cela que cette façon de faire est intéressante.

Commencez donc par créer la fenêtre dans laquelle le joueur 2 saisit ses essais. Moi, je l'ap-pelle fenEssaiExo26 (ce qui fait que finalement, elle s'appelle EXPRESS_ fenEssaiExo26) , le champ de saisie s'appelle saisieEssai, le bouton s'appelle boutonValideEssai.

Ceux qui le souhaitent peuvent également poser un bouton Fermer sur leur fenêtre.

Maintenant, intéressons nous au code.

Avant de vous indiquer le code à taper dans l'événement clic sur boutonJoueur2, je veux vous expliquer le sens de certaines instructions qui s'y trouvent.

essai = ouvre ("EXPRESS_fenEssaiExo26", essai)

Tout le secret est là : on commande l'ouverture de la fenêtre EXPRESS_fenEssaiExo26, en indiquant qu'à la fermeture de EXPRESS_fenEssaiExo26, on veut récupérer ce que renvoie la fenêtre EXPRESS_fenEssaiExo26, et le ranger dans essai.

essai = ouvre ("EXPRESS_fenEssaiExo26") signifie : ouvre la fenêtre EXPRESS_fenEssaiExo26 et quand elle se refermera, récupère ce qu'elle renvoie dans la variable essai.

ouvre ("EXPRESS_fenEssaiExo26", essai) signifie : ouvre la fenêtre EXPRESS_fenEssaiExo26 et passe lui en paramètre la valeur de la variable essai.

essai = ouvre ("EXPRESS_fenEssaiExo26", essai) signifie donc : ouvre EXPRESS_fenEssaiExo26 en lui passant la valeur de la variable essai en paramètre, et quand elle se referme, range ce qu'elle renvoie dans la variable essai.

83989TGPA0107-seq03TP.indd 125 6/09/07 11:00:46

Page 16: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01126

Travaux pratiques 3

Autrement dit, avec l'instruction essai = ouvre ("EXPRESS_fenEssaiExo26", essai), on fait 2 choses en même temps. On passe à la fenêtre EXPRESS_fenEssaiExo26 la valeur de l'essai précédent et on récupère dans la variable essai la valeur de l'essai que vient de faire le joueur 2.

Parallèlement à cette instruction, dans le code de fermeture de EXPRESS_fenEssaiExo26, on met une instruction pour que la fenêtre EXPRESS_fenEssaiExo26 renvoie, lorsqu'elle se ferme, la valeur saisie par l'utilisateur dans le champ saisieEssai.

Fermeture de EXPRESS_fenEssaiExo26

renvoyer saisieEssai

Dans le code Déclarations globales de EXPRESS_fenEssaiExo26, on a également besoin d'écrire une petite procédure dont le rôle est d'affecter, au champ de saisie saisieEssai, la valeur passée en paramètre dans l'instruction ouvre ("EXPRESS_fenEssaiExo26", essai). Cette procédure sert à récupérer la valeur de l'essai précédent.

Déclarations globales de EXPRESS_fenEssaiExo26

PROCEDURE recupereEssai(essai)

saisieEssai = essai

C'est assez bizarre, pas très propre, et également spécifique à Windev : en effet, on décrit la procédure, mais on ne l'appelle pas… Mais si on ne met pas la ligne PROCEDURE recupereEssai(essai), et qu'on laisse juste la ligne saisieEssai = essai, ça ne fonctionne pas.

Il nous reste à faire en sorte que la fenêtre de saisie des essais se ferme lorsque l'utilisateur valide sa saisie. Pour ce faire, il suffit de taper ferme dans le code clic sur boutonValideEssai.

Ainsi, lors du clic sur ce bouton, l'instruction Ferme a pour effet de fermer la fenêtre, ce qui a pour effet d'exécuter le code de fermeture de la fenêtre, donc de renvoyer saisieEssai dans la fenêtre qui avait commandé l'ouverture de la fenêtre EXPRESS_fenEssaiExo26.

Bon, c'est un peu compliqué à comprendre et à expliquer tout ça. Si vous ne comprenez pas complètement, ce n'est pas trop grave. Pour mieux comprendre, utilisez le debogueur : vos 2 fenêtres une fois terminées, lancez la fenêtre EXPRESS_fenexo26, saisissez un mot à trou-ver, donnez le focus par tabulation au bouton, puis appuyez sur les touches de clavier ctrl et pause en même temps, cela lance le debogueur de Windev, puis exécutez votre programme pas à pas pour comprendre comment ça marche.

Je vous remets ci-dessous le code clic sur boutonJoueur2 de la fenêtre EXPRESS_fenExo26. Dans ce code, j'ai simplement remplacé les appels à la fonction saisie par des appels à la fonction ouvre.

83989TGPA0107-seq03TP.indd 126 6/09/07 11:00:46

Page 17: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01127

essai est une chaîneessai = Ouvre("EXPRESS_fenEssaiExo26", essai)// Ici, on ouvre la fenêtre EXPRESS_fenEssaiExo26, et quand elle se // fermera, on reviendra à cet endroit dans le code de la fenêtre EXPRESS_fenexo26, en ayant // récupéré au passage dans essai la valeur que EXPRESS_fenEssaiExo26 nous a renvoyée à // sa fermeture.SI essai = saisieMotATrouver ALORS Info ("Bravo, tu as trouvé en 1 coup")SINON SI essai[[1]] <> saisieMotATrouver[[1]] ALORS essai = "-" + essai[[2]] + essai[[3]] + essai[[4]] FIN SI essai[[2]] <> saisieMotATrouver[[2]] ALORS essai = essai[[1]] + "-" + essai[[3]] + essai[[4]] FIN SI essai[[3]] <> saisieMotATrouver[[3]] ALORS essai = essai[[1]] + essai[[2]] + "-" + essai[[4]] FIN SI essai[[4]] <> saisieMotATrouver[[4]] ALORS essai = essai[[1]] + essai[[2]] + essai[[3]]+ "-" FIN essai = Ouvre("EXPRESS_fenEssaiExo26", essai) SI essai = saisieMotATrouver ALORS Info ("Bravo, tu as trouvé en 2 coups") SINON SI essai[[1]] <> saisieMotATrouver[[1]] ALORS essai = "-" + essai[[2]] + essai[[3]] + essai[[4]] FIN SI essai[[2]] <> saisieMotATrouver[[2]] ALORS essai = essai[[1]] + "-" + essai[[3]] + essai[[4]] FIN SI essai[[3]] <> saisieMotATrouver[[3]] ALORS essai = essai[[1]] + essai[[2]] + "-" + essai[[4]] FIN SI essai[[4]] <> saisieMotATrouver[[4]] ALORS essai = essai[[1]] + essai[[2]] + essai[[3]] + "-" FIN essai = Ouvre ("EXPRESS_fenEssaiExo26",essai) SI essai = saisieMotATrouver ALORS Info ("Enfin, pas trop tôt") SINON Info ("Le mot à touver était :", saisieMotATrouver) FIN FINFIN

83989TGPA0107-seq03TP.indd 127 6/09/07 11:00:46

Page 18: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01128

Travaux pratiques 3

Voilà, vous pouvez constater que, dans cette première façon de faire, le code clic sur le bou-ton Joueur 2 est très proche de l'algo (et assez long aussi).

Passons maintenant à la deuxième façon de développer ce jeu, celle où tout se passe sur la même fenêtre.

2. Deuxième façon : une seule fenêtre pour les 2 joueursCette méthode donne un résultat plus convivial mais le code s'éloigne fortement de l'algo, comme vous allez pouvoir le constater.

Après avoir posé le champ saisieMotATrouver sur votre fenêtre, il vous reste à rajouter un autre champ de saisie qui s'appellera saisieEssai, celui où le joueur 2 va saisir ses essais suc-cessifs, ainsi qu'un bouton Fermer.

N'oubliez pas de limiter à 4 la taille maxi de saisie de ces 2 champs.Dans l'événement clic du bouton Fermer, écrivez l'instruction ferme.Maintenant, la question est : où va-t-on écrire le traitement ? Pour cela, je vais vous guider.

La difficulté est la suivante : si on écrit le code par exemple dans l'événement de sortie du champ de saisie saisieEssai, ce code sera relancé en entier à chaque fois que l'utilisateur sort de ce champ. On ne pourra donc pas traduire notre algo tel quel, sinon, on repartira à cha-que fois à zéro dans l'algo. Il va donc falloir « éclater » notre code : il faut créer une variable servant à compter le nombre d'essais et la déclarer ailleurs que dans l'événement de sortie du champ saisieEssai, et dans l'événement de sortie de ce champ, ne mettre qu'une seule fois le traitement de comparaison de l'essai saisi avec le mot à trouver.

Ce genre de modification arrive fréquemment car un algo décrit les instructions sans tenir comp-te de l'interface graphique du programme, notamment lorsqu'un traitement est répétitif.

On a plusieurs choix possibles :

• soit on prévoit un bouton qui initialise une nouvelle partie, ce qui permet aux joueurs de faire plusieurs parties sans refermer la fenêtre, auquel cas, on déclare le compteur d'essais dans l'événement clic sur le bouton et on l'initialise à 0 ;

• soit on laisse l'interface de la fenêtre telle quelle, ce qui nous oblige à déclarer le compteur d'essais dans un événement de la fenêtre (dans l'événement d'ouverture par exemple), ce qui oblige les joueurs à fermer la fenêtre à la fin d'une partie et à la rouvrir pour refaire une nouvelle partie ;

• soit on lance une partie à l'ouverture de la fenêtre et on prévoit également un bouton Nouvelle partie qui réinitialise le jeu.

C'est cette 3e solution qui me paraît la plus conviviale, la plus ergonomique.

83989TGPA0107-seq03TP.indd 128 6/09/07 11:00:47

Page 19: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01129

Quelle démarche adopter quand on rencontre ce type de situation, à savoir l'impossibilité de retranscrire un algo tel quel ?

D'abord, on va compléter l'interface : on va rajouter le bouton Nouvelle partie, permettant aux joueurs de relancer une nouvelle partie sans devoir fermer puis rouvrir la fenêtre.

Ensuite, on va réfléchir sur le comportement exact que l'on veut donner à la fenêtre, cela nous permettra de savoir dans quels événements on veut mettre quelles instructions.

Comportement de la fenêtre Conséquence en ce qui concerne son développement

D'abord, le joueur 1 doit saisir le mot à trouver. On va l'y inviter dès l'ouverture de la fenêtre, ou dès qu'il y a eu un clic sur le bouton Nouvelle partie.

Dans les événements Initialisation de la fenêtre et clic sur le bouton Nouvelle partie, on doit retrouver le message invitant le joueur 1 à saisir son mot.

Ensuite, un message invite le joueur 2 à saisir ses essais successifs.

Le premier message invitant le joueur 2 à saisir ses essais successifs doit s'afficher dès que le joueur 1 a saisi son mot, l'instruction d'affichage de ce message doit donc se trouver dans l'événement de sortie du champ Mot à trouver.

Ensuite, le joueur 2 saisit ses essais successifs et dès qu'il valide une saisie :

S'il a gagné, un message le lui indique, les joueurs peuvent alors s'ils le souhaitent, faire une nouvelle partie en cliquant sur Nouvelle partie ou bien arrêter de jouer en fermant la fenêtre.

S'il n'a pas gagné et s'il n'en est pas à son troisième essai, on lui indique quelles sont les bonnes lettres et un message l'invite à saisir l'essai suivant.

S'il n'a pas gagné et qu'il en est à son troisième essai, un message lui indique qu'il a perdu et lui indique quel était le mot à trouver. Les joueurs peuvent ensuite s'ils le souhaitent, faire une nouvelle partie en cliquant sur Nouvelle partie ou bien arrêter de jouer en fermant la fenêtre.

Le traitement de test doit se trouver dans l'événement de sortie du champ Essai.

83989TGPA0107-seq03TP.indd 129 6/09/07 11:00:47

Page 20: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01130

Travaux pratiques 3

Reprenons l'algo et faisons le tri en fonction de la réflexion qu'on vient de mener.

Instructions Evénement(s) dans le(s)quel(s) il faut les mettre

Afficher ("Joueur 1, tu dois saisir un mot de 4 lettres")

Saisir (MotATrouver)

Initialisation de la fenêtre

Clic sur bouton Nouvelle partie

Afficher ("Joueur 2, tu dois trouver le mot de 4 lettres.")

Afficher ("Tu as droit à 3 essais, que la force soit avec toi.")

Afficher ("Premier essai :")

Sortie du champ Mot à trouver

Pour chaque essai :

Saisir (Essai)

Si Essai = MotATrouver

Alors Afficher ("Bravo, joueur 2, tu as gagné du ", compteur ,"coup")

Sinon Si essai[1] <> MotATrouver[1]

Alors essai[1] ! "-"

FinSi

Si essai[2] <> MotATrouver[2]

Alors essai[2] ! "-"

FinSi

Si essai[3] <> MotATrouver[3]

Alors essai[3] ! "-"

FinSi

Si essai[4] <> MotATrouver[4]

Alors essai[4] ! "-"

FinSi

Afficher ("Voici les bonnes lettres :", essai)

Afficher ("Joueur 2, saisis ton deuxième essai")

Saisir (essai)….

Sortie du champ Essai

Bon, on avance, mais c'est pas encore fini.

Il faut régler le problème de ce fameux compteur qui doit compter à combien d'essais on en est. Il ne doit pas être initialisé dans l'événement de sortie du champ Essai, sinon, à chaque sortie de ce champ, il sera réinitialisé. Il faut donc l'initialiser soit dans le code Initialisation de la fenêtre (ou dans le clic sur le bouton Nouvelle partie), soit dans l'événement de sortie du champ Mot à trouver. En outre, cette variable doit être « visible » depuis l'événement sortie du champ Essai.

Pour qu'une variable soit visible depuis le code de tous les champs d'une fenêtre, dans Windev, il faut la déclarer dans la partie Déclarations globales de la fenêtre.

Maintenant, une fois que ce fameux compteur vaut 3, si le joueur n'a pas trouvé le bon mot, le traitement est différent : on indique simplement au joueur par un message qu'il a perdu.

83989TGPA0107-seq03TP.indd 130 6/09/07 11:00:47

Page 21: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01131

Voici le code commenté des différents événements :

Déclarations globales de EXPRESS_fenExo26Facon2

// Déclaration du compteur, visible par tous les événements des champs de la fenêtre

compteur est un entier

Initialisation de EXPRESS_fenExo26Facon2

// Initialisation de compteur

compteur = 1

// Message au joueur 1

Info ("Joueur 1, saisis le mot à trouver")

Là, le joueur 1 saisit le mot à trouver et valide sa saisie en appuyant sur entrée, donc, c'est l'événement sortie de saisieMotATrouver qui s'exécute.

Sortie de saisieMotATrouver

Info ("Joueur 2, saisis ton premier essai")

83989TGPA0107-seq03TP.indd 131 6/09/07 11:00:47

Page 22: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01132

Travaux pratiques 3

Là, le joueur 2 saisit son premier essai et appuie sur entrée, on entre donc dans l'événement de sortie du champ Essai, que j'ai appelé saisieEssai.

Sortie de saisieEssai// Ne pas perdre de vue que ce traitement est exécuté à chaque fois que l'utilisateur sort

// du champ saisieEssaisi saisieEssai = saisieMotATrouver alors

info ("Bravo, tu as trouvé en" + compteur + " coup(s)")

sinon

si compteur = 3 alors

// On traite ici la possibilité que l'utilisateur en soit à son 3e essai mais n'ait pas trouvé

// le bon mot

info ("Perdu, le mot à trouver était : ", saisieMotATrouver)

// On aurait très bien pu écrire : si compteur < 3 alors traitement de comparaison sinon

// info ("Perdu, le mot à trouver était : ", saisieMotATrouver)

sinon // traitement de comparaison

// dans Windev, l'équivalent de essai[1] s'écrit essai[[1]]

si saisieEssai[[1]] <> saisieMotATrouver[[1]] alors

saisieEssai = "-" + saisieEssai[[2]] + saisieEssai[[3]] + saisieEssai[[4]]

// On ne peut pas changer un seul caractère d'un champ de saisie dans Windev :

// on ne peut pas écrire essai[[1]] = "-", on est obligé de réécrire tout le contenu

// du champ

FIN

si saisieEssai[[2]] <> saisieMotATrouver[[2]] alors

saisieEssai = saisieEssai[[1]] + "-" + saisieEssai[[3]] + saisieEssai[[4]]

FIN

si saisieEssai[[3]] <> saisieMotATrouver[[3]] alors

saisieEssai = saisieEssai[[1]] + saisieEssai[[2]] + "-" + saisieEssai[[4]]

FIN

si saisieEssai[[4]] <> saisieMotATrouver[[4]] alors

saisieEssai = saisieEssai[[1]] + saisieEssai[[2]] + saisieEssai[[3]] + "-"

FIN

// Le compteur d'essais est augmenté de 1

compteur++

// Cette syntaxe équivaut à compteur = compteur + 1

info ("essai n°" + compteur)

// On redonne le focus au champ saisieEssai pour que le joueur 2 saisisse

// l'essai suivant

reprisesaisie ("saisieEssai")

fin

FIN

83989TGPA0107-seq03TP.indd 132 6/09/07 11:00:47

Page 23: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01133

Clic boutonNouvellePartie

// On vide les 2 champs de saisie

saisieEssai = ""

saisieMotATrouver = ""

// On appelle le code d'initialisation de la fenêtre. Ainsi, tout se passe comme si les joueurs

// venaient d'ouvrir la fenêtre

ExécuteTraitement(EXPRESS_fenExo26Facon2, trtInit)

Voilà, vous pouvez exécuter votre fenêtre.

Il reste un petit défaut à corriger : quand on clique sur Nouvelle partie, le champ Mot à trou-ver n'a pas le focus, et l'utilisateur doit cliquer dedans ou appuyer sur la touche TAB pour le rendre actif, ce qui n'est pas très convivial.

Il faut donc forcer le fait que Mot à trouver ait le focus avec l'instruction reprisesaisie("saisieMotATrouver"). A priori, on a deux endroits possibles pour mettre cette commande :

• dans le bouton Nouvelle partie après avoir appelé le code d'initialisation de la fenêtre ;

• dans le code d'initialisation de la fenêtre.

Si vous faites les 2 essais, vous constaterez que la première solution ne fonctionne pas.

Pourquoi ?

C'est simple : avec la commande ExécuteTraitement(EXPRESS_fenExo26Facon2, trtInit), vous « branchez » le programme sur le code d'initialisation de la fenêtre et il abandonne l'événe-ment où il se trouve actuellement, ignorant toutes les instructions qui suivent ExécuteTraitement(EXPRESS_fenExo26Facon2, trtInit).

Voilà. Ouf ! Il n'était pas facile à traduire celui-là, ni à expliquer d'ailleurs.

Rien ne vous empêche une fois que les 2 versions fonctionnent, de rajouter un bouton Nouvelle partie dans la première version (celle avec les 2 fenêtres).

Exercice 27

Écrire l'algo qui permet d'afficher dans l'ordre alphabétique 4 mots saisis dans un ordre quelconque.

En ce qui concerne cet exo, la difficulté résidait dans l'algo, mais le développement est très simple. Donc, je ne vous aide pas.

83989TGPA0107-seq03TP.indd 133 6/09/07 11:00:48

Page 24: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01134

Travaux pratiques 3

Partie 3

Les choix multiples

Syntaxe Windev de l'instruction conditionnelle SelonCas :

Selon expression1 Cas expression2 [,expression3 .. .] // instruction Cas expression4 [,expression5 .. .] // instruction .. . [ AUTRES CAS (ou AUTRE CAS) // instruction ] Fin

Tout ce que j'ai décrit dans le cours d'algo est valable dans Windev.

En guise d'exemple, je vous donne la traduction Windev de l'exemple du cours sur les pro-duits (qui est un exemple tiré de l'aide de Windev et quelque peu modifié), dans lequel on lance différents traitements selon la valeur de deux données, typeProduit et refProduit, de type chaîne.

Exemple :

Selon typeProduit Cas "1" Info ("C'est un produit alimentaire") Cas "2" Info ("C'est un produit de nettoyage") AUTRES CAS Selon nomProduit Cas "AAA" : Info ("Produit AAA") Cas "BBB" : Info ("Produit BBB") Cas "CCC" : Si Prix < 100 alors Info ("Promotion") FinFin

Consigne 4 : vous pouvez en guise d'échauffement, programmer le petit exercice sur les multiples de 3.

Exercice 28

Écrire un algorithme qui propose un menu affiché à l'écran, et qui, en fonction du choix fait par l'utilisateur, effectue soit la somme, soit le produit, soit la moyenne de 2 nombres saisis. Prévoir le cas où l'utilisateur a fait une erreur de saisie.

Cet exercice facile est l'occasion d'utiliser à nouveau des cases à options, déjà utilisées dans le jeu de pile ou face (on va faire correspondre une option à chaque opération), et de rajouter quelques petites gourmandises pour bien terminer ce délicieux repas. Je vous propose, pour cet exo, de créer l'interface suivante…

83989TGPA0107-seq03TP.indd 134 6/09/07 11:00:48

Page 25: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

Travaux pratiques 3

8 3989 TG PA 01135

Le champ de saisie Premier nombre s'appelle saisiePremierNombre, le champ de saisie Second nombre s'appelle saisieSecondNombre, le champ de saisie Résultat s'appelle sai-sieResultat et est en affichage seul, le champ sélecteur Choisissez une opération s'appelle selecteurChoixOper.

Bon. Vous pourrez constater que le fait d'utiliser des cases à options évite les erreurs de saisie utilisateur, ce qui nous évite d'utiliser le sinon que nous avions initialement prévu dans l'algo.Pour le reste, je vous laisse faire : écrivez le traitement dans l'événement A chaque modifi-cation de selecteurChoixOper, qui joue le rôle de la variable choix de l'algo.

Exercice 29

L'utilisateur saisit la date au format jj/mm/aaaa, par exemple 15/10/2001, et le programme lui affiche : Aujourd'hui, on est le 15 Octobre 2001. Si le mois saisi est erroné, un message s'affiche, indiquant à l'utilisateur qu'il a fait une erreur de saisie.

Créez l'interface de cette fenêtre EXPRESS_fenexo29.

Dans Windev, il existe des fonctions toutes faites qui font le travail de découpage d'une date (voir dans le sommaire de l'aide, dans fonctions standard, à la rubrique Fonctions dates et heures). Ici, le but est de vous faire utiliser la structure selon cas, mais si vraiment vous avez la flemme de programmer toutes les lignes, alors cherchez la bonne fonction vous-même.

Je vous rappelle que l'équivalent de la fonction SousChaîne s'appelle milieu dans Windev.

En ce qui concerne le champ de saisie dans lequel l'utilisateur saisit la date, donnez-lui le type date et choisissez le masque de saisie adapté au format jj/mm/aaaa.

Je voudrais profiter de cet exo simplissime pour vous faire afficher des bulles d'aides lorsque l'utilisateur passe sur certaines zones de votre fenêtre.

Exemple : je vous propose d'afficher la bulle d'aide Cliquez ici pour fermer la fenêtre lors-que l'utilisateur passe avec la souris au dessus du bouton Fermer. Pour ce faire, allez dans la Description du bouton, que j'ai appelé boutonFermer, allez dans l'onglet Aide, et dans la zone Bulle d'aide, tapez Cliquez ici pour fermer la fenêtre.

Testez votre fenêtre : exécutez la et passez au dessus du bouton Fermer avec votre souris.

83989TGPA0107-seq03TP.indd 135 6/09/07 11:00:48

Page 26: Les structures conditionnelles La structure …the.file.free.fr/1er-année BTS IG/Algorithmique_et_langages_3989... · 8 3989 TG PA 01 112 Travaux pratiques 3 En tous cas, j'ai eu

8 3989 TG PA 01136

Travaux pratiques 3

Vous voyez, c'est très facile.

Maintenant, comment faire pour donner une valeur à une bulle d'aide par programmation ?

C'est simple, la propriété contenant le texte de la bulle d'aide s'appelle bulle. Si on veut modifier par programmation le contenu de la bulle d'aide du bouton boutonFermer, il suffit d'écrire boutonFermer..bulle = "Nouveau texte de la bulle d'aide".Faites l'essai : dans la fenêtre fenexo29, écrivez, dans l'événement de sortie de la zone de saisie Date l'instruction boutonFermer..bulle = "Pitié, ne me fermez pas".

Testez votre fenêtre : positionnez-vous dès son ouverture sur le bouton Fermer, observez le texte de la bulle d'aide, tapez une date et appuyez sur « entrée », repositionnez-vous ensuite sur le bouton Fermer".

Pour finir de développer cette fenêtre, vous n'avez pas besoin de moi.

Exercice 30

Écrire l'algorithme qui affiche la conjugaison d'un verbe du premier groupe saisi par l'utili-sateur à la personne choisie.

Au lancement, un message invite l'utilisateur à saisir le verbe qu'il souhaite conjuguer.

Deux messages s'affichent ensuite, lui permettant de choisir d'une part le pronom de con-jugaison, d'autre part le nombre (singulier ou pluriel) souhaités.

Si l'utilisateur saisit "arriver" puis choisit "2e personne" et "singulier" le message "Tu arri-ves" s'affiche.

Créez 2 sélecteur de cases à options selecteurPersonne et selecteurNombre sur cette fenêtre.Dans le traitement, il va falloir tester la valeur des deux cases à options pour donner la bonne conjugaison et il faut que ce traitement soit lancé dans l'événement A chaque modification de chacun des 2 sélecteurs.

Comment faire ?

Soit un sélecteur case à options s'appelant selecteurPersonne. L'événement A chaque modi-fication de ce sélecteur case à options selecteurPersonne s'appelle trtModification.

Comment je sais ça ? En écrivant l'instruction executeTraitement n'importe où dans le code, en choisissant ensuite mon sélecteur selecteurPersonne dans la liste qui m'est proposée par windev, puis en regardant la liste des traitements disponibles qui m'est également proposée.

Donc, ce qu'il faut faire pour développer cette fenêtre, c'est écrire le traitement complet dans l'événement A chaque modification d'un des deux sélecteurs, et appeler ce traitement dans l'événement A chaque modification de l'autre sélecteur en écrivant ExécuteTraitement(selecteurPersonne, trtModification) dans l'événement A chaque modification du sélec-teur selecteurNombre si on a écrit le traitement dans l'événement A chaque modification de selecteurPersonne, ou en écrivant ExécuteTraitement(selecteurNombre, trtModification) dans l'événement A chaque modification de selecteurPersonne si on a écrit le traitement dans l'événement A chaque modification de selecteurNombre.

Voilà. Je vous laisse le soin de finir cette fenêtre. Ce « petit TéPé » est terminé.On va pouvoir attaquer la séquence 4 !

83989TGPA0107-seq03TP.indd 136 6/09/07 11:00:48