Problem mit meinem Zinsenprogramm
-
Hallo!
Ich stehe noch ziemlich am Anfang der C++ Programmierkünste, aber dennoch habe ich schon so meine Probleme damit

Also folgendes:
Ich habe mit Hilfe eines Buches ein Programm geschrieben, welches die Kapitalerhöhung in Abhängigkeit von Laufzeit und Prozentsatz ausrechnet. Dabei wird allerdings kein Zinseszins berechnet. Aber dies wollte ich nun aus eigen Regie hinzufügen. Leider habe ich es nicht ganz geschafft. ich denke, dass dürfte für euch kein Problem sein. Ich poste hier einfach mal die beiden codes, in denen die Fehler angeblich stecken. Sollte der Fehler trotzdem nicht ersichtlich sein, kann man auch das ganze Programm downloaden (leider habe ich momentan keinen arbeitenden webspace, aber über homeftp oder email wäre das wohl zu regeln).
Vielen Dank euch im Voraus!!// ZinsenDlg.cpp : Implementierungsdatei // #include "stdafx.h" #include "Zinsen.h" #include "ZinsenDlg.h" #include "Zinsfkt.h" static char THIS_FILE[] = __FILE__; #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE #endif ///////////////////////////////////////////////////////////////////////////// // CZinsenDlg Dialogfeld CZinsenDlg::CZinsenDlg(CWnd* pParent /*=NULL*/) : CDialog(CZinsenDlg::IDD, pParent) { //{{AFX_DATA_INIT(CZinsenDlg) // HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein //}}AFX_DATA_INIT // Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CZinsenDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CZinsenDlg) DDX_Control(pDX, IDC_COMBO1, m_Ausgabe); DDX_Control(pDX, IDC_EDIT3, m_Laufzeit); DDX_Control(pDX, IDC_EDIT2, m_Zinssatz); DDX_Control(pDX, IDC_EDIT1, m_Startkapital); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CZinsenDlg, CDialog) //{{AFX_MSG_MAP(CZinsenDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(ID_BN_BERECHNEN, OnBnBerechnen) ON_BN_CLICKED(IDDOK, OnDok) ON_BN_CLICKED(IDC_MitZz, OnMitZz) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CZinsenDlg Nachrichten-Handler BOOL CZinsenDlg::OnInitDialog() { CDialog::OnInitDialog(); // Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt // wenn das Hauptfenster der Anwendung kein Dialogfeld ist SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden // ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten } // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie // den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das // Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt. void CZinsenDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // Gerätekontext für Zeichnen SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Symbol in Client-Rechteck zentrieren int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Symbol zeichnen dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer // das zum Symbol verkleinerte Fenster mit der Maus zieht. HCURSOR CZinsenDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CZinsenDlg::OnBnBerechnen() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen double startKapital, zinsSatz; int laufzeit; double Ertrag; char str[100]; //alte Werte aus der Liste löschen m_Ausgabe.ResetContent(); //Benutzereingaben einlesen m_Startkapital.GetWindowText(str, 100); startKapital = atof(str); m_Zinssatz.GetWindowText(str, 100); zinsSatz = atof(str); m_Laufzeit.GetWindowText(str, 100); laufzeit = (int) atof(str); //Kapitalentwicklung über die Jahre for (int i = 0; i <= laufzeit; i++) { Ertrag = ErtragOhneZinseszins( startKapital, zinsSatz, i ); sprintf(str,"%lf", Ertrag); m_Ausgabe.AddString(str); } m_Ausgabe.SetCurSel(laufzeit); } void CZinsenDlg::OnDok() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen exit(1); //programm verlassen } void CZinsenDlg::OnMitZz() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen //Variablen Definition double startKapital, zinsSatz; int laufzeit; double Ertrag; char str[100]; //alte Werte aus der Liste löschen m_Ausgabe.ResetContent(); //Benutzereingaben einlesen m_Startkapital.GetWindowText(str, 100); startKapital = atof(str); m_Zinssatz.GetWindowText(str, 100); zinsSatz = atof(str); m_Laufzeit.GetWindowText(str, 100); laufzeit = (int) atof(str); //Kapitalentwicklung über die Jahre mit Zinseszins for (int i = 0; i <= laufzeit; i++) { Ertrag = ErtragMitZinseszins( startKapital, zinsSatz, i ); sprintf(str,"%lf", Ertrag); m_Ausgabe.AddString(str); } m_Ausgabe.SetCurSel(laufzeit); }#include "StdAfx.h" #include "Zinsfkt.h" double ErtragOhneZinseszins( double Startkapital, double prozZins, double laufzeit) { return Startkapital * ( 1 + prozZins/100.0 * laufzeit); } double ErtragMitZinseszins( double Startkapital, double prozZins, double laufzeit) { return Startkapital * (1 + prozZins / 100) ^ laufzeit; }Die Fehler, die der compiler ausspuckt, sehen folgendermaßen aus:
--------------------Konfiguration: Zinsen - Win32 Debug--------------------
Kompilierung läuft...
ZinsenDlg.cpp
D:\Programme\Visual C++ 6.0\MSDev98\MyProjects\Zinsen\ZinsenDlg.cpp(8) : warning C4518: 'static char ' : Unerwartete(r) Speicherklassen- oder Typbezeichner; wird ignoriert
D:\Programme\Visual C++ 6.0\MSDev98\MyProjects\Zinsen\ZinsenDlg.cpp(8) : error C2143: Syntaxfehler : Fehlendes ';' vor 'string'
D:\Programme\Visual C++ 6.0\MSDev98\MyProjects\Zinsen\ZinsenDlg.cpp(8) : fatal error C1004: Unerwartetes Dateiende gefunden
Zinsfkt.cpp
D:\Programme\Visual C++ 6.0\MSDev98\MyProjects\Zinsen\Zinsfkt.cpp(3) : warning C4518: 'double ' : Unerwartete(r) Speicherklassen- oder Typbezeichner; wird ignoriert
D:\Programme\Visual C++ 6.0\MSDev98\MyProjects\Zinsen\Zinsfkt.cpp(3) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'ErtragOhneZinseszins'
D:\Programme\Visual C++ 6.0\MSDev98\MyProjects\Zinsen\Zinsfkt.cpp(3) : fatal error C1004: Unerwartetes Dateiende gefunden
Generieren von Code...
Fehler beim Ausführen von cl.exe.Zinsen.exe - 4 Fehler, 2 Warnung(en)
Tut mir leid, dass dies hier ein so langer Text ist, aber ich hoffe so, dass ihr möglichst viele Informationen habt, um mir möglichst mühelos helfen zu können!
Grüße,
aRo
-
Hallo,
du hast offensichtlich zumindest eine Zeile, die vom Visual Studio automatisch in den Dateien erzeugt wird, verschoben
Die Zeile:
static char THIS_FILE[] = __FILE__;gehört in den #ifdef-block:
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endifDu solltest nach Möglichkeit nichts verändern in dem automatisch erzeugten Code. Jetzt sollten bedeutend weniger Fehler kommen.
Wenn immer noch Fehler kommen, liegt es an den Headern, dann solltest du vor allem Zinsfkt.h überprüfen, oder noch mal hier zeigen
MfG
-
hi!
danke für deine Hilfe! Also ich habe die header datei verschoben (kann mir zwar nicht vorstellen, dass ich sie früher mal einfach woanders hingetan habe, aber egal) so dass die header jetzt so aussehen:
#include "stdafx.h" #include "Zinsen.h" #include "ZinsenDlg.h" #include "Zinsfkt.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endifLeider sind die Fehler aber die gleichen geblieben

