type TTableauEntiers = array of integer; {La fonction renvoie un entier égal à -1 si Value est en dehors des valeurs contenues dans le tableau. Si Value est dans l'étendue des nombres contenues dans le tableau Tab, il existe deux possibilités : 1- Value existe dans Tab : la fonction renvoie l'index de Value dans Tab. 2- Value n'existe pas dans Tab : la fonction renvoie l'index du nombre immédiatement inférieur à Value. NB : Tab doit être un tableau ordonné au préalable.} function Chercher(const Value: integer;const Tab: TTableauEntiers; First, Last: integer): integer; var Middle: integer; begin Result : = -1; {Vérifier que le nombre recherché soit dans les limites des valeurs contenues dans le tableau} if (Value < Tab[First]) or (Value > Tab[Last]) then Exit; {S'il ne reste plus que deux éléments, c'est que le nombre recherché est introuvable dans le tableau. Renvoyer alors la valeur immédiatement inférieure. Normalement, on devrait renvoyer -1 pour indiquer que le nombre recherché est introuvable} if (Last - First) = 1then begin Result := First; Exit; end ; {Déterminer l'indice du point central du tableau} Middle : = First + (Last - First) div2; {La valeur recherchée appartien-elle à la partie gauche du tableau ?} if Value < Tab[Middle] then Result := Chercher(Value, Tab, First, Middle) else {à la partie droite ?} if Value > Tab[Middle] then Result : = Chercher(Value, Tab, Middle, Last) else {ou est-elle tout simplement égale} Result := Middle; end ; procedure TForm1.btnSearchClick(Sender: TObject); var Tableau: TTableauEntiers; i, Index, Value : integer; begin //Dimensionner pour 40 éléments Setlength(Tableau, 40); //Remplir le tableau avec des valeurs paires i : = 0; repeat Tableau[i] := i * 2; inc(i); until i = High(Tableau) + 1; Value := StrToIntDef(Edit1.Text, 0); //Lancer la recherche Index := Chercher(Value, Tableau, Low(Tableau), High(Tableau)); if Index <> - 1then begin Value : = Tableau[Index]; ShowMessageFmt('%d a été trouvé à la position %d', [Value, Index]); end else ShowMessageFmt('%d non trouvé', [Value]); end;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionfunction Chercher2(const Value: integer; const Tab: TTableauEntiers;var Nbloops: integer): integer; var i: integer; begin Result := -1; if (Value < Tab[Low(Tab)]) or (Value > Tab[High(Tab)]) then Exit; i : = Low(Tab); NbLoops := 1; while Value > Tab[i] do begin inc(i); inc(NbLoops); end; if Tab[i] = Value then Result := i else Result := i - 1; end ; procedure TForm1.btnSearch2Click(Sender: TObject); var i: integer; Loops: integer; Value: integer; Index: integer; Tableau: TTableauEntiers; begin Value : = StrToIntDef(Edit1.Text, 0); Loops := 1; //Dimensionner pour 40 éléments Setlength(Tableau, 40); //Remplir le tableau avec des valeurs paires i := 0; repeat Tableau[i] := i * 2; inc(i); until i = High(Tableau) + 1; Index := Chercher2(Value, Tableau, Loops); if Index = -1then ShowMessageFmt('%d est en dehors des limites du tableau', [Value]) else ShowMessageFmt('Position %d, trouvée en %d coups', [Index, Loops]); end;