IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Pascal Discussion :

READ(CHAR) semble lire 2 caractères


Sujet :

Langage Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut READ(CHAR) semble lire 2 caractères
    Bonjour à tous,

    Je débute en Pascal et je ne comprends pas le comportement de ce petit programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    PROGRAM menu;
    TYPE
      EnsReponses = SET OF CHAR;
    VAR
      Reponses : EnsReponses;
      reponse: CHAR;
    BEGIN
      Reponses := ['A','B','C'];
      WRITELN('Introduisez un caractère puis ENTER.');
      WRITE('A,B ou C: ');
      READ(reponse);
      WHILE NOT (reponse IN Reponses) DO BEGIN
        WRITE('[',reponse,'] Réponse erronée, recommencez: ');
        READ(reponse);
      END;
      WRITELN('ok')
    END.
    Quand le caractère introduit est correct, ça fonctionne,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gv@spirou:~$ ./menu
    Introduisez un caractère puis ENTER
    A,B ou C: A
    ok
    mais quand il est incorrect, je ne comprends pas pourquoi il répète 2x la boucle. C'est pour essayer de comprendre que j'ai introduit la variable reponse dans l'affichage au sein de la boucle, et c'est ainsi que je vois qu'apparaît un saut de ligne entre les crochets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    gv@spirou:~$ ./menu
    Introduisez un caractère puis ENTER
    A,B ou C: a
    [a] Réponse erronée, recommencez: [
    ] Réponse erronée, recommencez: 
    [
    ] Réponse erronée, recommencez: A
    ok
    Remarquez qu'au 2ème essai, j'ai tapé ENTER directement.

    Je travaille avec freepascal 2.4.0-2 sous Debian.

    Pourrait-on m'expliquer ce comportement ?

    Merci d'avance,

    Gauthier

  2. #2
    Membre éclairé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Par défaut
    Je croit avoir compris ton erreur (je n'ai pas eu trop le temps de regarder),
    Quand tu appui sur "entrer" la touche "entrer" va dans le buffer donc le programme vérifie la touche entrer. Il voit donc qu'elle n'est pas dans EnsReponses. Donc il te fais une 2eme fois ta boucle. On voit car quand il affiche la réponses on a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [
    ] réponses erroné
    Donc on voit que la touche entre les crochets est "entrer".

    Utilise Readkey pour lire une char

    pourquoi ne fais tu pas comme ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    program test;
    uses crt;
     
    var
      reponses : char;
     
    begin
      repeat
        writeln('entré A,B,C : ');
        reponses := readkey;
        if not reponses in ['a','b','c'] then writeln('erroné');
      until reponses in ['a','b','c'];
      writeln('bien joué'); 
    end.
    Après tu peut toujours remplacer le ['a','b','c'] par une variable set of char
    Essai de prendre un papier et un crayon pour savoir ce que fais le programme

    Sinon dans fp, il y a un debugger. Essai le mode pas à pas et les watchs (ça permet de voir le contenu d'une variable en cours de programme)

    Esperant t'avoir aidé
    Titeeee

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par gvdmoort Voir le message
    Bonjour à tous,

    Je débute en Pascal et je ne comprends pas le comportement de ce petit programme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    PROGRAM menu;
    TYPE
      EnsReponses = SET OF CHAR;
    VAR
      Reponses : EnsReponses;
      reponse: CHAR;
    BEGIN
      Reponses := ['A','B','C'];
      WRITELN('Introduisez un caractère puis ENTER.');
      WRITE('A,B ou C: ');
      READ(reponse);
      WHILE NOT (reponse IN Reponses) DO BEGIN
        WRITE('[',reponse,'] Réponse erronée, recommencez: ');
        READ(reponse);
      END;
      WRITELN('ok')
    END.
    Quand le caractère introduit est correct, ça fonctionne,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gv@spirou:~$ ./menu
    Introduisez un caractère puis ENTER
    A,B ou C: A
    ok
    mais quand il est incorrect, je ne comprends pas pourquoi il répète 2x la boucle. C'est pour essayer de comprendre que j'ai introduit la variable reponse dans l'affichage au sein de la boucle, et c'est ainsi que je vois qu'apparaît un saut de ligne entre les crochets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    gv@spirou:~$ ./menu
    Introduisez un caractère puis ENTER
    A,B ou C: a
    [a] Réponse erronée, recommencez: [
    ] Réponse erronée, recommencez: 
    [
    ] Réponse erronée, recommencez: A
    ok
    Remarquez qu'au 2ème essai, j'ai tapé ENTER directement.

    Je travaille avec freepascal 2.4.0-2 sous Debian.

    Pourrait-on m'expliquer ce comportement ?

    Merci d'avance,

    Gauthier
    ReadLn pour gérer la touche ENTREE

    ou ReadKey mais dans ce cas pas de touche ENTREE
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 124
    Par défaut
    Merci pour vos réponses, je confondais effectivement READ et READKEYS.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Unicode] Comment lire des caractères ?
    Par Mickey974 dans le forum Delphi
    Réponses: 7
    Dernier message: 14/04/2007, 14h53
  2. Réponses: 15
    Dernier message: 09/03/2007, 22h22
  3. lire des caractères
    Par soria_t dans le forum C
    Réponses: 5
    Dernier message: 23/02/2007, 12h20
  4. Réponses: 6
    Dernier message: 16/12/2006, 15h08
  5. [vb.net][string.indexOf(char)] trouver le n caractère
    Par arnolem dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/02/2006, 12h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo