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

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 5
    Points
    5
    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
    Points : 2 501
    Points
    2 501
    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
    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
    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
    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. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    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.
    Si les cons volaient, il ferait nuit à midi.

  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
    Points : 2 501
    Points
    2 501
    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 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    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é.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Conseils bien reçus...
    Seulement si vous essayez de le faire tourner vous verrez qu'il plante toujours assez rapidement, chose bizarre !

  8. #8
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par droggo Voir le message
    Fai,

    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é.
    Je pense que c' est un peu difficile à comprendre pour un débutant car il ne voit pas vraiment en quoi ça consomme les ressources. Lui tout ce qu'il voit c' est que ça rend plus élégant le code et ça indique qu'on maitrise la programmation.
    Meme avec l' exemple de la suite de fibonacci, je ne comprenais pas en pourquoi la récursivité doit etre evitée dans certains cas.

    Je pense qu' il faut que le programmeur debutant voit par lui-meme les consequences en apprenant la structure et le fonctionnement de la pile ainsi qu'un langage d' assemblage pour pouvoir comprendre vraiment ce qui se passe.

  9. #9
    Membre averti Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    Points : 379
    Points
    379
    Par défaut
    je ne pense pas que des notions d'assembleur ou de pile (ou meme de heap) soient utiles à la compréhension de où et quand utiliser la récursivité et où et quand c'est lourd.
    Quelques notions de complexité en O et c'est bon
    Certified Oracle Advanced PL/SQL Professional
    Certified Oracle APEX Expert
    Certified Oracle SQL Expert

  10. #10
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par Tux++ Voir le message
    je ne pense pas que des notions d'assembleur ou de pile (ou meme de heap) soient utiles à la compréhension de où et quand utiliser la récursivité et où et quand c'est lourd.
    Quelques notions de complexité en O et c'est bon
    Entre différents algorithmes réalisant une même tâche, quel est le plus rapide et dans quelles conditions ?
    C' est la question à laquelle tu as répondu.

    Mais en utilisant la recursivité on utilise (comme Droggo l' a dit) beaucoup de ressources et il y' a des risque de debordement de la pile. Je pense qu' il est necessaire de savoir ce qui se passe lors de l' empillement des appels d' une fonction utilisant la recursivité.

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Dao,

    Pour la récursivité, les 2 principaux problèmes sont :

    - Utilisation de ressources, mémoire essentiellement, car chaque appel récursif implique l'empilement des paramètres, la réservation locale des éventuelles variables locales...

    - Utilisation de la puissance du processeur, car pour chaque appel récursif, les initialisations locales et les différents tests nécessaires pour savoir quoi faire sont répétés, et ça peut être lourd par rapport au traitement lui-même...

    Mais voilà un sujet en train de partir en troll, alors cessons.
    Si les cons volaient, il ferait nuit à midi.

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    La pile peut déborder, mais on peut en augmenter la taille.
    Et toutes les applications ne sont pas "temps-critique", comme l'animation.
    Quand le critère temps est secondaire, pourquoi avoir des scrupules à "gaspiller" les ressources ?

  13. #13
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kai,

    Citation Envoyé par darrylsite Voir le message
    Lui tout ce qu'il voit c' est que ça rend plus élégant le code et ça indique qu'on maitrise la programmation.
    Je ne vois vraiment pas en quoi le code est plus élégant.

    Au plus, parfois plus court, et toujours un peu plus délicat à comprendre en lecture rapide.

    Et côté maîtrise de la programmation, la récursivité n'est qu'un technique parmi beaucoup d'autres, pas plus difficile à comprendre que bien d'autres.
    S'il suffisait de connaître/maîtriser la récursivité, il y aurait des millions de grands programmeurs.

    Citation Envoyé par Cybberdupont Voir le message
    La pile peut déborder, mais on peut en augmenter la taille.
    Et toutes les applications ne sont pas "temps-critique", comme l'animation.
    Quand le critère temps est secondaire, pourquoi avoir des scrupules à "gaspiller" les ressources ?
    C'est une question de principe, et ça évite aux débutants de prendre l'habitude de faire des fonctions récursives pour tout et pour rien, qui fait qu'ils deviennent quasiment incapables d'écrire simplement les algorithmes "naturels" pour résoudre un problème (un exemple typique est le calcul de factorielle ), il y a déjà eu de nombreux exemples sur ce forum.
    Si les cons volaient, il ferait nuit à midi.

  14. #14
    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
    Points : 2 501
    Points
    2 501
    Par défaut
    Citation Envoyé par droggo Voir le message


    Je ne vois vraiment pas en quoi le code est plus élégant.

    Au plus, parfois plus court, et toujours un peu plus délicat à comprendre en lecture rapide.

    Et côté maîtrise de la programmation, la récursivité n'est qu'un technique parmi beaucoup d'autres, pas plus difficile à comprendre que bien d'autres.
    S'il suffisait de connaître/maîtriser la récursivité, il y aurait des millions de grands programmeurs.
    Le truc c' est qu' on commence toujours par apprendre les boucles for - while- repeat (ou do ... while selon le langage). Puis on introduit un concept nouveau : la recursivité qui, personne ne me dira le contraire, fait vraiment reflechir au tout debut. Une fois qu' on a compris le mecanisme on veut sans doute l' utiliser pourtout, et on a l' impression d' avoir fait un pas de geant en programmation.

    Pour tout debutant (enfin c' est ce que je cherchais), ce qu' il recherche c' est d'ecrire beaucoup en moins de lignes. Et la recursivité apparait ici comme la solution ideale. Et de plus, la recusivité découle souvent de la definition mathematique meme du probleme.

    Si on dit à un enfant que le feu brule, l' enfant pensera qu' on veut lui interdire un jouet interessant. C' est en se brulant qu' il saura que le feu brule vraiment.

  15. #15
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Dai,
    Citation Envoyé par darrylsite Voir le message
    Et la recursivité apparait ici comme la solution ideale. Et de plus, la recusivité découle souvent de la definition mathematique meme du probleme.
    Moi, je dis plutôt l'inverse, il n'est qu'à voir pas mal de sujets du forum.

    Et celui où nous sommes pour l'instant : où est la récursivité dans la définition du problème du calcul d'une puissance ? (on tombe précisément dans le même travers que l'utilisation de la récursivité pour le calcul d'une factorielle, et bien d'autres encore).

    Je ne dis pas que la récursivité est inutile, mais qu'il ne faut pas chercher à en mettre partout, ça conduit à des raisonnements plutôt tordus, bien souvent.

    Et quant à écrire moins de code, c'est parfois vrai, mais pas toujours, surtout quand la récursivité n'est pas "naturelle", c'est à dire qu'elle n'apparaît pas spontanément pour le problème, et n'est donc normalement pas l'implémentation qui devrait venir en premier lieu à l'esprit...
    ... ce qui se produit trop souvent pour ceux à qui on présente la récursivité un peu comme une solution miracle et si élégante qu'il faut obligatoirement s'en servir, sous peine de passer pour un c**.

    C'est contre ça que je gueule.

    La récursivité quand il la faut, oui, mais la récursivité à tort et à travers, non.
    Si les cons volaient, il ferait nuit à midi.

  16. #16
    Membre averti Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    Points : 379
    Points
    379
    Par défaut
    en effet

    surtout que dans les algorithmes plus complexes, la récursivité est souvent à éviter pour ne pas se taper un facteur exponentiel. La programmation dynamique et les algos gloutons sont là pour éviter ça. Mais ce n'est pas le sujet ici
    Certified Oracle Advanced PL/SQL Professional
    Certified Oracle APEX Expert
    Certified Oracle SQL Expert

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Quelque temps après, je compléterais bien par ceci :

    1.Personne ici n'est assez sot pour se croire maître en récursivité, sous prétexte qu'il a commis une petite fonction de trois lignes.
    Maîtrise la récursivité qui a compris les difficiles travaux de Godel.
    2.Inutile de s'énerver (vrai gaspillage d'énergie).Un exemple suffisait, de récursivité naturelle.
    C'eut été plus court, et immédiatement clair.

    Cordialement,

    C.

  18. #18
    Membre averti Avatar de Tux++
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    281
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 281
    Points : 379
    Points
    379
    Par défaut
    1.Personne ici n'est assez sot pour se croire maître en récursivité, sous prétexte qu'il a commis une petite fonction de trois lignes.


    personne n'a dit ici qu'il était maitre de la récursivité, ce qui serait d'ailleurs complètement subjectif.

    2.Inutile de s'énerver (vrai gaspillage d'énergie).Un exemple suffisait, de récursivité naturelle.

    On ne s'énerve pas, on argumente, on débat, c'est le but d'un forum, et encore plus le but d'un forum de développement


    Et enfin on voulait juste dire en long et en large que la récursivité c'est bien, c'est beau quand ça marche mais que parfois elle est superflue, inutile et beaucoup trop lourde comme pour le calcul de factorielle et/ou de fibo
    Certified Oracle Advanced PL/SQL Professional
    Certified Oracle APEX Expert
    Certified Oracle SQL Expert

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Il n'en reste pas moins qu'un exemple de récursivité "ne gaspillant pas les ressources matérielles" serait le bienvenu.

  20. #20
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Fai,
    Citation Envoyé par Cybberdupont Voir le message
    Il n'en reste pas moins qu'un exemple de récursivité "ne gaspillant pas les ressources matérielles" serait le bienvenu.
    Qui a dit que ça existait ?

    Le gaspillage de ressources est littéralement intrinsèque à la récursivité, je pense que ça ressort assez de la discussion.
    Si les cons volaient, il ferait nuit à midi.

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