Nadirbachire
Messages postés5Date d'inscriptionvendredi 19 août 2016StatutMembreDernière intervention25 août 2016
-
19 août 2016 à 18:36
Nadirbachire
Messages postés5Date d'inscriptionvendredi 19 août 2016StatutMembreDernière intervention25 août 2016
-
25 août 2016 à 19:20
Salut
procedure TForm1.Button1Click(Sender: TObject);
var
k,N:integer;
Chaine,SousChaine:string;
begin
N:=0;
Chaine:=('DHDDHTTY AZ DD DH ER DRFG T DHAZA ZYTDH');
SousChaine:=('DH');
for k := 1 to length(Chaine) do
begin
if SousChaine = Copy( Chaine,k,length(SousChaine)) then
inc(N);
end;
Showmessage(inttostr(N));
j'essaye de compter le nombre d'une sous chaine dans une chaine, dans Mon cas c'est
la sous-chaine(DH) dans la Chaine:=('DHDDHTTY AZ DD DH ER DRFG T DHAZA ZYTDH')
Mon code me retourne le nombre 5 ,c'est tout a fait normal.
le problème est comment faire pour ne compter que la sous chaine(DH)indepondante des autres sous-chaines (dans mon exemple ça sera 1 car il 1 seule DH indepondante )
si quelqu'un sait comment faire Merci de m'en faire part
Merci a tous
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 19 août 2016 à 20:15
bonjour,
tout simplement:
SousChaine:=(' DH ');
Nadirbachire
Messages postés5Date d'inscriptionvendredi 19 août 2016StatutMembreDernière intervention25 août 2016 20 août 2016 à 03:00
Merci a toi Cirec
Si la sous chaine se trouvait au début ou a la fin de la chaine le compte sera tjr faux
donc Cette façon de faire avec des espaces ne résout pas le problème
a moins que nous combinons les 3 positions , mais moi je cherchais plus simple
La solution que j'ai trouvé est la suivante
procedure TForm1.Button1Click(Sender: TObject);
var
Nsc2,i:integer;
Chaine,Sc,liste:string;
TmpChaine:TStringlist;
begin
Nsc2:=0;
Chaine:=('DHDDHTTY AZ DD DHER DRFG T DH AZA ZYTDH');
TmpChaine:=TStringlist.Create;
liste := StringReplace(Chaine,' ',#13#10, [rfReplaceAll, rfIgnoreCase]);
TmpChaine.Text:=liste;
for i := 0 to TmpChaine.Count -1 do
if MatchStr('DH', [TmpChaine.Strings[i]])then
inc(Nsc2);
showmessage(inttostr(Nsc2));
TmpChaine.Free;
end;
Merci encore
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917
>
Nadirbachire
Messages postés5Date d'inscriptionvendredi 19 août 2016StatutMembreDernière intervention25 août 2016 20 août 2016 à 14:28
Salut,
et Bravo...
L'utilisation de MatchStr (AnsiMatchStr sous D7) est astucieuse.
Joli code !
Nadirbachire
Messages postés5Date d'inscriptionvendredi 19 août 2016StatutMembreDernière intervention25 août 2016
>
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 2019 20 août 2016 à 16:22
Merci Korgis
korgis
Messages postés420Date d'inscriptionsamedi 17 mai 2003StatutMembreDernière intervention 6 mai 201917
>
Nadirbachire
Messages postés5Date d'inscriptionvendredi 19 août 2016StatutMembreDernière intervention25 août 2016 21 août 2016 à 17:02
Salut Nadirbachire,
En fait, je m'aperçois que l'utilisation de MatchStr est inutile : une comparaison directe entre 'DH' et TmpChaine.Strings[i]] est suffisante :
for i := 0 to TmpChaine.Count - 1 do
if TmpChaine.Strings[i] = 'DH' then
Inc(Nsc2);
Ce qui est astucieux néanmoins est l'idée d'avoir remplacé les espaces vides par "#13#10" dans la chaîne pour créer facilement la StringList.
Nadirbachire
Messages postés5Date d'inscriptionvendredi 19 août 2016StatutMembreDernière intervention25 août 2016 25 août 2016 à 19:20
Salut
quelqu'un d'autre a trouvé mieux
pour info la classe TStringList possède deux propriétés (Delimiter et DelimitedText) qui te permet directement de donner ta chaîne sans avoir besoin de passer par un string replace.
20 août 2016 à 03:00
Si la sous chaine se trouvait au début ou a la fin de la chaine le compte sera tjr faux
donc Cette façon de faire avec des espaces ne résout pas le problème
a moins que nous combinons les 3 positions , mais moi je cherchais plus simple
La solution que j'ai trouvé est la suivante
procedure TForm1.Button1Click(Sender: TObject);
var
Nsc2,i:integer;
Chaine,Sc,liste:string;
TmpChaine:TStringlist;
begin
Nsc2:=0;
Chaine:=('DHDDHTTY AZ DD DHER DRFG T DH AZA ZYTDH');
TmpChaine:=TStringlist.Create;
liste := StringReplace(Chaine,' ',#13#10, [rfReplaceAll, rfIgnoreCase]);
TmpChaine.Text:=liste;
for i := 0 to TmpChaine.Count -1 do
if MatchStr('DH', [TmpChaine.Strings[i]])then
inc(Nsc2);
showmessage(inttostr(Nsc2));
TmpChaine.Free;
end;
Merci encore
20 août 2016 à 14:28
et Bravo...
L'utilisation de MatchStr (AnsiMatchStr sous D7) est astucieuse.
Joli code !
20 août 2016 à 16:22
21 août 2016 à 17:02
En fait, je m'aperçois que l'utilisation de MatchStr est inutile : une comparaison directe entre 'DH' et TmpChaine.Strings[i]] est suffisante :
Ce qui est astucieux néanmoins est l'idée d'avoir remplacé les espaces vides par "#13#10" dans la chaîne pour créer facilement la StringList.
Je maintiens donc mon "Bravo" ! ;-)