Addtion deux nombres sous un string

dino34 - 20 nov. 2015 à 18:01
 dino34 - 30 nov. 2015 à 22:15
Bonjour, cs_yanb:

J'ai utilisé un code posté précédemment et merci beaucoup pour le support.


Je cherche à faire l'addition de deux nombre sous le string PDP ( 0&3) ci-dessous l'exemple:



PROC PDP R0P
A 0 OK
3 OK

PROC PDP R0P
B 0 OK
3 OK

PROC PDP R0P
C 0 OK
3 OK








procedure TForm1.Button1Click(Sender: TObject);
var
Src : TStringList;
PDP: TStringList;
Tot : TStringList;
I : Integer;

AdVal : array [0..4] of Integer;

begin
Src := TStringList.Create;
PDP := TStringList.Create;
Tot := TStringList.Create;
try
Tot.Delimiter := ' ';
for I := 0 to 4 do
begin
AdVal[I] := 0;
end;
Src.LoadFromFile('d:\fichier.txt');
for I := 0 to Src.Count - 1 do
begin
if Pos('PDP',Src[I]) <> 0 then begin
PDP.Add(Src[I]);
PDP.Add(Src[I+1]);
Tot.DelimitedText := Src[I+1];

if Tot[1] = '0' then

AdVal[0] := AdVal[0] + StrToInt(Tot[1])+1;

if Tot[1] = '3' then

AdVal[3] := AdVal[3] + StrToInt(Tot[1])+3;

