INSTRREV

Messages postés
1232
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
- - Dernière réponse : jihelb
Messages postés
52
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
24 mars 2017
- 7 mars 2005 à 14:06
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/29890-instrrev

Afficher la suite 
jmp77
Messages postés
1232
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
4 -
Hello,

Alors je ne trouve pas très élégant de programmer en mettant des exit dans les boucle for. On se croirait revenu au temps de la prehistoire informatique lol.

Tiens voici deux fonctions (vite faites) parmi tant d'autres pour faire cela :

function SearchChr(Chr : Char; S : String) : Integer;

var
P0 : Integer;

begin
Result := 0;
P0 := Pos(Chr,S);

While (P0>0) do
begin
Result := Result + P0;
P0 := Pos(Chr,Copy(S,Result+1,Length(S)-P0));
end;
end;

function SearchChr2(Chr : Char; S : String) : Integer;

var
I : Integer;

begin
Result := 0;
I := Length(S);

While (Result = 0) and (I > 0) do
begin

If (Chr = S[I]) then Result := I;

Dec(I);
end;
end;

Voila c'est tout.

Bonne prog,
JMP77.
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
je trouve quand meme me ma fonction est plus simple
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
en fait j'utilise jamais les while c'est pour ca .... jsé pa pk mais j'aime pas ca :(
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
n'y aurais t il pas un moyen de sortir de la boucle proprement dit .... (exit for en VB)
ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
7 -
on peut sortir d'une boucle avec Break...
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
Il y a Break les amis !
cs_MAURICIO
Messages postés
2233
Date d'inscription
mardi 10 décembre 2002
Statut
Modérateur
Dernière intervention
15 décembre 2014
5 -
et bem voilà, j' ai posté en meme temps que toi ni69!
ni69
Messages postés
1529
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
7 -
lol Mauricio, ce n'est rien :)
DelphiCool
Messages postés
462
Date d'inscription
mardi 24 juillet 2001
Statut
Modérateur
Dernière intervention
10 mars 2009
-
sinon faut utiliser

Repeat
...
Until ...
jinh68
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
-
function searchLastChar(src: string; s: char): integer;
begin
for i:= length(src) -1 downto 0 do
if src[i] = s then
break;
result := i;
end;


Y'a ça aussi ^^.
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
haaa :) merci jin je me demandais s'il existait quelque chose comme downto merci ++
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
d'autre part je ne savais pas que VARIABLE[NumChar] donnais la meme chose qu'un copy
jinh68
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
-
Héhé :).
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
ta quand meme fait une erreur jin paske 'alala', 'a' donnera 3 du fait ke c'est le premier en partant de la fin et ca fé break directement donc je dirait :

function TForm1.InstrRev(Src:string; s: Char): integer;
var B:integer;
begin
result := -1;
if length(src) = 0 then exit;
if length(s) = 0 then exit;

for B:= length(src) downto 0 do
if src[B] = s then
break;
result := B;
end;


C'est OK?
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
merde lol
jinh68
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006
-
Non deja c'est

for B := Length(Src) downto 1,oui j'ai merdé, les strings sont indexés à 1 ;).

Dans le cas ou le caractere n'est pas la ca donnera 0 du coup.

Juste une petite remarque sur ton source.Ne repete pas length(src) plusieurs fois,stocke le au début,sinon ca réévalue à chaque fois(pas avc les optimisations de Delphi mais bon).
cs_Delphiprog
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24 -
if length(s) = 0 then exit;

Voilà un test bien inutile puisque S est du type Char et que le type Char a une longueur de 1, quelque soit son contenu.
sosodef88
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005
-
mdr delphiprog sur le coup je n'avais pas fait attention ...
jihelb
Messages postés
52
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
24 mars 2017
-
Le 1er test est également inutile car il est fait par le 1er test de boucle.
De plus, si le résultat doit être -1 lorsque le car. n'est pas trouvé il est préférable de faire:

function InstrRev(Src:string; s: Char): integer;
var B:integer;
begin
result := -1;//pour pas trouvé
for B:= length(src) downto 1 do
if src[B] = s
then begin
result := B;//rang changé avant la sortie de boucle
break;
end;
end;

ou bien pour éviter une attribution inutile:

function InstrRev(Src:string; s: Char): integer;
var B:integer;
begin
for B:= length(src) downto 1 do
if src[B] = s
then begin
result := B;//rang changé avant la sortie de boucle
EXIT;//trouvé, on sort de la function
end;
//on arrive ici seulement si car. pas trouvé ou src vide
result := -1
end;