Grüße,
aRo
-
Zeig bitte mal den Inhalt der Datei Zinsfkt.h.
-
zinsfkt.h enthält lediglich diesen code hier:
#include <math.h> double ErtragOhneZinseszins( double startKapital, double prozZins, double laufzeit); double ErtragMitZinseszins( double Startkapital, double prozZins, double laufzeit)grüße,
aRo
-
Und? Fällt dir der Unterschied zwischen den beiden Funktionsdeklarationen auf?
Da liegt nämlich Dein Fehler.
-
*g*
danke dir!
wie ich das hasse....so kleine mist fehler, produzieren dann fehler, die ich nicht kapiere..^^
achja, ich habe nun aber schon das nächste problem. hat eigentlich nichts mit den anderen fehlern hier zu tun, aber ist das selbe programm.
wie potenziere ich denn?
also diese formel hier gefällt ihm nicht:
(Startkapital * (1 + prozZins / 100) )^laufzeitwie mach ich, dass die variable laufzeit hier als exponent fungiert?
grüße,
aRo
-
das "^" ist der bitweise-Exklusiv-OR-Operator, und kann nicht zum Potenzieren eingesetzt werden. Stattdessen gibt es dafür die Funktion pow:
double ErtragMitZinseszins( double Startkapital, double prozZins, double laufzeit) { return Startkapital * pow(1 + prozZins / 100, laufzeit); }(dazu ist <cmath> zu includieren)
MfG
-
vielen dank!
jetzt funktioniert alles!!
liebe grüße,
aRo