end;
end;
PDP.Add(Format('PDP0=%d'#13#10'PDP3=%d',[AdVal[0],AdVal[3]]));

ShowMessage(Format('PDP0=%d'#13#10'PDP3=%d',[AdVal[0],AdVal[3]]));
finally
Src.Free;
PDP.Free;
Tot.Free;
end;
end;
end.


NB: le code m'affiche seulement la somme des zéros.

merci pour votre aide et suggestion

7 réponses

Salut
var
  Src : TStringList;
  Pdp : TStringList;
  Tot : TStringList;
  I    : Integer;
  Val : array of Integer;
begin
  Src := TStringList.Create;
  Pdp := TStringList.Create;
  Tot := TStringList.Create;
  ZeroMemory(Val, 0);
  SetLength(Val, 2);
  try
    Tot.Delimiter := ' ';
    Src.LoadFromFile('d:\fichier.txt');
    for I := 0 to Src.Count - 1 do
    begin
      if Pos('PDP',Src[I]) <> 0 then
      begin
        Pdp.Add(Src[I]);
        Pdp.Add(Src[I+1]);
        Tot.DelimitedText := Src[I+1];
        if Tot[Tot.Count-2] = '0' then
          Val[0] := Val[0] + StrToIntDef(Tot[Tot.Count-2],0)+1;
        Pdp.Add(Src[I+2]);
        Tot.DelimitedText := Src[I+2];
        if Tot[Tot.Count-2] = '3' then
          Val[1] := Val[1] + StrToIntDef(Tot[Tot.Count-2],0)+3;
      end;
    end;
    Pdp.Add(Format('Nombre Total PDP0 : %d',[Val[0]]));
    Pdp.Add(Format('Nombre Total PDP3 : %d',[Val[1]]));
    Pdp.SaveToFile(ExtractFilePath(Application.ExeName)+'PDP.txt');
    ShowMessage(Format('Nombre Total PDP0 : %d'#13#10'Nombre Total PDP3 : %d',[Val[0],Val[1]]));
  finally
    Src.Free;
    Pdp.Free;
    Tot.Free;
  end;
@+
0
salut cs_yanb:

merci beaucoup pour votre réponse et désolé pour le retard .

le code m'affiche seulement des zéros .

Nombre Total PDP0 =0
Nombre Total PDP3 =0.

je cherche a avoir

Nombre Total PDP0 =3
Nombre Total PDP3 =9.

je cherche aussi a comprendre les trois lignes cité ci-dessous :

ZeroMemory(Val, 0);
SetLength(Val, 2);
Tot[Tot.Count-2].


merci
0
Salut,
moi avec ton fichier texte le code m'affiche
Nombre Total PDP0 =3
Nombre Total PDP3 =18
18 normal dans la boucle tu as mis +3 pour PDP3 donc j'ai repris ce que tu avais fait.
if Tot[Tot.Count-2] = '3' then
  Val[1] := Val[1] + StrToIntDef(Tot[Tot.Count-2],0)+3;
Ici supprime le +3 ou StrToIntDef(Tot[Tot.Count-2],0) sinon on fait 3+3.

ZeroMemory(Val, 0);
SetLength(Val, 2);
Je vide mon tableau Val et je redimensionne en dynamique à 2 mon Val = array[0..1]of integer

Tot[Tot.Count-2]
Ceci pour partir de la fin du tableau car la deuxième ligne est peut-être vide ou un chr...
ligne 1 = A 0 OK
ligne 2 = Vide 3 OK
Tot[0] = A ou vide
Tot[1] = 0 ou 3
Tot[2] = OK
Tot.count = 3 nous on veut la case 1 du tableau...
@+
0
salut cs_yanb:

Merci beaucoup pour l’éclaircissement.

En fait peux être la cause est là, si j'introduis la ligne qui contiens seulement 0 il y a un bug ( list index out of bound 0)


PROC PDP R0P
A 0 OK
3 OK

PROC PDP R0P
B 0 OK
3 OK

PROC PDP R0P
C 0 OK
3 OK

PROC PDP R0P
A 0 OK

PROC PDP R0P
C 0 OK
3 OK




Je ne sais pas pourquoi cette erreur est survenue?
merci .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Salut :

juste un petite addition le code cité ci-dessous marche sans


PROC PDP R0P
0 OK




Pdp.Add(Src[I]);
Pdp.Add(Src[I+1]);
Tot.DelimitedText := Src[I+1];
showmessage(Tot.Text);
if Tot[1] = '0' then
Val[0] := Val[0] + StrToIntDef(Tot[1],0)+1;
Pdp.Add(Src[I+2]);
Tot.DelimitedText := Src[I+2];
showmessage(Tot.Text);
if Tot[0] = '3' then
Val[1] := Val[1] + StrToIntDef(Tot[0],0);


si je rajoute la ligne cité ci-dessous meme à la fin j'aurais ( list index out of bound 0) .



PROC PDP R0P
0 OK




NB : le premier showmessage(Tot.Text);

me donne ceci c'est pour cette raison j'ai mi Tot[1].

A
O
OK

2/ le deuxième showmessage(Tot.Text);
me donne ceci c'est pour cette raison j'ai mi Tot[0].

3
OK

merci pour votre support
0
Salut,
Normal tu essayes de prendre une valeur dans un tableau vide...
Avec ton nouveau fichier PDP0=5 et PDP3=12
var
  Src : TStringList;
  Pdp : TStringList;
  Tot : TStringList;
  I    : Integer;
  Val : array of Integer;
begin
  Src := TStringList.Create;
  Pdp := TStringList.Create;
  Tot := TStringList.Create;
  ZeroMemory(Val, 0);
  SetLength(Val, 2);
  try
    Tot.Delimiter := ' ';
    Src.LoadFromFile('d:\fichier.txt');
    for I := 0 to Src.Count - 1 do
    begin
      if Pos('PDP',Src[I]) <> 0 then
      begin
        Pdp.Add(Src[I]);
        Pdp.Add(Src[I+1]);
        Tot.DelimitedText := Src[I+1];
        if Tot.Count <> 0 then //Si le tableau n'est pas vide 
          if Tot[Tot.Count-2] = '0' then
            Val[0] := Val[0] +1;
        Pdp.Add(Src[I+2]);
        Tot.DelimitedText := Src[I+2];
        if Tot.Count <> 0 then //Si le tableau n'est pas vide         
          if Tot[Tot.Count-2] = '3' then
            Val[1] := Val[1] +3;
      end;
    end;
    Pdp.Add(Format('Nombre Total PDP0 : %d',[Val[0]]));
    Pdp.Add(Format('Nombre Total PDP3 : %d',[Val[1]]));
    Pdp.SaveToFile(ExtractFilePath(Application.ExeName)+'PDP.txt');
    ShowMessage(Format('Nombre Total PDP0 : %d'#13#10'Nombre Total PDP3 : %d',[Val[0],Val[1]]));
  finally
    Src.Free;
    Pdp.Free;
    Tot.Free;
  end;
@+
0
salut yanb:

l'erreur été ici j'ai ajouter la ligne :

if Tot.Count <> 0 then

merci beaucoup ca marche bien .
0
Rejoignez-nous