Autor |
Beitrag |
elle333
      
Beiträge: 19
|
Verfasst: Sa 15.01.11 23:45
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
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
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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
elle333 
      
Beiträge: 19
|
Verfasst: So 16.01.11 02:12
elundril hat folgendes geschrieben : | 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 |
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
Zuletzt bearbeitet von elle333 am So 16.01.11 12:33, insgesamt 1-mal bearbeitet
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 16.01.11 11:20
Na, an welcher Stelle in deinem Programm wird denn für jedes Jahr das Kapital berechnet?
|
|
elle333 
      
Beiträge: 19
|
Verfasst: 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.
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
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: So 16.01.11 13:48
Folende Zeile:
Delphi-Quelltext
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.
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Für diesen Beitrag haben gedankt: elle333
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 16.01.11 14:22
|
|
elle333 
      
Beiträge: 19
|
Verfasst: 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
Delphi-Quelltext
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
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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: www.delphipraxis.net...mit-do-schleife.html. Seid ihr in der gleichen Klasse oder wie?
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: So 16.01.11 16:11
Darf ich die diese beiden "Bücher" ans Herz legen?
Christians Crashkurs
Delphi-Wikibook
Damit solltest du sicher weiterkommen.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Für diesen Beitrag haben gedankt: elle333
|
|
elle333 
      
Beiträge: 19
|
Verfasst: 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
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: So 16.01.11 16:42
_________________ Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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; |
Für diesen Beitrag haben gedankt: elle333
|
|
elle333 
      
Beiträge: 19
|
Verfasst: So 16.01.11 19:02
danke leute habs jetzt hinbekommen
|
|
|