Avatar billede whitehawk Nybegynder
18. maj 2006 - 17:14 Der er 10 kommentarer

Finde det største tal i en listbox

Jeg har en listbox med 10 vilkårlge tal. Jeg vil med en gennemløbning af listboxen kunne finde det største tal og skrive det til et tekstfelt. Hvordan gør jeg det nemmes
18. maj 2006 - 18:59 #1
type
  Max: Integer // Eller hvad type der er nødvendig
  Loop: Integer;
begin
  Max := StrToInt(ListBox1.Items[0]);  // Max er lig med det første tal
  for Loop := 1 to ListBox1.Items.Count -1 do
  begin
    if StrToInt(ListBox1.Items[Loop]) > Max then
      Max := StrToInt(ListBox1.Items[Loop]);
  end;
  Label1.Caption := IntToStr(Max);
end;
18. maj 2006 - 19:00 #2
Hovsa, der mangler en semikolon i linie 2.
Max: Integer;
Avatar billede hrc Mester
19. maj 2006 - 00:04 #3
aka: Nu er opgaven rigtignok en liste med 10 tal og så virker din kode. Ellers havde det været mere sikkert at starte med 0 i din for-next så en tom liste ikke fejlede:

function GetMax(aItems : TStrings) : integer;
var
  i : integer;
begin
  result := -2147483648; // Mindste mulige heltal
  for i := 0 to aItems.Count - 1 do
    if result < aItems[i] then
      result := aItems[i];
end;
     
Label1.Caption := GetMax(ListBox1.Items);
19. maj 2006 - 18:19 #4
Hej Hrc

Sandt nok, men hvad er det største tal i en tom liste?
Det er i hvertfald ikke -2147483648.

Så vil en fejlmeddelelse være mere rigtig.
Avatar billede whitehawk Nybegynder
21. maj 2006 - 20:51 #5
tak!
Avatar billede hrc Mester
22. maj 2006 - 12:10 #6
Korrekt. En exception havde nok været på sin plads:

function GetMax(aItems : TStrings) : integer;
var
  i : integer;
begin
  if aItems.Count = 0 then
    raise EEmptyListException.Create('Listen er dælmedunsme tom');
  result := -2147483648; // Mindste mulige heltal (ingen MinInt konstant)
  for i := 0 to aItems.Count - 1 do
    if result < aItems[i] then
      result := aItems[i];
end;

Fandt denne her i "math"-unitten:

function MaxIntValue(const Data: array of Integer): Integer;
var
  I: Integer;
begin
  Result := Data[Low(Data)];
  for I := Low(Data) + 1 to High(Data) do
    if Result < Data[I] then
      Result := Data[I];
end;

.. og det er helt analogt din løsning.
Avatar billede nico26 Nybegynder
22. maj 2006 - 18:32 #7
den alternative :)

function MaxList(aList: TStrings) : Integer;
begin
  if aList.Count <= 0 then
    raise Exception.Create('Listen er tom');

  with TStringList.Create do
    try
      Assign(aList);
      Sorted := True;
      Result := StrToInt(Strings[Pred(Count)]);
    finally
      Free;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(MaxList(ListBox1.Items)));
end;
22. maj 2006 - 18:41 #8
Hej nico26

Sorterer den alfabetisk eller numerisk?
Hvis den sorterer alfabetisk, er den ingenting værd.
Avatar billede nico26 Nybegynder
22. maj 2006 - 18:47 #9
Du har naturligvis helt ret - jeg er ved at være lidt rusten til Delphi. Men nu skulle den være der (dog knap så elegant) :)

function MySort(List: TStringList; Index1, Index2: Integer): Integer;
begin
  Result := StrToInt(List[Index1]) - StrToInt(List[Index2]);
end;

function MaxList(aList: TStrings) : Integer;
begin
  if aList.Count <= 0 then
    raise Exception.Create('Listen er tom');

  with TStringList.Create do
    try
      Assign(aList);
      CustomSort(MySort);
      Result := StrToInt(Strings[Pred(Count)]);
    finally
      Free;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(MaxList(ListBox1.Items)));
end;
Avatar billede nico26 Nybegynder
22. maj 2006 - 18:57 #10
endnu et alternativ :)

function MaxList2(aList: TStrings) : Integer;

  function Aux(m, i: Integer) : Integer;
  begin
    if i >= aList.Count then
      Result := m
    else
      Result := Aux(Max(m, StrToInt(aList[i])), Succ(i));
  end;

begin
  if aList.Count <= 0 then
    raise Exception.Create('Listen er tom')
  else if aList.Count = 1 then
    Result := StrToInt(aList[0])
  else
    Result := Aux(StrToInt(aList[0]), 1);
end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester