| Autor |
Beitrag |
skall
      
Beiträge: 38
|
Verfasst: 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:
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 Narses: Delphi-Tags hinzugefügt
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 38
|
Verfasst: Do 08.01.09 20:38
Datenfeld ist eine globale Varriable vom Typ Daten, welches ein Array ist
--- Moderiert von Narses: 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 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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: 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 
      
Beiträge: 38
|
Verfasst: Do 08.01.09 20:54
allet kla
also naja überschreiben tun sich diese eigentlich nciht...
Da diese immer erst über Radio Boxen aufgerufen werden müssen...
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..10] of 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 08.01.09 21:00
Da haben wirs ja schon: 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 
      
Beiträge: 38
|
Verfasst: Do 08.01.09 21:03
als i := Datensatz oder wie?
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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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? 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 
      
Beiträge: 38
|
Verfasst: Do 08.01.09 21:09
Öhm... oukeey...
mit dieser Änderung bleiben die Fehler :O
Mit allerdings
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 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 08.01.09 21:19
Welchen Startwert Datensatz hat (offenbar 1) wusste ich ja nicht, dann mach das eben entsprechend... 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.
Das passt nicht ganz zusammen, denn Datenfeld fängt ja bei 1 an...
|
|
skall 
      
Beiträge: 38
|
Verfasst: Do 08.01.09 21:29
jetzt zickt nur noch der Minimalwert rum und liefert mir immer 0 ôO
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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?
|
|
|