Autor Beitrag
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: So 24.08.08 20:52 
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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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.
ausblenden 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;

_________________
PROGRAMMER: A device for converting coffee into software.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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.

  • Durchschnitt
    Wie berechnet man einen Notendurchschnitt? Man zählt alle Werte zusammen und teilt sie durch die Anzahl. Genau das musst du hier auch machen.

  • Kleinste Zahl
    Dazu brauchst du eine neue Variable. Dann gehst du alle Zahlen nacheinander durch und vergleichst sie mit der Startvariablen (die am Anfang auf High(Integer initialisiert wurde, das ist die höchst mögliche Zahl). Wenn die Zahl kleiner als die Variable ist, weist du ihr die neue Zahl zu. Am Schluss hast du die kleinste Zahl in der Variablen.

  • Größte Zahl
    Genauso wie die kleinste Zahl - nur eben umgekehrt. ;)
baka0815
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 489
Erhaltene Danke: 14

Win 10, Win 8, Debian GNU/Linux
Delphi 10.1 Berlin, Java, C#
BeitragVerfasst: Mo 25.08.08 09:10 
user profile iconDude566 hat folgendes geschrieben:

ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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: .

ausblenden volle Höhe 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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 !!

€:
ausblenden 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. ;)


Zuletzt bearbeitet von Marc. am Mo 25.08.08 16:50, insgesamt 4-mal bearbeitet
Dude566 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: 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?


Zuletzt bearbeitet von Dude566 am Mo 25.08.08 16:51, insgesamt 1-mal bearbeitet
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 170
Erhaltene Danke: 3



BeitragVerfasst: Mo 25.08.08 16:59 
15277848 ist doch der Wert, den nicht-initialisierte Integer immer annehmen, oder? :gruebel:
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mo 25.08.08 17:05 
So und wieder ein Problem gelöst, und das Programm läuft Rund.
Vielen Dank an euch!
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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

ausblenden Quelltext
1:
minint <= zahl <= maxint					


an...

welche...? das ist bei einer nicht initialisierten zahl, dem zufall überlassen...
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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:
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 ;-)