INSTRREV

Signaler
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
-
Messages postés
52
Date d'inscription
lundi 27 janvier 2003
Statut
Membre
Dernière intervention
24 mars 2017
-
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

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;
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 ...
Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
27
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.
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).
Messages postés
78
Date d'inscription
jeudi 17 février 2005
Statut
Membre
Dernière intervention
26 décembre 2005

merde lol
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?
Messages postés
215
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
1 septembre 2006

Héhé :).
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
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 ++
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 ^^.
Messages postés
455
Date d'inscription
mardi 24 juillet 2001
Statut
Modérateur
Dernière intervention
10 mars 2009

sinon faut utiliser

Repeat
...
Until ...
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
9
lol Mauricio, ce n'est rien :)
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!
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 !
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
9
on peut sortir d'une boucle avec Break...
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)
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 :(
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
Messages postés
1119
Date d'inscription
lundi 4 février 2002
Statut
Membre
Dernière intervention
4 octobre 2006
5
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.