Autor Beitrag
skall
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 08.01.09 20:30 
nabend

Ich häng bei mir im TI Kurs iwie hinterher :S
hab da für mich son kniffliges Problem...

gestellte Aufgabe:

Zuerst werden Wert über ein Eingabefeld einem Array hinzugefügt und in einem Memo angezeigt. Desweiteren werden über verschiedene Unterprogramme Minimal- Mittel- und Maximalwert ermittelt. Unteranderem wird die Memo Komponente über ein weiteres Unterprogramm wieder gelöscht.

Nun mein Problem:

Bei den eingegebenen Daten 2, 4, 6 probeweise bekomm ich den Maximal UND Minimal wert von 6... ôO

Ausserdem einen Mittelwert von über 33 Tausend...

Hier mal der Code dazu:
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:
procedure TForm1.Max;
Var i, Maximalwert : Integer;
begin
  Maximalwert := 0;
  For i := 1 To 10 Do
      If  Datenfeld[i] > Maximalwert
       Then Maximalwert := Datenfeld[i];
  Ausgabe.Caption := IntToStr(Maximalwert);
end;

procedure TForm1.Min;
Var i, Minimalwert : Integer;
begin
  Minimalwert := Datenfeld[1];
  For i := 1 To 10 Do
      If  Datenfeld[i] < Minimalwert
       Then Minimalwert := Datenfeld[i];
  Ausgabe.Caption := IntToStr(Minimalwert);
end;

procedure TForm1.Mitte;
VAR i, Summe : Integer;
    MittelWert : real;
begin
  If MemoAusgabe.Lines.Count < 1
   Then ShowMessage('Bitte zuerst Zahlen einfügen');
 Summe := 0;
  For i := 1 To Datensatz Do
    begin
      Summe := Summe + Datenfeld[i];
    end;
 Mittelwert := Summe / Datensatz;
 Ausgabe.Caption := FloatToStr(Mittelwert);
 Edit1.Text := FloatToStr(Summe);
 Edit2.Text := IntToStr(Datensatz);
end;

Danke im Vorraus :)


Ach und die Varriable Datensatz ist die Anzahl der Eingaben für Werte ins Array

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 20:35 
Wo ist denn Datenfeld definiert und wo werden da Werte hineingelegt?
Ich vermute, dass keine / falsche Werte drin stehen.

Zudem wäre es sinnvoller die Daten an die Prozeduren als Parameter zu übergeben statt globale Variablen zu benutzen. Das macht das nur unübersichtlicher. Und für die Ergebnisse könntest du eine Funktion statt einer Prozedur benutzen und diese zurückgeben.
skall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 08.01.09 20:38 
Datenfeld ist eine globale Varriable vom Typ Daten, welches ein Array ist

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Hab immermal zwischen drin zur Fehlersuche die Zwischendaten in Edit Komponenten dargestellt... Wo zum Beispiel Datensatz richtig war, jedoch aus der addition von 2, 4 und 6 = 18 ergab... Also alles iwie für mich sehr verwirrend :o
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 20:44 
Kann es sein, dass du die Ausgabe einfach durch den Aufruf von Min und Max nacheinander überschreibst? Die Ausgabe innerhalb von Min würde dann ja in Max wieder überschrieben.

Außerdem: Wenn du weniger Werte einliest als das Array groß ist, sind die anderen denn dann initialisiert?

Häng das Projekt doch einfach mal ganz an. ;-)

Ich würde das so machen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function TForm1.Max(Values: array of Integer): Integer; 
var
  i: Integer; 
begin 
  Result := 0
  for i := Low(Values) to High(Values) do 
    if Values[i] > Result then 
      Result := Values[i]; 
end;

...
Ausgabe.Caption := IntToStr(Max(Datenfeld));
skall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 08.01.09 20:54 
allet kla :D

also naja überschreiben tun sich diese eigentlich nciht...
Da diese immer erst über Radio Boxen aufgerufen werden müssen...
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:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
unit Wertsuche;

interface

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

type
  TForm1 = class(TForm)
    MemoAusgabe: TMemo;
    Eingabe: TButton;
    Suchen: TButton;
    kleinste: TRadioButton;
    mittel: TRadioButton;
    groeste: TRadioButton;
    Einfuegen: TEdit;
    Ausgabe: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    speziell: TRadioButton;
    EdSpeziell: TEdit;
    BTEnde: TButton;
    leeren: TButton;
    procedure EingabeClick(Sender: TObject);
    procedure SuchenClick(Sender: TObject);
    procedure speziellClick(Sender: TObject);
    procedure BTEndeClick(Sender: TObject);
    procedure leerenClick(Sender: TObject);
  private
    procedure Min;
    procedure Mitte;
    procedure Max;
    procedure ausgeben;
    procedure ZifferSuchen;
    procedure MemoLeeren;
    procedure zuruecksetzen;
  public

  end;

  type Daten = Array[1..10of Integer;

var
  Form1: TForm1;
  Datenfeld : Daten;
  Datensatz : Integer;


implementation

{$R *.dfm}

procedure TForm1.EingabeClick(Sender: TObject);
begin
  ausgeben;
end;

procedure TForm1.Max;
Var i, Maximalwert : Integer;
begin
  Maximalwert := 0;
  For i := 1 To 10 Do
      If  Datenfeld[i] > Maximalwert
       Then Maximalwert := Datenfeld[i];
  Ausgabe.Caption := IntToStr(Maximalwert);
end;

procedure TForm1.Min;
Var i, Minimalwert : Integer;
begin
  Minimalwert := Datenfeld[1];
  For i := 1 To 10 Do
      If  Datenfeld[i] < Minimalwert
       Then Minimalwert := Datenfeld[i];
  Ausgabe.Caption := IntToStr(Minimalwert);
end;

procedure TForm1.Mitte;
VAR i, Summe : Integer;
    MittelWert : real;
begin
  If MemoAusgabe.Lines.Count < 1
   Then ShowMessage('Bitte zuerst Zahlen einfügen');
 Summe := 0;
  For i := 1 To Datensatz Do
    begin
      Summe := Summe + Datenfeld[i];
    end;
 Mittelwert := Summe / Datensatz;
 Ausgabe.Caption := FloatToStr(Mittelwert);
 Edit1.Text := FloatToStr(Summe);
 Edit2.Text := IntToStr(Datensatz);
end;

procedure TForm1.SuchenClick(Sender: TObject);
begin
  If kleinste.Checked = True
    Then
      begin
       Min;
      end
    Else If Mittel.Checked = True
      Then
        begin
         Mitte;
        end
      Else If groeste.Checked = True
        Then
          begin
           Max;
          end
      Else If speziell.Checked = True
        Then
          begin
           ZifferSuchen;
          end;
end;

procedure TForm1.ausgeben;
var i : Integer;
begin
  i := 1;
  Datenfeld[i] := StrToInt(Einfuegen.Text);
  MemoAusgabe.Lines.Add(Einfuegen.Text);
  Einfuegen.Text := '';
  Datensatz := Datensatz + 1;
  i := i + 1;
end;

procedure TForm1.ZifferSuchen;
Var i, Ziffer : Integer;
begin
Ziffer := StrToInt(EdSpeziell.Text);
  For i:= 1 To 10 Do
    If Ziffer = Datenfeld[i]
      Then
        begin
          ShowMessage('Ziffer gefunden');
          Ausgabe.Caption := IntToStr(Datenfeld[i]);
        end
      Else ShowMessage('Ziffern nicht gefunden');
end;

procedure TForm1.speziellClick(Sender: TObject);
begin
  EdSpeziell.Visible := True;
end;

procedure TForm1.BTEndeClick(Sender: TObject);
begin
  application.Terminate;
end;

procedure TForm1.leerenClick(Sender: TObject);
begin
  MemoLeeren;
  zuruecksetzen;
end;

procedure TForm1.MemoLeeren;
begin
  //
end;

procedure TForm1.zuruecksetzen;
begin
  Datensatz := 0;
end;

end.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 21:00 
Da haben wirs ja schon:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.ausgeben;
var i : Integer;
begin
  i := 1;
  Datenfeld[i] := StrToInt(Einfuegen.Text);
  MemoAusgabe.Lines.Add(Einfuegen.Text);
  Einfuegen.Text := '';
  Datensatz := Datensatz + 1;
  i := i + 1;
end;
Du setzt i am Anfang auf 1. ;-)
Bei jedem Aufruf von Ausgeben ist das also wieder 1, das i := i + 1 bewirkt rein gar nix. Es sollte eigentlich auch eine Warnung oder ein Hinweis vom Compiler kommen, dass der Wert nicht mehr verwendet wird.

Da i lokal ist hat es beim nächsten Klick ohnehin nicht mehr den selben Wert. Benutze doch einfach Datensatz, das ist doch der aktuelle Datensatz. ;-)
skall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 08.01.09 21:03 
als i := Datensatz oder wie? :o

Naja da kommt auch iwie ne Meldung dass es nicht verwendet wird ^^ Aber das blockt den Programm Start ja nicht ab, deswegen hab ichs erstmal nicht so wichtig genommen...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 21:06 
i brauchst du gar nicht, du hast den aktuellen Datensatz doch schon in einer Variable, wofür die zweite?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.ausgeben;
begin
  Datensatz := Datensatz + 1;
  Datenfeld[Datensatz] := StrToInt(Einfuegen.Text);
  MemoAusgabe.Lines.Add(Einfuegen.Text);
  Einfuegen.Text := '';
end;
skall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 08.01.09 21:09 
Öhm... oukeey...
mit dieser Änderung bleiben die Fehler :O
Mit allerdings

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure TForm1.ausgeben;
var i : Integer;
begin
  i := Datensatz;
  Datensatz := Datensatz + 1;
  Datenfeld[i] := StrToInt(Einfuegen.Text);
  MemoAusgabe.Lines.Add(Einfuegen.Text);
  Einfuegen.Text := '';
end;


habe ich einen vernünftigen Mittelwert endlich :o
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 21:19 
Welchen Startwert Datensatz hat (offenbar 1) wusste ich ja nicht, dann mach das eben entsprechend...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.ausgeben;
begin
  Datenfeld[Datensatz] := StrToInt(Einfuegen.Text);
  Datensatz := Datensatz + 1;
  MemoAusgabe.Lines.Add(Einfuegen.Text);
  Einfuegen.Text := '';
end;
Ich dachte aber Datensatz gäbe die Anzahl an. :gruebel:
Das passt nicht ganz zusammen, denn Datenfeld fängt ja bei 1 an...
skall Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 38



BeitragVerfasst: Do 08.01.09 21:29 
jetzt zickt nur noch der Minimalwert rum und liefert mir immer 0 ôO
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 08.01.09 21:41 
Dann setz doch mal einen Haltepunkt auf die erste Zeile in Min (durch Klick links neben die Zeile oder F5) und führe dann das Programm aus.

Wenn dann Min aufgerufen wird, dann kannst du zeilenweise mit F8 durch den Code gehen und schauen was passiert. Du kannst z.B. Datenfeld[i] markieren und Strg + F7 drücken, dann siehst du den aktuellen Wert, etc., das nennt sich debuggen. Und das ist eine der wichtigsten Sachen, die du als Programmierer können musst (auch wenn es natürlich noch besser ist, sowenig Fehler wie möglich erst zu machen ;-)). Habt ihr das noch nicht gemacht?