Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Zählschleife (https://www.delphipraxis.net/104926-zaehlschleife.html)

foerster7892 12. Dez 2007 21:58


Zählschleife
 
Kann mir bitte jemand sagen wo der Fehler ist

Delphi-Quellcode:
unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button1: TButton;
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Label2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4; Startguthaben, Endguthaben, Zinsen, monatlicherBetrag, Zinssatz, laufvariable: real;
  a: Integer;

implementation

{$R *.dfm}

procedure TForm4.Edit1Change(Sender: TObject);
begin
startguthaben := StrToFloat(Edit1.Text);
end;

procedure TForm4.Edit2Change(Sender: TObject);
begin
zinssatz := StrToFloat(Edit2.Text);
end;

procedure TForm4.Edit3Change(Sender: TObject);
begin
monatlicherBetrag := StrToFloat(Edit3.Text);
end;

procedure TForm4.Button1Click(Sender: TObject);
begin
a := 0;
Zinsen := 0;
For a :=1 to 12 do begin;
repeat
Startguthaben := Startguthaben + monatlicherBetrag;
Zinsen := 1/12*Startguthaben/100*Zinssatz;
until a=12;
Endguthaben := Zinsen + startguthaben;
Label2.Caption := FloatToStr(Endguthaben);
Label1.Caption := FloatToStr(Zinsen);
end;
end;
Das Programm soll die Zinsen und das Neue Guthaben für ein Jahr berechnen wenn jeden Monat ein gleicher Betrag auf das Konto gezahlt wird
Danke im Vorraus

taaktaak 12. Dez 2007 22:00

Re: Zählschleife
 
Was hast du denn für einen Fehler?

// edit : da sind 'ne Menge Unklarheiten :stupid:

mkinzler 12. Dez 2007 22:01

Re: Zählschleife
 
Lass das repeat...until weg den es erzeugt ne Endlosschleife. Zudem macht das For das ja schon

foerster7892 12. Dez 2007 22:03

Re: Zählschleife
 
Dann komt der Fehler Decleration expected but end of file found

Martin K 12. Dez 2007 22:04

Re: Zählschleife
 
Hallo,
Zählvariablen sollten immer lokal sein, du hast alle Variablen global, das ist nicht gut und wird zumindest bei Zählvariablen sogar vom Compiler als Fehler gemeldet.

Deine Variable a: Integer müsste also in der Prozedur procedure TForm4.Button1Click(Sender: TObject); als lokale Variable stehen.

foerster7892 12. Dez 2007 22:06

Re: Zählschleife
 
Danke für deine Hilfe aber ich bin kein Fachmann kannst du bitte genauer erklären

taaktaak 12. Dez 2007 22:06

Re: Zählschleife
 
Na, wenn dein Ausriss wirklich der GESAMTE Code ist, dann fehlt m.E. zum Schluß ein "end." Na, und dann ist a:=0 überflüssig, wenn du a gleich darauf als Schleifenzähler verwendest (a sollte auch lokal deklariert werden)

foerster7892 12. Dez 2007 22:11

Re: Zählschleife
 
Delphi-Quellcode:
unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button1: TButton;
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Label2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4; Startguthaben, Endguthaben, Zinsen, monatlicherBetrag, Zinssatz, laufvariable: real;
  a: Integer;

implementation

{$R *.dfm}

procedure TForm4.Edit1Change(Sender: TObject);
begin
startguthaben := StrToFloat(Edit1.Text);
end;

procedure TForm4.Edit2Change(Sender: TObject);
begin
zinssatz := StrToFloat(Edit2.Text);
end;

procedure TForm4.Edit3Change(Sender: TObject);
begin
monatlicherBetrag := StrToFloat(Edit3.Text);
end;

procedure TForm4.Button1Click(Sender: TObject);
begin
Zinsen := 0;
For a :=1 to 12 do begin;
Startguthaben := Startguthaben + monatlicherBetrag;
Zinsen := 1/12*Startguthaben/100*Zinssatz;
Endguthaben := Zinsen + startguthaben;
end;
Label2.Caption := FloatToStr(Endguthaben);
Label1.Caption := FloatToStr(Zinsen);
end;
end.
sieht jetzt so aus funktioniert aber immer noch nich

Martin K 12. Dez 2007 22:12

Re: Zählschleife
 
Hallo, ich denke die letzte Prozedur sollte so aussehen:
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
var a: Integer; // <--- hier wird die Variable lokal definiert
begin
  Zinsen := 0;
  For a :=1 to 12 do
  begin // <-- nach dem begin Semikolon entfernt
    Startguthaben := Startguthaben + monatlicherBetrag;
    Zinsen := 1/12*Startguthaben/100*Zinssatz;
  end;
  Endguthaben := Zinsen + startguthaben;
  Label2.Caption := FloatToStr(Endguthaben);
  Label1.Caption := FloatToStr(Zinsen);
end;
Ist es das was du meinst?

Ach ja, und die Variable a kannst du dann oben, wo die ganzen globalen Variablen stehen weglassen ;)
Hoffe ich konnte helfen...

//Edit:
Kommentar in den Code hinzugefügt

//Edit 2:
ja, das Semikolon nach dem begin sollte natürlich weg, ist mir gar nicht aufgefallen

mkinzler 12. Dez 2007 22:12

Re: Zählschleife
 
begin;

taaktaak 12. Dez 2007 22:16

Re: Zählschleife
 
