Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   FreePascal Niedrigsten Werte in Array finden (https://www.delphipraxis.net/173564-niedrigsten-werte-array-finden.html)

p80286 4. Mär 2013 11:27

AW: Niedrigsten Werte in Array finden
 
[OT]komplett gestrichen[/OT]

Gruß
K-H

gammatester 4. Mär 2013 11:37

AW: Niedrigsten Werte in Array finden
 
Die ganze Prozedur ist allerdings noch nicht eindeutig für einen Algorithmus spezifiziert! Warum wird zB nicht die 7 in Geschichte sondern die in Englisch gestrichen? Weiter: Wie soll der Fall behandelt werden, wenn in den 11 Fächern zB 5-mal der Minimalwert in verschiedenen Fächern vorkommt?

Blup 4. Mär 2013 13:22

AW: Niedrigsten Werte in Array finden
 
Scheint egal zu sein, wenn es nur darum geht die Gesamtpunktzahl zu maximieren.

1. Nimm von jedem Fach die beiden schlechtesten Semester.
2. Bilde eine Gesamtmenge aus den Ergebnissen von 1.
3. Wähle die vier schlechtesten aus dieser Gesamtmenge.

Delphi-Quellcode:
type
  TSpinArr = array of TSpinEdit;

procedure Tausche(var A, B: TSpinEdit);
var
  T: TSpinEdit;
begin
  T := A;
  A := B;
  B := T;
end;

function ErmittleSchlechteste(const AEditArr: TSpinArr; ACount: Integer): TSpinArr;
var
  i1, i2, n: Integer;
  Item: TSpinEdit;
begin
  SetLength(Result, ACount);
  n := 0;
  for i1 := Low(AEditArr) to High(AEditArr) do
  begin
    Item := AEditArr[i1];
    if n < ACount then
    begin
      Result[n] := Item;
      Inc(n);
    end
    else
    begin
      for i2 := 0 to ACount - 1 do
      begin
        if Item.Value < Result[i2].Value then
          Tausche(Item, Result[i2]);
      end;
    end;
  end;
  SetLength(Result, n);
end;

function Gesamtmenge(const A1, A2: TSpinArr): TSpinArr;
var
  i, n1, n2: Integer;
begin
  n1 := Length(A1);
  n2 := Length(A2);
  SetLength(Result, n1 + n2);
  for i := 0 to n1 - 1 do
    Result[i] := A1[i];
  for i := 0 to n2 - 1 do
    Result[n1 + i] := A2[i];
end;

var
  FFach: array of record
    Name: string;
    Semester: TSpinArr;
  end;
  X1, X2: TSpinArr;
  i: Integer;
begin
  SetLength(FFach, 11);

  FFach[0].Name := 'Mathematik';
  SetLength(FFach[0].Semester, 4);
  FFach[0].Semester[0] := SpinEditFach1Semester1;
  FFach[0].Semester[1] := SpinEditFach1Semester2;
  FFach[0].Semester[2] := SpinEditFach1Semester3;
  FFach[0].Semester[3] := SpinEditFach1Semester4;
  {usw.}
  SetLength(X1, 0);
  for i := Low(FFach) to High(FFach) do
  begin
    X2 := ErmittleSchlechteste(FFach[i].Semester, 2);
    X1 := Gesamtmenge(X1, X2);
  end;
  X1 := ErmittleSchlechteste(X1, 4);
end;

Furtbichler 4. Mär 2013 15:03

AW: Niedrigsten Werte in Array finden
 
Ich würde die eine Liste aller SpinEdits erstellen und sortieren und dann einfach die SpinEdits, von unten beginnend, so lange den Regeln entsprechend (maximal 2 pro Fach) einfärben, bis 4 eingefärbt sind.
Delphi-Quellcode:
Gestrichen := 0;
for i := low(SpinEditListe) to high(SpinEditListe) do
  if KannStreichen(SpinEditListe[i]) then begin
    FaerbeDasSpinEditEin(SpinEditListe[i]);
    inc(Gestrichen);
    if Gestrichen = 4 then break;
  end;
Die Funktion 'KannStreichen' prüft, ob in einem Fach nicht schon zwei Edits gestrichen wurden.

p80286 4. Mär 2013 15:15

AW: Niedrigsten Werte in Array finden
 
Warum haltet Ihr Euch mit diesen SpinEdits auf?
Die Daten
Delphi-Quellcode:
tMyrec=record
          Fach : string[20];
          Lfnr : integer;
          Punkte: integer;
       end;
gehören in eine Liste oder Array und gut ist.
Da kann man sortieren und strichen wie man lustig ist, und hinterher gibt man in Superduperklickibuntlistenspindoctor aus.

Auch wenn es "nur" für die Schule ist, die Trennung von Daten und Oberfläche kann man nicht früh genug lernen.

Gruß
K-H


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz