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 :

Arrêter une boucle (while) en cours d'exécution


Sujet :

Langage Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Par défaut Arrêter une boucle (while) en cours d'exécution
    Bonjour à tous,

    Je joins un petit code censé simuler un arc électrique.
    Le problème est qu'il plante souvent si l'on maintient une touche.
    Je suppose que le coupable est "randomize".
    Si vous pouviez m'en dire plus...
    Merci.
    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
     
    program Decharge_electrique;
    uses crt,graph;
     
    const c=180/pi;
          dl=3;
          eps=5;
     
    Function Atn(x:real):real;
    Var ordre:integer; S,c:real;
    Begin
      ordre:=21; {Imp‚rativement impair}
      c:=x*x;
      S:=1/ordre;
      While ordre>1 do Begin
        ordre:=ordre-2;
        S:=-c*S+1/ordre;
      end;
      Atn:=x*S;
    end;
     
    Function Arctan(x:real):real;
    Var y:real;
    begin
      If abs(x)<1 then arctan:=atn(x)
        else if x>0 then begin
          y:=(x-1)/(x+1);
          Arctan:=pi/4+Atn(y);
        end
          else begin
            y:=(-x-1)/(-x+1);
            Arctan:=-pi/4-Atn(y);
          end;
    end;
     
    Function Puissance(x:real;n:integer):real;
    Begin
      If n=0 then Puissance:=1
        else if odd(n) then Puissance:=x*Puissance(x,n-1)
          else Puissance:=sqr(Puissance(x,n div 2));
    end;
     
    var ch:char;
         x1,y1,x2,y2,x,y,gd,gm,x01,x02,y01,y02:integer;
         distance,angle:real;
    begin
      gd:=detect;
      initgraph(gd,gm,'c');
     
      randomize;
      x01:=5+random(50);y01:=random(479);
      x02:=639-x01;y02:=random(479);
      line(x01,y01,x01,y01);line(x02,y02,x02,y02);
      while not (ch='s') do begin
       x1:=x01;y1:=y01;
       x2:=x02;y2:=y02;
       randomize;
       distance:=sqrt(abs(x2-x1)+abs(y2-y1));
       while distance>eps do
         begin
           if x1=x2 then exit;
           angle:=round(arctan((y2-y1)/(x2-x1))*c)+random(220)-90;
           x:=x1+round(dl*cos(angle/c));
           y:=y1+round(dl*sin(angle/c));
           line(x1,y1,x,y);
           x1:=x;
           y1:=y;
           distance:=sqrt(abs(x2-x1)+abs(y2-y1));
         end;
       ch:=readkey;
      end;
     
      closegraph;
    end.
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Je crois plutot que le probleme vient du fait que tu as mis un "exit" dans la boucle while située dans le programme principal ce qui provoque l' arret du programme.
    Tu devrais plutot mettre "break" qui sert à arreter une boucle. Consulte l' aide pour plus de detail sur les fonction :exit - break - halt.

  3. #3
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Bonjour
    je rajoute à ce que darrylsite a déja dit qu'il faut faire une indentation régulière de ton code.En plus dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while not (ch='s') do begin
    avant cette boucle ta variable ch n'est pas initialisé

    Cordialement

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Jai,

    A quoi j'ajoute que Randomize s'utilise une fois et une seule dans le programme, le plus souvent au début du programme principal.

    Et jamais dans une boucle.

    Et petit leitmotiv au passage : pourquoi une fonction récursive pour Puissance ?
    On est typiquement dans un cas où c'est inutile, et donc nuisible.

  5. #5
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Par défaut
    Citation Envoyé par droggo Voir le message
    Et petit leitmotiv au passage : pourquoi une fonction récursive pour Puissance ?
    On est typiquement dans un cas où c'est inutile, et donc nuisible.
    Je vois que tu detestes toujours la reccursivité

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Fai,
    Citation Envoyé par darrylsite Voir le message
    Je vois que tu detestes toujours la reccursivité
    Je ne déteste pas la récursivité, mais il est inutile de l'utiliser là où elle ne se présente pas de manière "naturelle", ce qui est le cas pour cette fonction Puissance ?

    Pourquoi inutile ?

    Parce que ça consomme des ressources et de la puissance de calcul pour rien, sans pour autant améliorer la lisibilité du code, bien au contraire, pour la majorité.

Discussions similaires

  1. Réponses: 13
    Dernier message: 03/03/2015, 11h52
  2. Réinitialiser une boucle for en cours d'exécution
    Par torquemada dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 18/06/2014, 10h16
  3. Poursuivre l'exécution d'une boucle while()
    Par Hobbèse dans le forum Débuter
    Réponses: 14
    Dernier message: 01/02/2014, 00h31
  4. Arrêter une boucle while
    Par nanou2183 dans le forum Macro
    Réponses: 2
    Dernier message: 02/03/2012, 12h01
  5. Afficher un waitbar pendant l'exécution d'une boucle while
    Par LMU2S dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 18/03/2008, 19h22

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