Thema: Delphi Rucksackproblem

Einzelnen Beitrag anzeigen

buff222

Registriert seit: 19. Okt 2006
4 Beiträge
 
#19

Re: Rucksackproblem

  Alt 2. Nov 2006, 14:05
Nach einigen Schwierigkeiten und durchzechten Nächten habe ich das Programm jetzt fertig...
Ich möchte mich bei euch für eure Hilfe bedanken.
Ich habe einfach die 5 wertvollsten, also die kleinsten Quotienten aus Gewicht und Wert raussortierne lassen, die dann mitgenommen werden ...
Somit hab ich das problem mit dem maximal Gewicht rausgelassen...
Meinem Lehrer reichts und damit is gut
Ich wusste nicht wie ich das hinkriege, vll. könnt ihr mir da ja noch helfen...

Hier mein kleines Progrämmchen...

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;                // Gegenstände mit Zufallswerten erzeugen
    Button2: TButton;                // Ergebnis bestimmen
    Button3: TButton;                // Programm beenden
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Ergebnis: array [1..5] of Integer;             // Speichert die Nummer der 5 wertvollsten
                                                    // Gegenstände vom Index 1 = wertvollster
                                                    // bis Index 5 = 5. wertvollster Gegenstand
  Ergebniswerte: array [1..5] of Real;          // Speichert die 5 niedrigsten Quotienten
                                                      // vom Index 1 = wertvollster bis Index
                                                      // 5 = 5. wertvollster Gegenstand
  Gewicht: array [1..10] of Integer;             // Das Gewicht der Gegenstände 1-10
  Quotient: array [1..10] of Real;             // Der Quotient (von Gewicht durch Wert) der
                                                  // Gegenstände 1-10
  Wert: array [1..10] of Integer;             // Der Wert der Gegenstände 1-10
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;                   // i ist Schleifen-Hilfsvariable
begin
  Randomize;                   // Zufallszahlengenerator starten
  Memo1.Lines.Clear;                // Text aus Memo1 komplett löschen
  for i := 1 to 10 do                // den 10 Gegenständen Zufallswerte geben
    begin
    Gewicht[i] := Random(15)+1;             // damit Gewicht zwischen 1 und 15 liegt
    Wert[i] := Random(15)+1;             // damit Wert zwischen 1 und 15 liegt
    end;
  Memo1.Lines.Add('Die 10 Gegenstände haben folgende Eigenschaften:');
  Memo1.Lines.Add('');
  for i := 1 to 10 do
    Memo1.Lines.Add('Gegenstand '+IntToStr(i)+': Gewicht: '
      +IntToStr(Gewicht[i])+' Wert: '+IntToStr(Wert[i]));
end;

procedure TForm1.Button2Click(Sender: TObject);
var i, j: Integer;                   // i und j sind Schleifen-Hilfsvariablen
begin
  for i := 1 to 10 do // für die Gegenstände 1-10
    begin
    Quotient[i] := Gewicht[i]/Wert[i];          // ermittelt den Quotienten
    Memo1.Lines[1+i] := Memo1.Lines[1+i]+' Quotient: '
      +FloatToStrF(Quotient[i], ffFixed, 10, 2);       // Real-Zahl wird auf 2 Stellen
                                                             // gerundet mit Genauigkeit 10
    end;
  for i := 1 to 5 do                // Bestimmung der 5 wertvollsten Gegenstände
    begin
    Ergebnis[i] := 1;                // gehe davon aus, dass direkt der 1. Gegenstand
                                        // der Wertvollste ist
    Ergebniswerte[i] := Quotient[1];          // speichere den Quotienten des
                                                    // wertvollsten Gegenstandes
    for j := 2 to 10 do                // überprüfe die anderen 9 Gegenstände, ob sie
                                          // nicht wertvoller sind
      if Ergebniswerte[i]>Quotient[j] then          // falls der aktuelle Gegenstand doch
                                                       // wertvoller ist, dann ...
        begin
        Ergebnis[i] := j;                // ... speichere den aktuellen Gegenstand und
        Ergebniswerte[i] := Quotient[j];          // speichere den aktuellen Quotienten
        end;
                // Jetzt wurden alle 10 Gegenstände überprüft. Der Wertvollste unter ihnen
                // wurde gefunden. Damit er nicht als nächst wertvoller Gegenstand
               // identifiziert wird ...
    Quotient[Ergebnis[i]] := 16;    // ... setze seinen Quotienten, der nun nicht
                                       // mehr gebraucht wird - da er bereits in die
                                       // "Top5-Liste" aufgenommen wurde - auf "16".
                                       // Somit ist er außerhalb der Skala 1-15 und
                                       // wird bei weiteren Schleifendurchläufen nicht
                                       // mehr als wertvoll eingestuft.
                // Durchlaufe die Schleife erneut, bis alle 5 wertvollsten Gegenstände
                // gefunden sind
    end;
  Memo1.Lines.Add('');
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Die 5 wertvollsten Gegenstände lauten:');
  Memo1.Lines.Add('');
  for i := 1 to 5 do
    Memo1.Lines.Add(IntToStr(i)+': Gegenstand '+IntToStr(Ergebnis[i])+
      ' mit Quotient '+FloatToStrF(Ergebniswerte[i], ffFixed, 10, 2)); // Real-
      // Zahl wird auf 2 Stellen gerundet mit Genauigkeit 10
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Close;
end;

end.
Vorschläge zur verbesserung des Programms nehm ich gerne an

ansonsten

MfG buff222

[edit=sakura] [delphi]-Tags Mfg, sakura[/edit]
  Mit Zitat antworten Zitat