Je pense qu'il voulait écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while i<iMax do //...
Je pense qu'il voulait écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 while i<iMax do //...
Salut Monsieur Richard,
je crois que Dr.Who a laissé le choix à l'utilisateur pou imax
Bonne chance
Merci.
Oui si tu me prends aux mots et aux valeurs de bornes 'integer'
Juste pour dire qu'on allait faussé le résultat attendu
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 )
Hai,
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.
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)
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.
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.
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;
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.
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.
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 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 :
Que doit faire Cinna à votre avis ?Prends un siège, Cinna, et assieds-toi par terre ;
Et si tu veux parler, commence par te taire !
Cependant je serais curieux de savoir ce qui se passe dans la machine si on essaie d'exécuter ce code :
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.
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.
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.
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 ?").
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager