Entwickler-Ecke

Sonstiges (Delphi) - Zahlenliste Aufgaben


Dude566 - So 24.08.08 20:52
Titel: Zahlenliste Aufgaben
Hallo liebe EE-Gemeinde,

ich komme wieder mit einem Problem.
Die Aufgabe des Programms ist es eine Liste von Zufallszahlen in einer Listbox auszugeben.
Durch das Verwenden weiterer Buttons sollen alle Zahlen: addiert werden, der durchschnitt errechnet werden,
die kleinste Zahl ermitteln, die größte Zahl aus der Liste.

Der erste Fehler tritt schon beim Addieren auf, und bei den weiteren Dingen weis ich nicht wie ichs machen soll.
Bin erst seit kurzer Zeit mit Delphi zugange, und unser Infolehrer gab auch nicht viel zur Lösung an.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;         // Zufällige Zahlen in ListBox ausgeben
    ListBox1: TListBox;       // Ausgegebene Zufallszahlen
    Button2: TButton;         // Löschen der Zufallszahlen
    Button3: TButton;         // Alle Zufallszahlen addieren
    Edit1: TEdit;             // Ausgabe der Addition
    Button4: TButton;         // Durchschnitt der aller addierten Zahlen errechnen
    Edit2: TEdit;             // Ausgabe des Durchschnitts
    Button5: TButton;         // Kleinste Zahl ermitteln aus der Liste
    Edit3: TEdit;             // Ausgabe der kleinsten Zahl
    Button6: TButton;         // Größte Zahl ermitteln aus der Liste
    Edit4: TEdit;             // Ausgabe der größten Zahl
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zahlen : array [1..1000of integer;
  i : integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   for i := 1 to 100 do zahlen[i] := random(1000)+1;
   for i := 1 to 100 do ListBox1.Items.Add (IntToStr (zahlen[i]));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear; // Alle Zahlen werden aus der Liste gelöscht
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  for i := 1 to 100 do add := add + zahlen[i];     // Alle Zahlen addieren
  Edit1.Text := IntToStr (add);                    // Summe wird in Edit Feld ausgegeben
end;

end.


Xentar - So 24.08.08 22:31

Wenn beim Addieren ein Fehler auftritt, dann schreib doch BITTE auch dazu, was für einer..

Ich vermute mal, dass er "add" nicht kennt, weil du es noch nirgends deklariert hast.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button3Click(Sender: TObject);
var add: integer;
begin
  for i := 1 to 100 do add := add + zahlen[i];     // Alle Zahlen addieren
  Edit1.Text := IntToStr (add);                    // Summe wird in Edit Feld ausgegeben
end;


Yogu - So 24.08.08 22:36

user profile iconDude566 hat folgendes geschrieben:
Durch das Verwenden weiterer Buttons sollen alle Zahlen: addiert werden, der durchschnitt errechnet werden, die kleinste Zahl ermitteln, die größte Zahl aus der Liste. [...] bei den weiteren Dingen weis ich nicht wie ichs machen soll.



baka0815 - Mo 25.08.08 09:10
Titel: Re: Zahlenliste Aufgaben
user profile iconDude566 hat folgendes geschrieben:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject);
begin
   for i := 1 to 100 do zahlen[i] := random(1000)+1;
   for i := 1 to 100 do ListBox1.Items.Add (IntToStr (zahlen[i]));
end;


Das kannst du beides zusammen in eine Schleife packen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
begin
  for i := 1 to 100 do 
  begin
    zahlen[i] := random(1000)+1;
    ListBox1.Items.Add(IntToStr(zahlen[i]));
  end;
end;


Ausserdem ist "zahlen" ein Array mit 1.000 Einträgen, von 1 bis 1.000, du verwendest aber immer nur 1 bis 100. Dann kannst du das Array auch entsprechend definieren - spart Platz.


Dude566 - Mo 25.08.08 16:40

Danke Yogu aber die Theorie hab ich auch so verstanden. :wink: :D

Also ich hab das Programm jetzt fertig und es läuft weist aber noch ein paar Fehler auf.
Er gibt mir bei der kleinsten Zahl grundsätzlich "1" an auch wenn sie nicht in der Liste ist,
und bei der größten die "15277848", obwohl die Zahlen nur bis maximal 1000 gehen. :?:

Ich bin mir sicher ich hab irgendwo nen peinlichen Denkfehler :oops: .


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;         // Zufällige Zahlen in ListBox ausgeben
    ListBox1: TListBox;       // Ausgegebene Zufallszahlen
    Button2: TButton;         // Löschen der Zufallszahlen
    Button3: TButton;         // Alle Zufallszahlen addieren
    Edit1: TEdit;             // Ausgabe der Addition
    Button4: TButton;         // Durchschnitt der aller addierten Zahlen errechnen
    Edit2: TEdit;             // Ausgabe des Durchschnitts
    Button5: TButton;         // Kleinste Zahl ermitteln aus der Liste
    Edit3: TEdit;             // Ausgabe der kleinsten Zahl
    Button6: TButton;         // Größte Zahl ermitteln aus der Liste
    Edit4: TEdit;             // Ausgabe der größten Zahl
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  zahlen : array [1..100of integer;
  i : integer;
  min : integer;
  max : integer;
  summe : single;
  big : integer;
  small : integer;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   for i := 1 to 100 do zahlen[i] := random(1000)+1// Zufallszahlen werden in Variable gespeichert
   for i := 1 to 100 do ListBox1.Items.Add (IntToStr (zahlen[i]));  // Zufallszahlen werden ausgegeben
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear; // Alle Zahlen werden aus der Liste gelöscht
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  for i := 1 to 100 do summe := summe + zahlen[i];     // Alle Zahlen addieren
  Edit1.Text := FloatToStr (summe);                    // Summe wird in Edit Feld ausgegeben
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 Edit2.Text := FloatToStr (summe / 100);  //Durchschnitt der Summe wird ausgegeben
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 big := 999999;
 small := 1;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 for i := 0 to 100 do if zahlen[i] < small then small := zahlen[i];
 Edit3.Text := IntToStr (small);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
  for i := 0 to 100 do if zahlen[i] > big then big := zahlen[i];
  Edit4.Text := IntToStr (big);
end;

end.


Marc. - Mo 25.08.08 16:45

1. Randomize vergessen.
2. Small ist 1 und damit IMMER die kleinste Zahl in deinem Beispiel. Random(1000)+1 -> Bereich von 1 bis 1000.
3. Weshalb Big "15277848" annimmt ist mir momentan ein Rätsel. Wobei wohl keine Deiner Zahlen größer als Big sein kann. Random(1000)+1 < 999.999 !!

€:

Delphi-Quelltext
1:
 for i := 0 to 100 do if zahlen[i] > big then big := zahlen[i];                    

Da liegt der Fehler! In der Prozedur darüber übrigens auch. ;)


Dude566 - Mo 25.08.08 16:48

Also ich hab gerade selber nochmal über den Text geschaut und da ist mir das mit der 1 aufgefallen und Randomize,
hab ich auch schon behoben.
Ja, das mit der Größten das ist mir auch ein Rätsel.
Weiß jemand was dazu?


Marc. - Mo 25.08.08 16:51

user profile iconDude566 hat folgendes geschrieben:
Ja, das mit der Größten das ist mir auch ein Rätsel.


Delphi-Quelltext
1:
for i := 0 to 100 do if zahlen[i] > big then big := zahlen[i];                    

Da liegt der Fehler! In der Prozedur darüber übrigens auch. ;)

Alternativ siehe zwei Postings weiter oben. Ich hatte ohne zu aktualisieren editiert. :?


LexXis - Mo 25.08.08 16:59

15277848 ist doch der Wert, den nicht-initialisierte Integer immer annehmen, oder? :gruebel:


Marc. - Mo 25.08.08 17:03

user profile iconLexXis hat folgendes geschrieben:
15277848 ist doch der Wert, den nicht-initialisierte Integer immer annehmen, oder? :gruebel:

Der ist IMHO zufällig. Stimmt aber. ;)


Dude566 - Mo 25.08.08 17:05

So und wieder ein Problem gelöst, und das Programm läuft Rund.
Vielen Dank an euch!


Delete - Mo 25.08.08 22:34

user profile iconLexXis hat folgendes geschrieben:
15277848 ist doch der Wert, den nicht-initialisierte Integer immer annehmen, oder? :gruebel:


nööööööö

sie nehmen eine zahl zwischen


Quelltext
1:
minint <= zahl <= maxint                    


an...

welche...? das ist bei einer nicht initialisierten zahl, dem zufall überlassen...


Yogu - Mo 25.08.08 22:51

user profile iconGrenzgaenger hat folgendes geschrieben:
welche...? das ist bei einer nicht initialisierten zahl, dem zufall überlassen...

Nicht dem Zufall, sondern dem Wert, der vorher dort im Speicher lag. Delphi initialisiert die Variable, die jetzt den Platz einnimmt, absichtlich nicht, um Zeit zu sparen. Deswegen muss das immer von Hand geschehen. :idea:


Delete - Mo 25.08.08 23:18

user profile iconYogu hat folgendes geschrieben:
user profile iconGrenzgaenger hat folgendes geschrieben:
welche...? das ist bei einer nicht initialisierten zahl, dem zufall überlassen...

Nicht dem Zufall, sondern dem Wert, der vorher dort im Speicher lag. Delphi initialisiert die Variable, die jetzt den Platz einnimmt, absichtlich nicht, um Zeit zu sparen. Deswegen muss das immer von Hand geschehen. :idea:


fast :-) . aber die speicherstelle wird willkürlich ausgewählt... :-)

halt diejenige, welche grad frei ist ;-)