Bonjour,
Y a t il un moyen en Delphi de faire une boucle for avec un incrément de pas de 3.
Je sait le faire en PHP mais en delphi...
Merci d'avance,
Laurent
Bonjour,
Y a t il un moyen en Delphi de faire une boucle for avec un incrément de pas de 3.
Je sait le faire en PHP mais en delphi...
Merci d'avance,
Laurent
Soit écrire un While
Soit faire "iReel := iFor * 3"
Soit il faut te faire soigner, si tu tente
Moi aussi, j'étais habitué au langage des calculatrices HP, et tu pouvais fixer le STEP, cela m'a aussi étonné que l'on ne puisse pas le faire en Delphi, mais en 10 ans, je m'y suis fait
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 procedure ForDeMalade(); var I: Integer; begin for I := 0 to 9+2 do // 9 la limite voulu, +2 pour la tricherie begin ShowMessage(IntToStr(I)); // Inc(I); asm INC EBX; INC EBX; end; end; end;![]()
les jeunes
Cela ne vient pas des HP mais du basic
car il n'existait pas de while ou repeat alors le For etait muscle
I y a Fullspeed qui me souffle a l'oreille
Toujours préférer le repeat à un for ou un while (quand c'est possioble)
(et cela l'est toujours)
SAUF avec Delphi car seules les boucles For sont optimis"es
(les petits malins verront que D6 les remplace par des repeat;:
Shai: c'est très vilain de faire comme tu le dis. Je suis sup que c'est un programmeur C++ qui te l'as appris
Boris
Moi aussi je trouve que le mieux c'est de multiplier par 3 (par ex. si tu voulais faire "step 3"):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 for i := 0 to 4 do begin j := i * 3; // et là tu as plus qu'à utiliser j... qui vaudra 0,3,6,9 et enfin 12 (pour i = 0,1,2,3,4) ... end;
Merci à tous.
C'est ok avec la dernière solution.
Laurent
Je n'ai pas Delphi sous la main, mais si mes souvenirs sont bons, il est possible de spécifier directement le pas d'incrément :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 for i:=0 to 100 step 3 do begin // end;
C'est exactement se que l'optimiseur fait lorsqu'il inverse les boucles
il creer un nouvel indice different de I
Boris
Bonjour.
Moi aussi je voulais lire un fichier texte "pas à pas" par saut de 3 donc.. Après réflexion j'ai écris cela et.. ça marchepuisque (cerveau tordu !!) si on divise le "pas" par 3 et s'il n'y a pas de partie décimale, on est sur un multiple de 3
!!!
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 function decoupe(chaine:string); var i:integer; m,n:real; Longueur: Integer; begin Longueur := Length(chaine); i:=0; while i<longueur+1 do begin m:=i / 3; n:=round(i / 3); if m-n=0 then begin // Multiple de 3 end; i:=i+1; end; end;
La réponse de chatgpt :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 program BoucleForStepModulo; var i: integer; begin // Boucle de 1 à 100 par pas de 3 for i := 1 to 100 do begin // Vérifie si i est divisible par 3 en utilisant le modulo if (i mod 3 = 0) then writeln(i); end; end.
Et si tu faisais juste i := i +3
ps: comparer des réels sans epsilon est voué à l'échec.
Tu devrais créer un nouveau sujet sur l'objectif réel de ta fonction decoupe, on pourrait réfléchir peut-être à un algo plus adapté (surtout que ce sujet est déjà marqué comme résolu)
on peut aussi écrire Inc(i, 3); qui aurait ma préférence dans une boucle, cette syntaxe attire l'œil plus qu'un i := i + 3;
comment gères-tu le cas du reliquat ?
Tu commences à zéro, pour une chaine ? tu n'utilise que des fonctions zero-based par la suite ?
Tu arrives à la fin, la longueur de la chaine (soit le dernier élément) n'est pas un multiple de 3, tu dois penser à ne traiter que les caractères restants sans dépasser.
il semble plus prudent d'écrire un while, permettant plus de liberté que contourner le for ! non ?
Pourquoi écrire des divisions ou du modulo, opération lente lorsque l'on peut travailler avec de simple addition ?
la réponse de ChapGPT est loin du compte, une boucle à itération statique au lieu d'une longueur de chaine, c'est bien cet outil, cela va créer une nouvelle génération de développeur encore plus débile que celle qui ne connait pas la touche F1, le fossé entre les bons développeurs et la grande majorité constituée des développeurs moyens voire médiocres ne va que se creuser. Déjà que beaucoup ne savent pas faire une recherche Google qui solutionne 99% des problèmes selon mon expérience, il n'y aura même plus d'effort à fournir vers le beau métier de Prompt Engineer
le temps avec mod c'est 3 fois plus lent sur la boucle nue, c'est affligeant !
Cependant, le temps de boucle peut sembler négligeable lorsque l'on manipule des chaines, l'écart se réduit à 20% de plus avec mod
SRMod et SRInc montre le reliquat non traité dans la boucle à éventuellement prendre en compte
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
92 var I, RMod, RInc: Integer; K, KMod, KInc: Int64; TickStart, TickEnd, TickPerSec: Int64; TimeMod, TimeInc: Double; S, SRMod, SRInc: string; begin QueryPerformanceFrequency(TickPerSec); SetLength(S, 10000); for I := 1 to Length(S) do S[I] := Chr(Ord('0') + (I mod 10)); QueryPerformanceCounter(TickStart); KMod := 0; // stupide de commencer à 1 avec (i mod 3 = 0) puisque cela est True qu'à partir de 3 ! for I := 3 to Length(S) do begin // Vérifie si i est divisible par 3 en utilisant le modulo if (I mod 3 = 0) then Inc(KMod); end; QueryPerformanceCounter(TickEnd); TimeMod := (TickEnd - TickStart) / TickPerSec * MSecsPerSec; QueryPerformanceCounter(TickStart); KInc := 0; I := 3; // On commence avec un multiple de 3, soit 0 soit 3 selon le besoin while I <= Length(S) do begin inc(KInc); Inc(I, 3); end; QueryPerformanceCounter(TickEnd); TimeInc := (TickEnd - TickStart) / TickPerSec * MSecsPerSec; ShowMessage(KMod.ToString() + ' -> ' + TimeMod.ToString() + sLineBreak + KInc.ToString() + ' -> ' + TimeInc.ToString() + sLineBreak + (TimeMod / TimeInc).ToString()); QueryPerformanceCounter(TickStart); KMod := 0; RMod := 3; // stupide de commencer à 1 avec (i mod 3 = 0) puisque cela est True qu'à partir de 3 ! for i := 3 to Length(S) do begin // Vérifie si i est divisible par 3 en utilisant le modulo if (i mod 3 = 0) then begin K := Copy(S, I - 2, 3).ToInteger(); Inc(KMod, K); RMod := I; end; end; if RMod <= Length(S) then SRMod := Copy(S, RMod, Length(S) - RMod + 1); QueryPerformanceCounter(TickEnd); TimeMod := (TickEnd - TickStart) / TickPerSec * MSecsPerSec; QueryPerformanceCounter(TickStart); KInc := 0; I := 3; // On commence avec un multiple de 3, soit 0 soit 3 selon le besoin RInc := I; while I <= Length(S) do begin // Vérifie si i est divisible par 3 en utilisant le modulo K := Copy(S, I - 2, 3).ToInteger(); Inc(KInc, K); RInc := I; Inc(I, 3); end; if RInc <= Length(S) then SRInc := Copy(S, RInc, Length(S) - RInc + 1); QueryPerformanceCounter(TickEnd); TimeInc := (TickEnd - TickStart) / TickPerSec * MSecsPerSec; ShowMessage(KMod.ToString() + ' -> ' + TimeMod.ToString() + ' + ' + SRMod + sLineBreak + KInc.ToString() + ' -> ' + TimeInc.ToString() + ' + ' + SRInc + sLineBreak + (TimeMod / TimeInc).ToString()); end;
ChapGPT répond correctement dans 70% des cas selon mon expérience et aussi si tu lui pose la bonne question ... La partie résiduelle n'est pas traitée ici mais peut l’être aisément
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 program BoucleForStepModulo; var i: integer; .../... begin for i := 1 to Length(chaine) do begin // Vérifie si i est divisible par 3 en utilisant le modulo if (i mod 3 = 0) then begin // Multiple de 3 end; end; end.
Bonjour
algorithmiquement parlant
la boucle for et while sont identique
le for n'est qu'une spécialisation du while
qui dit spécialisation dit aussi optimisation
il y a une multitude de choix mais les principeaux sont donc
L'autre solution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 i:=0 ; While i < Value do Begin // j:= i DIV 3 // Ici je fais ce que j'ai à faire Inc(i,3) ;//3;6;9;... End;
A toi de voir ce que tu préfère comme syntaxe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 i:=0 ; MaxVal := (Value Div 3); For j := 0 to MaxVal Do Begin I:= J*3;//0;3;6;9;.... // Ici je fais ce que j'ai à faire // Inc(i,3) ;//3;6;9;... End;
le "repeat until" est un peu diffèrent
il passe au moins une fois dans la boucle
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