procedure Tform1.cySpeedButton2Click(Sender: TObject); function Recherche_Sequence_la_plus_petite(Fuite: String; MaxSequence: Integer): String; var EtudierSequence: String; LengthResult, lengthEtudierSequence: Integer; i, s: Integer; // Cette sous-fonction vérifie que EtudierSequence se répète dans la fuite :) function SequenceValide: Boolean; var posSequence: Integer; Reste_a_analyser: String; PosOk: Boolean; begin Reste_a_analyser := fuite; // Recherche de la 1ere occurence de la séquence: posSequence := pos(EtudierSequence, Reste_a_analyser); PosOk := posSequence <> 0; while posOk do begin Delete(Reste_a_analyser, posSequence, lengthEtudierSequence); posSequence := pos(EtudierSequence, Reste_a_analyser); posOk :posSequence 1; end; Result := length(Reste_a_analyser) < lengthEtudierSequence; // La séquence s' est bien répétée jusqu' à la fin ... end; begin Result := ''; LengthResult := 0; for i := 1 to length(Fuite) do for s:= 1 to MaxSequence do begin EtudierSequence := Copy(Fuite, i, s); lengthEtudierSequence := length(EtudierSequence); if (LengthResult = 0) or (lengthEtudierSequence < LengthResult) // ne sera pas plus petite ... then if SequenceValide then begin Result := EtudierSequence; LengthResult := lengthEtudierSequence; end; end; end; var fuga: String; begin fuga := '_0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________'; cySpeedButton2.Caption := Recherche_Sequence_la_plus_petite(Fuga, length(fuga)); if (cySpeedButton2.Caption Fuga) or (cySpeedButton2.Caption '') then ShowMessage('Pas de séquence trouvée!'); end;
fuga := '_0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00___0___________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00___0___________________________________';
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionprocedure Tform1.cySpeedButton2Click(Sender: TObject); function Recherche_Sequence_la_plus_petite(Fuite: String; MaxSequence: Integer): String; var EtudierSequence: String; LengthFuite, LengthResult, lengthEtudierSequence: Integer; i, s: Integer; // Cette sous-fonction vérifie que EtudierSequence se répète dans la fuite :) function SequenceValide: Boolean; var posSequence: Integer; Reste_a_analyser: String; begin Reste_a_analyser := fuite; // Recherche de la 1ere occurence de la séquence: posSequence := pos(EtudierSequence, Reste_a_analyser); if posSequence > 1 // La séquence ne commence pas exactement au début de la fuite! then // Vérifier si ce qui est avant le début de la 1ère séquence correspond à la fin de celle-ci ... if posSequence-1 < lengthEtudierSequence then if copy(Reste_a_analyser, 1, posSequence-1) = copy(EtudierSequence, lengthEtudierSequence - (posSequence - 2), posSequence-1) then begin Delete(Reste_a_analyser, 1, posSequence - 1); posSequence := 1; end; while posSequence = 1 do begin Delete(Reste_a_analyser, posSequence, lengthEtudierSequence); posSequence := pos(EtudierSequence, Reste_a_analyser); end; if Reste_a_analyser = '' then Result := true else Result :pos(Reste_a_analyser, EtudierSequence) 1; // Dernière séquence qui n' est pas en entier end; begin Result := ''; LengthResult := 0; LengthFuite := Length(Fuite); // Eviter de renvoyer toute la string comme séquence : if MaxSequence > LengthFuite - 1 then MaxSequence := LengthFuite - 1; for i := 1 to lengthFuite do for s:= 1 to MaxSequence do begin EtudierSequence := Copy(Fuite, i, s); lengthEtudierSequence := length(EtudierSequence); if (LengthResult = 0) or (lengthEtudierSequence < LengthResult) // Séquence plus petite ... then if SequenceValide then begin Result := EtudierSequence; LengthResult := lengthEtudierSequence; end; end; end; var fuga: String; begin fuga := '_0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________'; // On divise par 2 pour avoir un résultat avec au moins 2 séquences entières, (sinon, on peut avoir une occurence entière suivi d' une partie de la suivante) ... cySpeedButton2.Caption := Recherche_Sequence_la_plus_petite(Fuga, length(fuga) div 2); if cySpeedButton2.Caption = '' then ShowMessage('Pas de séquence trouvée!'); end;
procedure Tform1.cySpeedButton2Click(Sender: TObject); function Recherche_Sequence_la_plus_petite(Fuite: String; MaxSequence: Integer): String; var EtudierSequence: String; LengthFuite, LengthResult, lengthEtudierSequence: Integer; // Cette sous-fonction vérifie que EtudierSequence se répète dans toute la fuite : function SequenceValide: Boolean; var posSequence: Integer; Reste_a_analyser: String; begin Reste_a_analyser := fuite; // 1ere occurence de la séquence de EtudierSequence toujours à la position 1 : while pos(EtudierSequence, Reste_a_analyser) = 1 do Delete(Reste_a_analyser, 1, lengthEtudierSequence); if Reste_a_analyser = '' then Result := true else Result :pos(Reste_a_analyser, EtudierSequence) 1; // Dernière séquence qui n' est pas en entier end; begin Result := ''; LengthResult := 0; LengthFuite := Length(Fuite); // Eviter de renvoyer toute la string comme séquence : if MaxSequence > LengthFuite - 1 then MaxSequence := LengthFuite - 1; for lengthEtudierSequence := 1 to MaxSequence do begin EtudierSequence := Copy(Fuite, 1, lengthEtudierSequence); if (LengthResult = 0) or (lengthEtudierSequence < LengthResult) // Séquence plus petite ... then if SequenceValide then begin Result := EtudierSequence; LengthResult := lengthEtudierSequence; end; end; end; var fuga: String; begin fuga := '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________' + '0000000000_0000000_0000_00_0_________000000000000_00______________________________________'; // On divise par 2 pour avoir un résultat avec au moins 2 séquences entières, (sinon, on peut avoir une occurence entière suivi d' une partie de la suivante) ... cySpeedButton2.Caption := Recherche_Sequence_la_plus_petite(Fuga, length(fuga) div 2); if cySpeedButton2.Caption = '' then ShowMessage('Pas de séquence trouvée!'); end;
function SequenceValide: Boolean; var posSequence: Integer; Reste_a_analyser: String; begin Reste_a_analyser := fuite; // Recherche de la 1ere occurence de la séquence: posSequence := pos(EtudierSequence, Reste_a_analyser); if posSequence > 1 // La séquence ne commence pas exactement au début de la fuite! then begin Delete(Reste_a_analyser, 1, posSequence - 1); posSequence := 1; end; while posSequence = 1 do begin Delete(Reste_a_analyser, posSequence, lengthEtudierSequence); posSequence := pos(EtudierSequence, Reste_a_analyser); end; if Reste_a_analyser = '' then Result := true else Result :pos(Reste_a_analyser, EtudierSequence) 1; // Dernière séquence qui n' est pas en entier end;