Die global Variable "Laufvariable" ist überflüssig. Tja, und dann erscheint mir das mit den Zinsen auch merkwürdig (bin ja kein Bankkaufmann, aber immerhin) >> die werden bei jedem Schleifendurchgang neu berechnet! Müssen die nicht zum jeweils vorherigen Ergebnis addiert werden (sonst wäre auch die Initialisierung Zinsen:=0 vor der Schleife überflüssig)?

foerster7892 12. Dez 2007 22:19

Re: Zählschleife
 
[Pascal Error] Unit4.pas(23): E2065 Unsatisfied forward or external declaration: 'TForm4.Label2Click'

jetzt kommt der Fehler ich versteh das nicht ich meine das stimmt doch jetzt alles

und wegen der formel ich berechne für jeden Monat (1/12) die Zinsen da jeden Monat ein bestimmter betrag eingezahlt wird und das wird dann addiert

Martin K 12. Dez 2007 22:22

Re: Zählschleife
 
Zitat:

Zitat von foerster7891
[Pascal Error] Unit4.pas(23): E2065 Unsatisfied forward or external declaration: 'TForm4.Label2Click'

Wahrscheinlich deswegen:
Delphi-Quellcode:
unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button1: TButton;
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Label2Click(Sender: TObject); // <-- diese Zeile entfernen!
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations } 
  public
    { Public declarations } 
  end;

taaktaak 12. Dez 2007 22:24

Re: Zählschleife
 
Joo, dann musst du die Label2Click deklaration im Kopf löschen, wenn es das Label2 nicht mehr gibt.
Aber die Formel ist trotzdem merkwürdig, die Zinsen werden nur außerhalb der Schleife addiert. Du addierst dort nur den Zinsbetrag, der im 12ten Schleifendurchlauf berechnet wurde! Bist du Bankdirektor? Solange die Kunden das nicht merken, machst du gute Gewinne (hihihi)

foerster7892 12. Dez 2007 22:26

Re: Zählschleife
 
Danke erstmal aber ich weiß auch nicht hier kommt ein Problem nach dem anderen
[Pascal Warning] Unit4.pas(56): W1019 For loop control variable must be simple local variable

und taaktaak wenn du den Trockentest machst weißt du das die stimmt
(und ich bin Schüler der 10. Klasse)
Zinseszins berechnet sich erst am Ende des Jahres

Schuldigung ich nehm alles zurück da ist ein Fehler

+Zinsen fehlt aber das Programm müsste trotzdem laufen

Martin K 12. Dez 2007 22:30

Re: Zählschleife
 
Beachte das mit der lokalen Variable, was ich in Beitrag #9 geschrieben habe.

rawsoul 12. Dez 2007 22:31

Re: Zählschleife
 
Zitat:

Zitat von foerster7891
[Pascal Warning] Unit4.pas(56): W1019 For loop control variable must be simple local variable

Du hast anscheinend immernoch deine Zählvariable global deklariert. Wurde doch bereits angesprochen, sogar mit Codesnippet von Martin K.


//Edit: Huch, wo kommt denn auf einmal die zweite Seite her :roll:

taaktaak 12. Dez 2007 22:36

Re: Zählschleife
 
Jooo, mein lieber Förster,
dass wir uns nicht falsch verstehen: Das sollte wirklich nur ein kleiner Scherz sein! Und lass dich nicht aus der Ruhe bringen - manchmal ist der Wurm drin, in so einem kleinen Programm! Das bekommst du schon hin!
So, Schluss jetzt! Und Gute Nacht!
Gruß Ralph

foerster7892 12. Dez 2007 22:45

Re: Zählschleife
 
The Label2Click methode referenced by Label2.OnClick does not exist. Remove the referance

das ist der Fehler der jetzt kommt

und danke für die Hilfe

Delphi-Quellcode:
unit Unit4;

interface

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

type
  TForm4 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button1: TButton;
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
    procedure Edit3Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4; Startguthaben, Endguthaben, Zinsen, monatlicherBetrag, Zinssatz, laufvariable: real;

implementation

{$R *.dfm}

procedure TForm4.Edit1Change(Sender: TObject);
begin
startguthaben := StrToFloat(Edit1.Text);
end;

procedure TForm4.Edit2Change(Sender: TObject);
begin
zinssatz := StrToFloat(Edit2.Text);
end;

procedure TForm4.Edit3Change(Sender: TObject);
begin
monatlicherBetrag := StrToFloat(Edit3.Text);
end;

procedure TForm4.Button1Click(Sender: TObject);
var a: integer;
begin
Zinsen := 0;
For a :=1 to 12 do begin;
Startguthaben := Startguthaben + monatlicherBetrag;
Zinsen := 1/12*Startguthaben/100*Zinssatz+Zinsen;
Endguthaben := Zinsen + startguthaben;
end;
Label2.Caption := FloatToStr(Endguthaben);
Label1.Caption := FloatToStr(Zinsen);
end;
end.
und so siehts jetzt aus

Martin K 12. Dez 2007 22:49

Re: Zählschleife
 
Ist das nicht eine Meldung bei der du auf Yes / No klicken kannst?
Wenn ja, klicke einfach auf 'Yes', wenn nicht musst du im Object Inspector bei Label2 das, was unter dem Event 'OnClick' steht, entfernen.

foerster7892 12. Dez 2007 22:51

Re: Zählschleife
 
dann stürzt Delphi ab

ich clicke immer zuerst auf yes/ja

foerster7892 12. Dez 2007 22:55

Re: Zählschleife
 
Beim 2. mal Hat es nun Funktioniert

Hier mit bedanke ich michh bei allen die mir geholfen haben und wünsche ihnen noch einen schönen(4Minütigen) Tag


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz