Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Hilfe zur ListBox
elle333 - Sa 15.01.11 23:45
Titel: Hilfe zur ListBox
Hey ich hab ein problem
Im Informatikunterricht haben wir die ListBox kennengelernt
dazu haben wir ein prgramm gemacht, dass die Fibonaccizahlen in einer listbox anzeigt
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) EdN: TEdit; BuRechne: TButton; EdSumme: TEdit; LaSumme: TLabel; LaN: TLabel; LaResultat: TLabel; ListBox: TListBox; procedure BuRechneClick(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BuRechneClick(Sender: TObject); var n, i: Integer; a, b, c: Int64; begin n := StrToInt(EdN.Text); b := 0; c := 1; ListBox.Clear;
for i := 1 to n do begin a := b + c; c := b; b := a; ListBox.Items.Add (IntToStr(a)); end;
EdSumme.Text := IntToStr(a); end;
end. |
Als Hausaufgabe sollen wir folgendes machen:
Zitat: |
Schreibe ein Delphi-Programm, dass bei Eingabe von Kapital (Euro), Zinssatz (%) und Laufzeit (Jahre) in einer Listbox jeweils den Gesamtkapitalstand einschließlich Zinsen und Zinseszinsen nach Ablauf jedes Jahres ausgibt.
Benutze eine for-Schleife mit variabler Obergrenze. |
Bisher habe ich folgendes gemacht
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) BuRechne: TButton; EdLaufzeit: TEdit; Label4: TLabel; Label3: TLabel; ListBox: TListBox; Label1: TLabel; Label2: TLabel; EdZinsen: TEdit; EdKapital: TEdit; EdGesamt: TEdit; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; procedure BuRechneClick(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BuRechneClick(Sender: TObject); var n ,i ,k , z, l, g, g2: Integer;
begin
n := StrToInt(EdGesamt.Text) ; k := 0; z := 1; ListBox.Clear;
for i := 1 to n do
begin
k := StrToInt (EdKapital.Text) ; z := StrToInt (EdZinsen.Text) ; l := StrToInt (EdLaufzeit.Text) ; g := k * z ; g2 := g - k ; ListBox.Items.Add (IntToStr(g)); EdGesamt.Text := IntToStr(g2); end;
EdSumme.Text := IntToStr(g2);
end. |
kann mir vllt jemand sagen was speziell dieser abschnitt bewirkt, unabhängig vom programm
dann komme ich sicher auch von selber drauf was ich falsch gemacht hab:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| n := StrToInt(EdGesamt.Text) ; k := 0; z := 1; ListBox.Clear;
for i := 1 to n do
begin |
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Sa 15.01.2011 um 22:50
elundril - Sa 15.01.11 23:50
elle333 hat folgendes geschrieben : |
Bisher habe ich folgendes gemacht
[...]
kann mir vllt jemand sagen was speziell dieser abschnitt bewirkt, unabhängig vom programm
dann komme ich sicher auch von selber drauf was ich falsch gemacht hab:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| n := StrToInt(EdGesamt.Text) ; k := 0; z := 1; ListBox.Clear;
for i := 1 to n do
begin | |
Du willst uns jetzt n bisschen verarschen, oder? DU hast bisher das geschrieben, weißt aber selbst nicht was das Ding macht? Hast du leicht mit deinem Kopf solange gegen das Keyboard gedroschen bis etwas rausgekommen ist das man kompilieren konnte?
Nun zu deiner frage:
du liest in die Integervariable 'n' eine Zahl ein, aus dem Editfeld 'EdGesamt'. Dann setzt du die beiden Variablen k und z 0 bzw 1. Und dann Löscht du mal den gesamten Inhalt von der ListBox. Die letzten Zeilen sind eine Listbox, mit der Laufvariablen 'i'. Diese geht von 1 bis zu der Zahl 'n', die du ja voher eingelesen hattest. Klar soweit?
lg elundril
elle333 - So 16.01.11 02:12
weiss zwar nicht wieso ich leute verarschen sollte, aber egal.
Ich hatte nur die Frage wie ich die Gesamtkontostände nach jedem jahr in die listbox bekomme.
Wie man das ohne mach weiss ich.
Deine Antwort hätte also auch ein bisschen freundlicher ausfallen können.
ich habe das was wir im unterricht gemacht haben als vorlage genommen haben und hab versucht es so abzuändern, dass es eben die bedingungen erfüllt.
und da ich nach 2 h nicht mehr weiter kam und ich gewisse teile nicht verstanden habe, dachte ich ich stell die frage mal im forum.
trotzdem danke für deine antwort
Delete - So 16.01.11 11:20
Na, an welcher Stelle in deinem Programm wird denn für jedes Jahr das Kapital berechnet?
elle333 - So 16.01.11 12:55
so hab es mal verändert
will ich jetzt aber eine kommazahl für die prozente eingeben, dann sagt es mir, dass die kommazahl kein gültiger Integerwert ist.
wie kann ich das beheben.
und wenn ich das ganze in den quelltext schreibe, dann sagt er [Fehler] Unit1.pas(53): Inkompatible Typen: 'Integer' und 'Extended'
Also versuche ich da wohl mit zwei verschiedenen Rechentypen zu arbeiten.
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) BuRechne: TButton; EdLaufzeit: TEdit; Label4: TLabel; Label3: TLabel; ListBox: TListBox; Label1: TLabel; Label2: TLabel; EdZinsen: TEdit; EdKapital: TEdit; EdGesamt: TEdit; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label8: TLabel; procedure BuRechneClick(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.BuRechneClick(Sender: TObject); var i ,k , z, l, g, g2: Integer;
begin
l := StrToInt(EdLaufzeit.Text) ; ListBox.Clear;
for i := 1 to l do
begin
k := StrToInt (EdKapital.Text) ; z := StrToInt (EdZinsen.Text) ; g := k * (0.01*z) ; g2 := g - k ; ListBox.Items.Add (IntToStr(g2)); EdGesamt.Text := IntToStr(g2); end;
end;
end. |
Und mein Programm spuckt leider immernochnicht die zwischenwerte aus.
woran liegt das
platzwart - So 16.01.11 13:48
Folende Zeile:
Wenn du Ganzzahlen (=Integer) mit Kommazahlen (=Double, Float, Extended) multiplizierst, dann ist das Ergebnis wiederum eine Kommazahl. Du versuchst aber in dieser Zeile, eine Kommazahl (das Ergebnis der Berechnung) in eine Ganzzahl (g) zu speichern, was natürlich schief geht. Für dich bietet sich hier übrigens als Variablentyp 'currency' (=Währung) an, da hier auf zwei Nachkommastellen genau gespeichert wird.
Delete - So 16.01.11 14:22
Delphi-Quelltext
1: 2: 3: 4:
| for i := 1 to l do begin k := StrToInt (EdKapital.Text) ; z := StrToInt (EdZinsen.Text) ; |
Warum liest du immer wieder die Eingabe ein? Und "l" als Variable zu benutzen ist eher unglücklich. Zählen Sie alles "l"s:
Quelltext
1:
| lll11ll1l111l1lll11111ll111ll111ll111l1l1l1lll11l |
elle333 - So 16.01.11 14:36
Luckie hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4:
| for i := 1 to l do begin k := StrToInt (EdKapital.Text) ; z := StrToInt (EdZinsen.Text) ; |
Warum liest du immer wieder die Eingabe ein? Und "l" als Variable zu benutzen ist eher unglücklich. Zählen Sie alles "l"s:
Quelltext 1:
| lll11ll1l111l1lll11111ll111ll111ll111l1l1l1lll11l | |
das mit dem l ist mir auch schon aufgefallen hab jetzt L als variable
Die Eingabe muss ich doch einlesen, sonst kann ich doch gar nicht mit den Werten rechnen, oder hab ich da was falsch verstanden.
Das einzige problem ist bei mir momentan, dass es irgenwie diese Zeile nicht beachtet
er rechnet nur das erste jahr (L = Laufzeit)
ab dem zweiten jahr kommt jedes mal der wert des ersten jahres raus also steht dann in der listbox zum beispiel 5 mal 120
wenn ich die die laufzeit 5 eingegben hab
Delete - So 16.01.11 15:48
Benutze eindeutige, aussagekräftige Bezeichner. Bezeichner bestehend aus einem Buchstaben sind das selten. Besser wäre laufzeitJahre oder so was.
Klar musst du sie einlesen, aber doch nur einmal. Das Ausgangsstartkapital ändert sich doch nicht.
Übrigens:
http://www.delphipraxis.net/157335-zinsberechnung-mit-do-schleife.html. Seid ihr in der gleichen Klasse oder wie?
elle333 - So 16.01.11 16:21
So hab jetzt die varibalen umbenannt
das problem ist immernoch das gleiche die schleife läuft leider nicht ab.
wenn ich zb. sage kapital 100 € Zins 5% laufzeit 3 Jahre
zeigt es in der Listbox an :
105
105
105
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:
| procedure TForm1.BuRechneClick(Sender: TObject); var i ,Kapital , Zins, Laufzeit : Integer; var Gesamtkapital: Real;
begin
Laufzeit := StrToInt(EdLaufzeit.Text) ; ListBox.Clear;
for i := 1 to Laufzeit do
begin
Kapital := StrToInt (EdKapital.Text) ; Zins := StrToInt (EdZinsen.Text) ; Gesamtkapital:= Kapital * (1+ (Zins/100)) ; ListBox.Items.Add (FloatToStr(Gesamtkapital)); EdGesamt.Text := FloatToStr(Gesamtkapital); end;
end;
end. |
platzwart - So 16.01.11 16:42
Delphi-Quelltext
1: 2: 3:
| Kapital:= StrToInt(EdKapital.Text); Zins:= StrToInt(EdZinsen.Text); Gesamtkapital:= Kapital * (1+ (Zins/100)); |
Fällt dir da nichts auf? Du rechnest doch mit Konstanten. Das Gesamtkapital wird immer wieder mit den selben Werten berechnet, wie soll da was anderes rauskommen? :nixweiss:
Delete - So 16.01.11 16:44
Du wirst diese Zeile
Gesamtkapital:= Kapital * (1+ (Zins/100)) ; tausendmal aufrufen können und es wird nichts anderes rauskommen. Auch wenn ich 2 x 2 tausend mal rechen wird 4 rauskommen. Du musst ja noch irgendwie die Jahre einfließen lassen. Den Fehler hat übrigen auch dein Kollege aus der Delphipraxis gemacht. Da du den von mir verlinkten Thread anscheinend nicht durchgelesen hast, hier noch mal meine Lösung:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| function ZinsesZins(StartKapital, Zins: Double; Jahre: Integer): Double; var i: Integer; begin if Zins <= 0 then Raise ERangeError.Create('Zins ist kleiner/ gleich Null'); if StartKapital <= 0 then Raise ERangeError.Create('Startkapital ist kleiner/gleich Null'); if Jahre < 0 then Raise ERangeError.Create('Jahre ist kleiner Null'); Result := StartKapital; for i := 1 to Jahre do begin Startkapital := Result; Result := Result*(Zins/100)+StartKapital; end; end; |
elle333 - So 16.01.11 19:02
danke leute habs jetzt hinbekommen
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!