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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Sa 15.01.2011 um 22:50


elundril - Sa 15.01.11 23:50

user profile iconelle333 hat folgendes geschrieben Zum zitierten Posting springen:

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

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconelle333 hat folgendes geschrieben Zum zitierten Posting springen:

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


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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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:


Delphi-Quelltext
1:
g := k * (0.01*z) ;                    


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

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:

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


Delphi-Quelltext
1:
  for i := 1 to L do                    


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?


elundril - So 16.01.11 16:11

Darf ich die diese beiden "Bücher" ans Herz legen?

Christians Crashkurs [http://www.christian-stelzmann.de/index_tutorials_crashkurs.html]
Delphi-Wikibook [http://de.wikibooks.org/wiki/Programmierkurs:_Delphi]

Damit solltest du sicher weiterkommen.

lg elundril


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