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 :

Utiliser une boucle for avec un pas de 2


Sujet :

Langage Pascal

  1. #21
    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 richard Voir le message
    Bonjour,

    j'ai suivi un peu trop distraitement ce fil mais je m'interroge depuis un moment sur cette boucle là. Avec une question qui me taraude : quelle valeur doit donc prendre iMax pour faire fonctionner correctement la boucle ? Ca m'angoisse ...
    Je pense qu'il voulait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while i<iMax do
     //...

  2. #22
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    529
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 529
    Points : 464
    Points
    464
    Par défaut
    Salut Monsieur Richard,
    je crois que Dr.Who a laissé le choix à l'utilisateur pou imax
    Bonne chance
    Merci.
    Deux, n'apprendront pas; le timide et l'arrogant

  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
    Citation Envoyé par hocine Voir le message
    Salut Monsieur Richard,
    je crois que Dr.Who a laissé le choix à l'utilisateur pou imax
    Bonne chance
    Merci.
    ça je crois que tout le monde avait compris que la valeur de iMax est à choisir

    Mais je crois surtout et ce qui angoisse richard qu'on va tomber dans une boucle infinie si on ne prend pas en compte la proposition de darrylsite écrite juste au dessus !!!
    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
    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
    Gia,
    Citation Envoyé par krachik Voir le message
    ça je crois que tout le monde avait compris que la valeur de iMax est à choisir

    Mais je crois surtout et ce qui angoisse richard qu'on va tomber dans une boucle infinie si on ne prend pas en compte la proposition de darrylsite écrite juste au dessus !!!
    avec i de type integer, elle ne serait pas infinie.
    Si les cons volaient, il ferait nuit à midi.

  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
    Oui si tu me prends aux mots et aux valeurs de bornes 'integer'

    Juste pour dire qu'on allait faussé le résultat attendu
    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 éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Citation Envoyé par darrylsite Voir le message
    Je pense qu'il voulait écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    while i<iMax do
     //...
    En fait, c'est ce que je pensais aussi ...
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  7. #27
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Citation Envoyé par droggo Voir le message
    Gia,

    avec i de type integer, elle ne serait pas infinie.
    Oui-da, mais dans ce cas elle se sera jamais exécutée car la condition ne peut pas être vérifiée puisque 0 est le plus petit entier existant à ma connaissance, cette boucle est donc inutile ... Le choix entre une boucle infinie ou une boucle jamais exécutée est angoissant, non ?

    ( M'enfin c'était juste une erreur de '<' au lieu de '>' , tout le monde avait compris, simplement c'est ce type d'erreur qui peut planter tout un programme )
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  8. #28
    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
    Hai,
    Citation Envoyé par richard Voir le message
    Oui-da, mais dans ce cas elle se sera jamais exécutée car la condition ne peut pas être vérifiée puisque 0 est le plus petit entier existant à ma connaissance, cette boucle est donc inutile ... Le choix entre une boucle infinie ou une boucle jamais exécutée est angoissant, non ?
    Sauf que les entiers relatifs existent (les valeurs négatives), parfaitement pris en compte par le type Integer (encore heureux, non ?).

    Et quand l'incrémentation de la variable atteindra le maximum possible pour les valeurs positives, le débordement lors du calcul renverra une valeur négative.
    Et paf, la boucle s'arrêtera, car la condition deviendra vraie.
    Si les cons volaient, il ferait nuit à midi.

  9. #29
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Citation Envoyé par droggo Voir le message
    Hai,

    Sauf que les entiers relatifs existent (les valeurs négatives), parfaitement pris en compte par le type Integer (encore heureux, non ?).
    Tu as raison sur ce point, j'avais pris le mot "entier" au sens mathématique et non pas dans le sens de "Integer" (je n'appelle jamais un "Integer" un "entier" pour cette raison d'ailleurs)

    Citation Envoyé par droggo Voir le message
    Et quand l'incrémentation de la variable atteindra le maximum possible pour les valeurs positives, le débordement lors du calcul renverra une valeur négative.
    Et paf, la boucle s'arrêtera, car la condition deviendra vraie.
    Ca c'est intéressant. Nous n'avons pas lu le même code ou alors j'ai vraiment du mou dans la corde à noeud. Pour moi ce que tu dis tiens quasiment du miracle puisque c'est I qui est incrémenté et que I part de 0.

    Mais je bute peut-être sur une de mes lacunes fondamentales ?
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  10. #30
    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 richard Voir le message
    Ca c'est intéressant. Nous n'avons pas lu le même code ou alors j'ai vraiment du mou dans la corde à noeud. Pour moi ce que tu dis tiens quasiment du miracle puisque c'est I qui est incrémenté et que I part de 0.

    Mais je bute peut-être sur une de mes lacunes fondamentales ?
    C'est bien ça!

    i commence à 0 et croit jusqu'à ce que i soit inférieur à iMax.
    Alors si nous admettons que nous initialisons iMax à -1, mathématiquement i ne pourra pas être inférieur à iMax puisque sa valeur croit à partir de 0 :
    i E [0; +infini[
    Mais vu les limitations sur les types de données Integer, si je suppose par exemple que les entiers sont représentés sur 16 bit en compléments à 2, le domaine de variation de i sera :
    i E [0; +32767[ U [-32768; 0[

    On voit donc bien que i prendra des valeurs négatives inférieures à iMax.

    Mais si au départ la valeur de iMax est supérieure à 0, alors la boucle ne s'exécutera pas. Je suppose que c'est ce que tu disais.

  11. #31
    Membre éclairé
    Avatar de richard
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2002
    Messages : 474
    Points : 772
    Points
    772
    Par défaut
    Juste. J'avais oublié qu'arrivé à la fin des entiers positifs, I prenait une valeur négative.
    C'est pour moi un effet de bord qui ne correspond pas du tout à l'algorithme mais effectivement, dans la pratique, c'est toi [EDIT <et Droggo>] qui a raison et donc moi qui ai tort.


    Merci pour ce rafraîchissement de mémoire, en tout cas.
    "Software is getting slower more rapidly than hardware becomes faster." Niklaus Wirth
    https://pharo.org/web
    https://faust.grame.fr/

  12. #32
    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 richard Voir le message
    Juste. J'avais oublié qu'arrivé à la fin des entiers positifs, I prenait une valeur négative.
    C'est pour moi un effet de bord qui ne correspond pas du tout à l'algorithme mais effectivement, dans la pratique, c'est toi [EDIT <et Droggo>] qui a raison et donc moi qui ai tort.


    Merci pour ce rafraîchissement de mémoire, en tout cas.
    Tu n'avais pas tord non plus. On détient tous une partie de la vérité

  13. #33
    Nouveau Candidat au Club
    Homme Profil pro
    Analyste développeur
    Inscrit en
    Décembre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Analyste développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    en essayant ça ? ( même 12 mois après je veux essayer )


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i:= 0 to imax do
    begin
      if (NOT odd(i) ) then
       /*Code*/
    end;

  14. #34
    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
    Qua,

    Pourquoi toujours tenir à compliquer le code ?

    Le problème est résolu depuis longtemps, en Pascal, c'est du domaine d'une boucle while (ou repeat .. until, si, si ).

    Avec ton code, ta boucle vas faire 2 fois de tours que nécessaire, ce simple fait montre que ce n'est pas adapté.
    Si les cons volaient, il ferait nuit à midi.

  15. #35
    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
    Qua,

    Pourquoi toujours tenir à compliquer le code ?

    Le problème est résolu depuis longtemps, en Pascal, c'est du domaine d'une boucle while (ou repeat .. until, si, si ).

    Avec ton code, ta boucle vas faire 2 fois de tours que nécessaire, ce simple fait montre que ce n'est pas adapté.
    +1

    En management on parle souvent d'efficience et d'efficacité.

    Le code que propose minifux peu être considéré comme efficace en ce sens qu'il résout le problème posé. Mais non efficient puisqu'il utilise plus de moyen que nécessaire.

    La solution avec une boucle while est plutôt efficient, et là la meilleur solution.

  16. #36
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Mars 2012
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Il y a beaucoup de solutions, dont celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    program pas;
    var i: integer;
    Begin
      writeln('Pas de deux');
      For i:= 1 to 15 do
        Begin
          writeln(i);
          i:=i+1;
        End;
      readln;
    End.

  17. #37
    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
    Hoe,

    C'était envisageable, mais c'est du code très sale, car modification du compteur de boucle dans la boucle, ce qu'on n'est pas censé faire en Pascal.
    D'ailleurs, les compilateurs plus récents doivent l'interdire.

    Et une fois de plus, pourquoi insister, ce sujet est résolu depuis longtemps ! Et en plus avec un code crade ...
    Si les cons volaient, il ferait nuit à midi.

  18. #38
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par droggo Voir le message
    C'était envisageable, mais
    Si je puis me permettre, moi je ne trouve même pas ça "envisageable". L'instruction donnée à la machine est inintelligible.

    Ça me rappelle ces vers :

    Prends un siège, Cinna, et assieds-toi par terre ;
    Et si tu veux parler, commence par te taire !
    Que doit faire Cinna à votre avis ?


    Cependant je serais curieux de savoir ce qui se passe dans la machine si on essaie d'exécuter ce code :

    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
     
    program test;
     
    uses crt;
     
    var i: integer;
     
    begin
     
      for i:=1 to 9 do
     
        begin
     
          writeln(i); readkey;
     
          i:=i+1;
     
          writeln(i); readkey;
     
        end;
     
    end.
    Je l'ai testé avec trois compilateurs différents. Cela donne trois résultats différents, ce qui n'est pas étonnant vu l'ambiguïté du code.

    1° Turbo-Pascal

    i croît indéfiniment, sans s'arrêter à la limite indiquée.

    2° Virtual-Pascal

    Le programme donne le résultat espéré : à 10 il s'arrête.

    3° Free-Pascal

    La compilation est refusée. Un message explique qu'il est "illégal" de changer la valeur de i.


    Les bons exemples ont tous été donnés dans la première page.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  19. #39
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    Excellent

  20. #40
    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
    Qui,

    Par "envisageable", je voulais dire que TP aurait accepter ce code, je ne dis pas que le programmeur aurait dû envisager de le faire.

    C'était un des bugs de TP, dans lequel ils sont nombreux à être tombés, et aussi nombreux à en avoir perdu le peu de Pascal qu'ils avaient ("peu de Pascal", car un programmeur connaissant vraiment Pascal ne devrait même pas se poser la question "Puis-je faire ça ?").
    Si les cons volaient, il ferait nuit à midi.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 17/07/2013, 10h06
  2. [Débutant] utiliser une boucle for avec la fonction wavread()
    Par alimo44 dans le forum Signal
    Réponses: 1
    Dernier message: 21/06/2010, 08h08
  3. utiliser une boucle 'for' in JAsperReport
    Par Javix dans le forum Jasper
    Réponses: 6
    Dernier message: 13/12/2007, 10h05
  4. [Tableaux] Utiliser une boucle for dans un echo
    Par maoboy dans le forum Langage
    Réponses: 7
    Dernier message: 18/06/2007, 13h55
  5. Réponses: 2
    Dernier message: 28/08/2006, 18h17

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