Avatar billede xited Praktikant
09. september 2004 - 13:07 Der er 12 kommentarer og
5 løsninger

Sortering af tal

Jeg har som udgangspunkt 3 tal... og skal sortere dem, og analysere på resultatet...

Hvilket felt indeholder det største tal? a.text, b.text eller c.text

I tilfælde af flere "de største" tal, skal dette også fremgå.

Textboxes med det største tal skal få color := clBlue; det næststørste color := clSkyBlue; og det mindste color := clWhite
Avatar billede stone Forsker
09. september 2004 - 13:47 #1
hvad hvis tallene er lige store med hensyn til farve
Avatar billede martinlind Nybegynder
09. september 2004 - 14:46 #2
Hvad med at putte dem ind i en stringlist og sæt sort til true, så sorterer den for dig, så løber du den igen og sætter dine farver.
Avatar billede borrisholt Novice
09. september 2004 - 15:04 #3
procedure TForm1.Button1Click(Sender: TObject);
var
  StringList : TStringList;
begin
  StringList := TStringList.Create;
  StringList.AddObject(Edit1.Text, Edit1);
  StringList.AddObject(Edit2.Text, Edit2);
  StringList.AddObject(Edit3.Text, Edit3);
  StringList.Sort;

  TEdit(StringList.Objects[0]).Color := clBlue;
  TEdit(StringList.Objects[1]).Color := clSkyBlue;
  TEdit(StringList.Objects[2]).Color := clWhite;

  FreeAndNil(StringList);
end;

Jens B
Avatar billede martinlind Nybegynder
09. september 2004 - 15:12 #4
Præcis som jeg beskrev JB :)
Avatar billede nop Nybegynder
09. september 2004 - 15:48 #5
martinlin & borrisholt>>det er jo ikke rigtigt:
1: sortering er forkert 10 < 2 i jeres metode.
2: hvis ens tal så ens farve, fx 10 10 2, så blå, blå, sky-blå, og ingen hvid.
Okay (jeg fik borrisholt tror jeg !)
Avatar billede falster Ekspert
09. september 2004 - 16:02 #6
nop:

Hvis du har ret i fejlen i 1: - bliver det vel i 2: blå, sky-blå, skyblå. :-))
Avatar billede borrisholt Novice
09. september 2004 - 16:32 #7
Prøv det her  (utestet) og jeg har ikke tid til at ghøre det

function doSort(List: TStringList; Index1, Index2: Integer): Integer;
var
  a, b: Integer;
begin
  a := StrToIntDef(List[Index1], -1);
  b := StrToIntDef(List[Index2], -1);
  if a < b then
    Result := -1
  else
    Result := 1;

end;

procedure TForm1.Button1Click(Sender: TObject);

var
  StringList: TStringList;
begin
  StringList := TStringList.Create;
  StringList.AddObject(Edit1.Text, Edit1);
  StringList.AddObject(Edit2.Text, Edit2);
  StringList.AddObject(Edit3.Text, Edit3);
  StringList.CustomSort(doSort);

  TEdit(StringList.Objects[0]).Color := clBlue;
  TEdit(StringList.Objects[1]).Color := clSkyBlue;
  TEdit(StringList.Objects[2]).Color := clWhite;

  FreeAndNil(StringList);
end;


Jens B
Avatar billede hreiff Nybegynder
10. september 2004 - 08:27 #8
Her er noget der kan.
Bemærk at farverne er ændret
(Jeg har ikke SkyeBlue, og White kan man ikke se)
(derfor Aqua og Silver)
Indeholder 3 editbox'e og 1 button
Editboxene skal oprettes først, ellers passer index ikke.



procedure TForm1.Button1Click(Sender: TObject);
var
  tal: array [1..3] of double;
  inx: array [1..3] of integer;

procedure swap(i,j:integer);
var
  temp1: double;
  temp2: integer;
begin
  temp1 := tal[j];      {bytter om på tallene}
  tal[j] := tal[i];
  tal[i] := temp1;

  temp2 := inx[j];      {bytter om på index}
  inx[j] := inx[i];
  inx[i] := temp2;
end;

Procedure colorize(x: integer;col: TColor);
begin
  if Controls[x-1] is TEdit then
    (Controls[x-1] as TEdit).Font.Color := col;

{lægger farve på den angivne Editbox}
end;

begin
  tal[1] := strtofloat(edit1.text);
  tal[2] := strtofloat(edit2.text);
  tal[3] := strtofloat(edit3.text);
  inx[1] := 1;
  inx[2] := 2;
  inx[3] := 3;

  if tal[2]>tal[1] then swap(1,2);      {undersøger rækkefølge}
  if tal[3]>tal[2] then
  begin
    swap(2,3);
    if tal[2]>tal[1] then swap(1,2);
  end;

  If ((tal[1] = tal[2]) and (tal[1] = tal[3])) then    {alle ens}
  begin
    colorize(inx[1],clBlue);
    colorize(inx[2],clBlue);
    colorize(inx[3],clBlue);
  end
  else
    If tal[1] = tal[2] then    {2 første ens}
    begin
      colorize(inx[1],clBlue);
      colorize(inx[2],clBlue);
      colorize(inx[3],clAqua);
    end
    else
      If tal[2] = tal[3] then    {2 sidste ens}
      begin
        colorize(inx[1],clBlue);
        colorize(inx[2],clAqua);
        colorize(inx[3],clAqua);
      end
      else    {alle 3 forskellige}
        begin
          colorize(inx[1],clBlue);
          colorize(inx[2],clAqua);
          colorize(inx[3],clSilver);
        end;
end;

end.
Avatar billede borrisholt Novice
10. september 2004 - 09:00 #9
hreiff>> Går du ALTID over åen efter vand, eller er det kun når du programmerer ? Hvad nu hvis der var 15 edit felter ?

Jeg har testet mit kode, og her er en løsning der virker :

function doSort(List: TStringList; Index1, Index2: Integer): Integer;
var
  a, b: Integer;
begin
  Result := 0;
  a := StrToIntDef(List[Index1], -1);
  b := StrToIntDef(List[Index2], -1);

  if a > b then
    Result := 1
  else if a < b then
    Result := -1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  StringList: TStringList;
begin
  StringList := TStringList.Create;
  StringList.AddObject(Edit1.Text, Edit1);
  StringList.AddObject(Edit2.Text, Edit2);
  StringList.AddObject(Edit3.Text, Edit3);
  StringList.CustomSort(doSort);

  TEdit(StringList.Objects[0]).Color := clBlue;
  TEdit(StringList.Objects[1]).Color := clSkyBlue;
  TEdit(StringList.Objects[2]).Color := clWhite;

  FreeAndNil(StringList);
end;


Jens B
Avatar billede hreiff Nybegynder
10. september 2004 - 09:07 #10
>> Jens
Njææ, kun nogengange. Som regel prøver jeg bare etellerandet, så kan man altid optimere bagefter. Jeg er jo ikke bitpiller - Jeg programmerer bare lidt engang imellem for sjov (Og som regel er det beregninger / resultater jeg går efter).
mvh. Henrik
Avatar billede hrc Mester
10. september 2004 - 11:45 #11
>> hreiff
Den copy-paste-løsning du lige leverede: synes du selv den kan virke som et paradigme i dette fora? Du fik i alt fald vækket bitpilleren i mig.

Jens' (og lidt martinlinds) løsning med at lave sin egen sorteringsrutine er meget bedre fordi han bruger de rigtige værktøjer.

Indrømmet, den med at han faktisk associerer en TEdit-instans (et rigtigt objekt, ikke en TObject(integer)) til tallene, er lidt nørdet og fordrer kendskab til TStrings-klassen - men for bitpillerne, er det netop det sjove.
Avatar billede hrc Mester
10. september 2004 - 11:57 #12
Når så en bitpiller rigtigt går amok så ender det måske med noget lignende dette der gennemtravler en form for TEdits og ordner dem i pæne grønne nuancer.

Det er fredag og der er snart weekend...

function doSort(List: TStringList; Index1, Index2: Integer): Integer;
var
  a, b: Integer;
begin
  Result := 0;
  a := StrToIntDef(List[Index1], -1);
  b := StrToIntDef(List[Index2], -1);

  if a > b then
    Result := 1
  else if a < b then
    Result := -1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
  ColorNo : integer;
  ColorJumps : integer;
  StringList: TStringList;
begin
  StringList := TStringList.Create;
  try
    for i := 0 to Self.ComponentCount - 1 do
      if Components[i] is TEdit then
        StringList.AddObject((Components[i] as TEdit).Text,Components[i]);

    StringList.CustomSort(doSort);

    ColorJumps := $ff div StringList.Count;

    ColorNo := $ff;
    for i := 0 to StringList.Count - 1 do begin
      dec(ColorNo,ColorJumps);
      TEdit(StringList.Objects[i]).Color := RGB(ColorNo,$ff,ColorNo);
    end;
  finally
    FreeAndNil(StringList);
  end;
end;
Avatar billede hreiff Nybegynder
10. september 2004 - 12:07 #13
>> hrc

Der var da ikke meget copy-paste i mit (bortset fra det med farvetildelingen)
Og så kan jeg bedre lide at arbejde med tal end med strenge, så man undgår problemer med hvad der er størst (er 9.234E2 større end 2.345E4) (Martins og Jens' 1 forslag)
Jens' 2 forslag er elegant, det vil jeg da gerne indrømme - Det havde jeg faktisk ikke kigget nærmere på inden jeg selv sad og legede.
Jeg bruger nu også mest spørgsmålene til at prøve lidt hist og pist.
Må man ikke være med, når man ikke er professionel ???
Avatar billede borrisholt Novice
10. september 2004 - 12:12 #14
hreiff>> Du er, efter min mening, MEGET velkommen til at deltage. Prof eller jeg.

Min pointe var blot at du skal prøve at tænke mere elegant, det er meget udbredt at folk og fæ ikke gør det.

Du skal tænk "hvis der havde været 15 edit feltet ville min løsning ikke virke, ergo er det ikke den rigtigt" DET og kun DET var min pointe.

jens B
Avatar billede borrisholt Novice
10. september 2004 - 12:14 #15
Prof eller ej, burde der havde stået ;)

Jens B
Avatar billede hrc Mester
10. september 2004 - 12:26 #16
>> hreiff
Jo, så skidt da, leg du bare med :-) Jeg vil bare gerne have, at de eksempler der lægges ud, er brugbare og lærerige for de som ser det.

Som mit lille Delphi-spin-off indikerer, så kan jeg godt lide rutiner der ikke behøver ændring om man f.eks. sætter flere TEdits på formen. Dit eksempel var det direkte modsatte; en lad-os-få-det-til-at-virke-hurtigst-muligt-løsning (kunne også kaldes projektlederfremgangsmåden).

Resultatet var, at jeg vågnede fra dvale (lidt ligesom Holger Danske) og svang mit litterære sværd over den formastelige.

I øvrigt: Mit eksempel giver også sammenfaldende værdier en forskellig nuance - og det er ikke korrekt - men det ser pænt ud med de grønne farver.

God weekend
Avatar billede nop Nybegynder
10. september 2004 - 14:29 #17
falster>> ja men jeg listede martinlind's og borrisholt's fejl, og der var 2!!
Ellers godt nørdedet falster...he
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