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

Pascal Discussion :

Réponse à des questions dans un temps imparti : problème avec Delay


Sujet :

Pascal

  1. #21
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Bonjour
    Citation Envoyé par +bsdocuments+
    J'ajoute que le problème sera persistant quand vous imposez le ReadKey !! car, si tu fait cette instruction dans
    la première boucle, il ne sera pas possible de défiler les questions,
    Qui à imposer le Readkey ?Il ne s'agit pas d'imposer une fonction quoi que ce soit mais plutot il faut voir la methode à suivre et les fonctions à utiliser dans telle ou telle situation et comme on l'aura remarqué ici Readkey est plutot adapté

    Citation Envoyé par +bsdocuments+
    C'est seulement avec un KeyPressed que tu peut détecter si l'utilisateur à préssé une touche ou pas
    J'ai pas dit le contraire jusque la

    Citation Envoyé par +bsdocuments+
    Si tu parle dans ce context, donc il est nécessaire d'impliquer l'assembleur; et c'est ce que je ne veux pas le faire..
    Alors je crois que tu ne lis ou comprend pas bien mes phrases
    Citation Envoyé par krachik
    ...établis un algo et on vera comment t'aider :on peut faire ces genres de choses meme sans interruption clavier(asm) juste à coup de gettime et delay bien géré
    On peut très bien se passer de l'assembleur dans ce cas ;il s'agit juste de simuler le fait qu'on ait un chrono qui fonctionne en meme temps qu'on ait à taper quelque chose au clavier si on le souhaite.(ça sera pas très parfait mais ça peut se faire )


    Dernier point avant de continuer relies l'enoncé et dis moi juste ce que tu pense que l'enoncé demande et je demanderai aussi à soli!de snake de nous dire comment il comprend son énoncé (inutile de discuter sur un code si on est pas tous d'accord sur la comprehension du sujet )

    Cordialement
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  2. #22
    Membre régulier Avatar de IMPRO
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Points : 94
    Points
    94
    Par défaut
    bon soir ,
    pour l'énonce je pense qu'il est clair
    c'est de répondre a une question dans un délai de 30sec, et s'il y a pas de réponse on passe a la prochaine question , c tous .
    - dans le code que j ai envoyé il y avait un probleme c'est que le l utilisateur peut triché parce que le compteur (30sec) s'arrête quand il y a un pressekey alors il se peut que l utilisateur appuie sur une touche puis il prend tt son temps comme a dit krachik c'est pour sa il a fallu un readKey , son rôle c'est de bloquer le compteur de temps quand il y a une réponse et après une validation par le touche entée donc tant que y a pas de réponse validée le compteur reste toujours en marche , alors il faut exécuter 2 instruction en même temps ;le compteur et la lecture de la réponse ;
    ## la question ##
    ## réponse## en même temps ## temps##.
    - et même dans le code de +bsdocuments+ il reste toujours le même problème .

  3. #23
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Bonjour
    Maintenant qu'on est d'accord sur le sujet (en gros ce que j'avais dit ),voyons voir comment on peut simuler en meme temps ce chrono et le fait de saisir une réponse au clavier:
    Commençons par élaborer notre chrono (je prend un exemple parmi d'autres (un simple)):il s'agira de faire un chrono dont le delay ne disposera pas d'un temps assez long pour qu'on ne ressente pas la difference d'attente.J'explique avec un chrono normal dans le genre(ci dessous) on n'a aucune chance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        ....
        for i:=1 to 30 do
        begin
            gotoxy(x,y);
            write(i); 
            delay(1000);
            gotoxy(x,y);
            write('  ');
        end;
        .....
    Alors il faut écrire une fonction qui fera ce temps(chrono) qui sera à son tour executé de façon répétitive dans le programe principale .Et dans cette fonction il faudra que le chrono puisse permettre qu'on puisse appuyer sur une touche ou s'arreter quand le temps sera écoulé.Je pense à une fonction du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        function temps(x,y:byte;var tps:integer) :boolean;
        { x , y ==> histoire de generaliser cette fonction au cas on deciderait d'aller ecrire le chrono a une position donné de l'ecran d'execution
          tps ==>c'est le temps qui sera defini comme dans notre cas 30sec
          @retour ==>un booléen pour dire si le temps est écoulé ou non}
        begin
            repeat
                ......
                ......
            until (keypressed) or (tps<0)
            {tps<0 parce que si on prend comme exemple on aura un decompte à faire c'est a dire partant de 30 à 0,}
             if (tps<0 ) then 
                  temps:=true;{c'est a dire que le temps est écoulé}
         end.
    Dans notre programme principale on peut faire appel a cette fonction de la sorte
    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
    18
    19
     
           var tps:integer:{temps du chrono à définir}
                tempsEcoule:boolean;
                x,y:byte;{position où on souhaite affiche le chrono}
              .......
           begin
              .........
              .........
              tps:=....;
              tempsEcoule:=false;{au debut on suppose que le temps n'est pas encore ecoulé}
              x:= 12;  y:= 3; { x et y pris au hasard}
              repeat
                  tempsEcoule:=temps(x,y,tps);
                  ........
                  ........
              until (tempsEcoule) or( appuie sur ENTREE) or(appuie sur QUITTER);
              ..........
              ..........
          end.
    Ce qui fait que le chrono fait son travail et en meme temps si l'utilisateur appuie sur une touche (utilisation de keypressed ) tu lis la touche qui à été appuyer et tu la concatene à une chaine .Quand l'utilisateur appuie sur ENTREE tu retourne la chaine (ainsi obtenue par concatenation de caractere tapé au clavier par la lecture des touches(utilisation de readkey)),ou QUITTER tu quittes et passes a une autre question.
    Si ENTREE a été validée dans ce cas tu testes s'il s'agit d'une bonne réponse
    Si tempsEcoule alors on passe a une autre question .

    Il s'agit d'un algo parmi tant d'autres et tu peux t'en sortir avec ça sans meme utiliser de gettime juste avec une bonne gestion de delay( attention pas la classique ,il y a juste un peu de subtilité )
    Tu peux aussi faire une fonction utilsant gettime pour remplacer les delay dans la fonction que j'ai proposer et ça marchera aussi
    OU autre solution ,tu peux aussi toi meme elaborer un algo que tu trouve bien et on vera ensemble comment le faire fonctionner

    J'espere que tu pourras avancer avec ces explications (demain si j'ai un peu de temps je te ferai voir un exe de ce que je te propose)

    Cordialement
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  4. #24
    Membre habitué Avatar de bs.box
    Inscrit en
    Mai 2008
    Messages
    174
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 174
    Points : 173
    Points
    173
    Par défaut Salut..
    Dans les deux cas Krachik !!
    il faut savoir que qu'ont impose le ReadKey pour concatiner
    comme vous dite, je peut pressé une seule touche, et le malheur
    se débute; car ReadKey ne vous lâche qu'à la presse d'une
    touche; par exemple, quand je presse cette [singulaire touche]
    et je n'intervienne à jamais [essaye de la comprendre comme tu veux:
    je reste 1 seconde ou 2; 1 jours ou à l'infini !!!] donc tu va violé
    la contrainte de 30secondes; tu trouve pas?!!

    En tout cas; dans mon premier poste s'il vous le réviser vous ne retener
    que le même problème.

    C'est seulement dans le cas que KeyPressed est suivi par un
    et j'insiste un et un seul ReadKey !!; dans ce cas il faut le géré de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    repeat
    until KeyPressed;
    if KeyPressed 
         then x:=ReadKey {ici ReadKey n'impose pas l'attente d'une 
                                  touche; mais plutôt la touche pressée}
         else x:=ReadKey  {ici; c'est FAUX, car ReadKey impose une 
                                  nouvelle attente d'une touche de l'utilisateur
                                 }
    Seulement, reste si je t'ai pas compris bien..

    Beh, la solition est la suivante:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    uses Dos,Crt;
    Const TempAttente = 30; {Temps d'attente en seconde}
     
    Type Questionnaire=Record
         Question,
         Reponse  :String;
         End;
     
    Var cpt,i,
        _h, _m, _s, _hund:Word;
        reponse:String;
        t:Array [1..30] Of Questionnaire;
     
        c:char; {lire un caractere}
     
    function TempsEcoule:Boolean;
    var h, m, s, hund:Word;
        temps_1,temps_2:Extended;
    begin
     GetTime(h,m,s,hund);                {Avoir le temp actuel}
     temps_1:=(_h*60*60) + (_m*60) + _s; {Avoir les secondes de debut}
     temps_2:=(h*60*60) + (m*60) + s;    {Avoir les secondes du temp actuel}
     TempsEcoule := Abs(temps_2-temps_1) >= TempAttente;
                    {^--> renvoi la valeur absolue !!}
    end;
     
    procedure AfficheResultat;
    begin
     Write('le resultat de ce test est : ',cpt,'/30');
     ReadKey;
    end;
     
    function LireReponse:Boolean;
    begin
     IF KeyPressed
        THEN BEGIN
        C:=ReadKey; {
                      ici le ReadKey ne sera pas impose vu que le KeyPressed
                      retourne la valeur TRUE
                    }
        if C=#27
           then begin
           WriteLn('PROGRAMME QUITTE PAR L''UTILISATEUR');
           AfficheResultat;
           Delay(800);
           Halt; { <-- Quitter le programme}
           end
           else if C=#13
                   then begin
                   if (reponse=t[i].reponse)
                      then Inc(cpt);
                   LireReponse:=True;
                        end
           else begin
           Write(C); {Afficher le caractere}
           Reponse:=Reponse+C; {concatener avec la chaine Reponse}
           LireReponse:=False;
                end
             END
        ELSE LireReponse:=False;
    end;
     
    procedure LireQuestions;
    begin
     for i := 1 to 30  do
     begin
     ClrScr;
     WriteLn('Lecture de la question: ',i,'/30');
     ReadLn(t[i].question);
     WriteLn('Lecture de la reponse: ',i,'/30');
     ReadLn(t[i].reponse);
     end;
    end;
     
    begin
    LireQuestions;
    cpt:=0;
     
     for i := 1 to 30  do
     begin
     ClrScr;
     WriteLn('Questionnaire: ',i,'/30');
     GetTime(_h,_m,_s,_hund); {avoir le temps}
     WriteLn(t[i].question);
       repeat
       until TempsEcoule or LireReponse;
     end;
     
    AfficheResultat;
    end.
    Bonne Continuation..
    ______________________________________________________________________
    Le sketch qui m'a marqué le plus! écoutez les programmeurs : Site de Yan Marchal

  5. #25
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Bonjour
    Citation Envoyé par +bsdocuments+
    Dans les deux cas Krachik !!
    il faut savoir que qu'ont impose le ReadKey pour concatiner
    comme vous dite, je peux presser une seule touche, et le malheur
    se débute; car ReadKey ne vous lâche qu'à la presse d'une
    touche; par exemple, quand je presse cette [singulaire touche]
    et je n'intervienne à jamais [essaye de la comprendre comme tu veux:
    je reste 1 seconde ou 2; 1 jours ou à l'infini !!!] donc tu va violé
    la contrainte de 30secondes; tu trouve pas?!!
    Seulement, reste si je t'ai pas compris bien..
    Oh que non tu ne m'as pas bien compris du tout
    Et ça fait 2 fois que je l'ai dit et si tu lis attentivement mon post précedent tu aurais pu comprendre.Quand on aide une personne on met cette personne sur une voie ,on lui donne des pistes mais on ne lui donne pas de suite toute la solution.Ce que j'ai fait dans mon post précedent c'est de donner une approche de solution et comment peut se presenter le code.L'auteur du post ne gagnera rien si on lui donne tout .

    Quand tu dis que le ReadKey ne vous lache qu'a l'appui d'une touche ,ceci est valade dans un code ou on fait (c:=readkey ; ) sans condition.Mais une fois qu'une condition est posé (if keypressed then .......) comme tu l'a dit alors le probleme ne se pose pas.
    Alors une derniere fois prend au moins la peine de bien lire et comprendre mes phrases pour m'éviter d'écrire plusieurs fois la meme chose
    Voila tes reponses qui se trouvent dans mon post précedent :
    Citation Envoyé par krachik
    Alors il faut écrire une fonction qui fera ce temps(chrono) qui sera à son tour executé de façon répétitive dans le programe principale .Et dans cette fonction il faudra que le chrono puisse permettre qu'on puisse appuyer sur une touche ou s'arreter quand le temps sera écoulé...
    que sous entend la partie en gras d'apres toi ?

    Citation Envoyé par krachik
    Ce qui fait que le chrono fait son travail et en meme temps si l'utilisateur appuie sur une touche (utilisation de keypressed ) tu lis la touche qui à été appuyer et tu la concatene à une chaine .Quand l'utilisateur appuie sur ENTREE tu retourne la chaine (ainsi obtenue par concatenation de caractere tapé au clavier par la lecture des touches(utilisation de readkey)),ou QUITTER tu quittes et passes a une autre question.
    ça je ne viens pas de l'ecrire c'etait bien dans mon post précedent. Et crois moi je ne vais pas balancer tout un code juste pour prouver que j'ai raison; le but du forum est d'aider les gens à evoluer en faisant des efforts par eux memes

    En ce qui concerne ton code c'est mieux qu'avant mais plusieurs choses à corriger quand meme
    -Indentation réguliere
    -Utilisation de variable global le moins possible
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    AfficheResultat;
           Delay(800);
           Halt; { <-- Quitter le programme}
    Pourquoi faire suivre un readkey d'un delay pour ensuite quitter le programme ? Un simple booleen peut le faire de façon simple

    Cordialement
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  6. #26
    Membre régulier Avatar de IMPRO
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Points : 94
    Points
    94
    Par défaut
    bon jour ,
    le code de +bsdocuments+ marche bien , d'ailleurs j ai déjà commencé a faire un code de même principe puisque vous m'avez conseillé d'éviter le readln alors j 'ai pu corriger mes fautes dans la partie write(c).... sauf que dans votre code +bsdocuments+ vous avez oublié d'initialiser réponse:=' ' ; .
    mais l'inconvenant de ce code : impossible d'effacer .

  7. #27
    Membre régulier Avatar de IMPRO
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Points : 94
    Points
    94
    Par défaut
    Voilà, normalement c'est réglé pour pour la touche EFFACER :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    function LireReponse:Boolean;
    begin
    IF KeyPressed
        THEN BEGIN
        C:=ReadKey; {
                      ici le ReadKey ne sera pas impose vu que le KeyPressed
                      retourne la valeur TRUE
                    }
           if C=#27
           then begin
           WriteLn('PROGRAMME QUITTE PAR L''UTILISATEUR');
           AfficheResultat;
           Delay(800);
           Halt; { <-- Quitter le programme}
           end
           else if C=#13
                   then begin
                   if (reponse=t[i].reponse)
                      then
                          begin
                               Inc(cpt);
                          end;
                               reponse:='';
                               LireReponse:=True;
                        end
           else if C=#8 then
           begin
             delete(reponse,length(Reponse),1);
             clrscr;
             WriteLn('Questionnaire: ',i,'/20');
             WriteLn(t[i].question);
             write(Reponse);
           end
    else
     begin
            {Afficher le caractere}
           Reponse:=Reponse+C; {concatener avec la chaine Reponse}
           clrscr;
           WriteLn('Questionnaire: ',i,'/20');
           WriteLn(t[i].question);
           write(Reponse);
           LireReponse:=False;
                end
             END
        ELSE LireReponse:=False;
    end;

  8. #28
    Membre régulier Avatar de IMPRO
    Homme Profil pro
    Développeur décisionnel
    Inscrit en
    Août 2007
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur décisionnel

    Informations forums :
    Inscription : Août 2007
    Messages : 111
    Points : 94
    Points
    94
    Par défaut
    bon soir ,
    voila je pense que le sujet est resolu j ai aussi ajouté l affichage du chrono il reste juste de vous dire MERCI pour votre aide
    §naKe.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Entrer la réponse à une question dans un script.
    Par Trebor dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 01/09/2009, 19h38
  2. Gestion des paramètres dans le temps
    Par Terminator dans le forum SQL
    Réponses: 8
    Dernier message: 06/05/2009, 14h34
  3. Comment permuter l'ordre des questions dans un quiz
    Par lex001 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/02/2009, 02h30
  4. Réponses: 1
    Dernier message: 25/05/2008, 17h38
  5. [Vim] et C++ ; Réponses à des questions de Richard
    Par Luc Hermitte dans le forum Autres éditeurs
    Réponses: 13
    Dernier message: 19/01/2004, 23h32

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