INSTRREV

jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 - 3 mars 2005 à 17:14
jihelb Messages postés 49 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

jihelb Messages postés 49 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 24 mars 2017
7 mars 2005 à 14:06
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;
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
5 mars 2005 à 10:18
mdr delphiprog sur le coup je n'avais pas fait attention ...
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
5 mars 2005 à 09:09
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.
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
4 mars 2005 à 17:06
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).
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
4 mars 2005 à 17:01
merde lol
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
4 mars 2005 à 16:59
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?
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
4 mars 2005 à 16:51
Héhé :).
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
4 mars 2005 à 16:48
d'autre part je ne savais pas que VARIABLE[NumChar] donnais la meme chose qu'un copy
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
4 mars 2005 à 16:36
haaa :) merci jin je me demandais s'il existait quelque chose comme downto merci ++
jinh68 Messages postés 215 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 1 septembre 2006
4 mars 2005 à 15:51
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 ^^.
DelphiCool Messages postés 455 Date d'inscription mardi 24 juillet 2001 Statut Membre Dernière intervention 10 mars 2009
4 mars 2005 à 12:28
sinon faut utiliser

Repeat
...
Until ...
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
3 mars 2005 à 18:02
lol Mauricio, ce n'est rien :)
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
3 mars 2005 à 17:59
et bem voilà, j' ai posté en meme temps que toi ni69!
cs_MAURICIO Messages postés 2106 Date d'inscription mardi 10 décembre 2002 Statut Modérateur Dernière intervention 15 décembre 2014 5
3 mars 2005 à 17:57
Il y a Break les amis !
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
3 mars 2005 à 17:54
on peut sortir d'une boucle avec Break...
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
3 mars 2005 à 17:44
n'y aurais t il pas un moyen de sortir de la boucle proprement dit .... (exit for en VB)
sosodef88 Messages postés 78 Date d'inscription jeudi 17 février 2005 Statut Membre Dernière intervention 26 décembre 2005
3 mars 2005 à 17:42
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
3 mars 2005 à 17:39
je trouve quand meme me ma fonction est plus simple
jmp77 Messages postés 1119 Date d'inscription lundi 4 février 2002 Statut Membre Dernière intervention 4 octobre 2006 7
3 mars 2005 à 17:14
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.
Rejoignez-nous