• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

C++ Variablenumwandlung

scooter010

Klarapfel
Registriert
18.03.06
Beiträge
280
Moin!

Wir werden in der Schule grade ein wenig an C++ herangeführt. Ich habe schonmal ein wenig PHP gemacht und deswegen weniger schwierigkeiten als der Rest der Klasse *puh* :)

Wir erstellen kleine Kommandozeilenprogis, mit Zinseszinsrechnung, also wirklich nur ganz einfach um an die Sprache herangeführt zu werden. ich weiß nun, das dies kein C++ Ferum ist, doch habe ich kein Interesse daran mich erst bei einem Anzumelden für eine Frage, die so einfach sein sollte, dass man sie mir auch hier beantworten kann.

Wir definieren Variablen als "double" und mein Progi funktioniert auch total Klasse (auch wenns sicherlich verbesserbar ist^^). Aber wenn man bei der Eingabe der Zahlen aus Versehen (oder mit Absicht) Buchstaben eingibt, fällt das Programm in eine von zwei (je nach Ort der Fehleingabe, die im Quellcode jeweils nächste) while Schleifen und wiederholt diese unendlich. Eine Unterbrechung ist nicht möglich, da die Bedingung der Schleife eine Variable ist, die Innerhalb der Schleife vom benutzer eingegeben werden soll. Aber alle "std::cin" werden ignoriert ab der Falscheingabe. Initalisiert man die Bedingungsvariable innerhalb der Schleife neu und setzt sie auf einen anderen Wert, so das die Bedingung TRUE sein muss, springt er im Code zur nächsten Schleife die diese eine Variable behandelt und dort das gleiche Spiel -> Endlosschleife

Ich habe nun den Debugger geöffnet, das Programm pausieren lassen und nachschauen wollen, was in dieser "Fehlerhaften" Variable gespeichert ist: Suprise, Surprise -> 0 (also wirklich 0 denn Hexdezimal 0x0). Eine völlig andere Variable ("i") wurde mit 0 initialisiert, hat aber komischerweise der wert 0xffffffffff (mein lehrer nannte es high value), obwohl nie aufgerufen. Und die Variable, in die der Falsche Datentyp eingegeben wurde enthält auch 0x0.

Woran liegt das?

Mein lösungsansatz wäre, alle std::cin Variablen erst als Strings zu initalisieren und diese den nach der eingabe zu kontrollieren ob alles Zahlen sind (Komma bzw. Punkt als Trennzeichen erlaubt). Wenn ja umwandeln in double, wenn nicht zur Wiederholung der Eingabe auffordern. Leider weiß ich nicht wie man variablen Zeichen für Zeichen auf einen Wertebereich kontrolliert und denn auch noch umwandelt. Das wäre meine zweite frage, wie man sowas macht. (In PHP würde ich wohl mir arrays und foreach und reg_ex oder so ran gehen, wenn die Variablenverwaltung dort nicht so easy wäre^^)

Danke für eure geschätze Aufmerksamkeit! :-D
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
Poste mal den ganzen Code. Das ist mir sonst zu verworren

Alex
 

scooter010

Klarapfel
Registriert
18.03.06
Beiträge
280
Code:
#include <iostream>
#pragma hdrstop
using namespace std;
#include <string>

void kontrolle(double &value, string text) 
{

    while(value <= 0)
    {
        cout << text;
        cin >> value;
    }
    
}

void zins()
{
    double Kin = 0;        //(Jährliche) Kapitaleingabe
    double p = 0;        //Zinssatz in %
    double tin = 0;        //Laufzeit oder Einzahlunsjahre (Benutzereingabe)
    double i = 0;        //Zählervariable (Hilfsvariable)
    double K1 = 0;        //Fehlerstatus
    //START des Eingabenformulars------------------------
    cout << "Geben Sie erneut die jaehrlich zu sparende Geldmenge ein:                     ";
    cin >> Kin;
    kontrolle(Kin, "\nUngueltige Eingabe: Geben Sie erneut die jaehrlich zu sparende Geldmenge ein: ");
    
    cout << "\nDer Zinssatz in Prozent zu dem gespart wird:                                  ";
    cin >> p;
    kontrolle(p, "\nUngueltige Eingabe: Der Zinssatz in Prozent zu dem gespart wird:              ");

    cout << "\nDie Anzahl der Jahre die gespart wird:                                        ";
    cin >> tin;
    kontrolle(tin, "\nUngueltige Eingabe: Die Anzahl der Jahre die gespart wird:                    ");

    //ENDE des Eingabeformulars--------------------------
    //START der Berechnung-------------------------------
    while(i<tin)
    {    
        double Kneu = K1 + Kin;
        double Z = (p*Kneu)/100;
        K1 = Kneu + Z;
        ++i;
    }
    double Zg = K1 - Kin * tin;
    //ENDE der Berechnung--------------------------------
    //START der Ausgabe
    cout << "Sie haben in " << tin << " Jahren >> " << K1 << " << Euro gespart.\n";
    cout << "Das bedeutet Sie haben >> " << Zg << " << Euro Zinsen erhalten.\n";
    //ENDE der Ausgabe-----------------------------------

}

void rente()
{
    double Kin = 0;        //(Jährliche) Kapitaleingabe
    double p = 0;        //Zinssatz in %
    double i = 0;        //Zählervariable (Hilfsvariable)
    double a = 0;        //Zeitpunkt der Geldentnahme
    double Kout = 0;    //Jährliche Kapitalauszahlung
    //START des Eingabenformulars------------------------
    cout << "Geben Sie Ihr Startkapital (Erbe) ein:                              ";
    cin >> Kin;
    kontrolle(Kin, "\nUngueltige Eingabe: Geben Sie erneut Ihr Startkapital (Erbe) ein:   ");
    cout << "\nDer Zinssatz in Prozent zu dem gespart wird:                        ";
    cin >> p;
    kontrolle(p, "\nUngueltige Eingabe: Der Zinssatz in Prozent zu dem gespart wird:    ");
    cout << "\nWieviel Geld wird jaehrlich entnommen?                              ";
    cin >> Kout;
    kontrolle(Kout, "\nUngueltige Eingabe: Wieviel Geld wird jaehrlich entnommen?          ");
    cout << "\nWann wird das Geld entnommen?\n";
    cout << "Am Jahresanfang (0) oder Jahresende (1)                                     ";
    cin >> a;
    while(a != 0 || a != 1)
    {
        cout << "\nUngueltige Eingabe: Wann wird das Geld entnommen?\n";
        cout << "Am Jahresanfang (0) oder Jahresende (1)                                       ";
        cin >> a;
    }
    //ENDE des Eingabeformulars--------------------------
    //START der Berechnung-------------------------------
    if(a == 0)
    {
        //START der Berechnung bei Geldentnahme am Jahresanfang-----
        double Kneu = Kin - Kout;
        double Z = (p*Kneu)/100;
                
        //START Überprfüfung ob Zinsen größer als Geldentnahme?--
        if(Kout <= Z)
        {
            cout << "\nIhr Kapital wird nie Ausgehen, da die Zinsen groesser oder gleich der Geldentnahme sind.";
        }
        //ENDE Überprüfung--
        else
        //START der Berechnung--
        {    
            Kneu = Kin;
            while(Kneu >= Kout)
            {
                Kneu = Kneu - Kout;
                Z = (p*Kneu)/100;
                Kneu = Kneu + Z;
                ++i;
            }
            cout << "\nIhr Kapital reicht >> " << i << " << Jahre.\n";
            cout << "Es bleiben im letzten Jahr >> " << Kneu << " << Euro ueber.";
        }
        //ENDE der Berechnung--
        //ENDE der Berechnung bei Geldentnahme am Jahresanfang-----
    }
    else
    {
        //START der Berechnung bei Geldentnahme am Jahresende-----
        double Z = (p*Kin)/100;
        //START Überprfüfung ob Zinsen größer als Geldentnahme?--
        if(Kout <= Z)
        {
            cout << "\nIhr Kapital wird nie Ausgehen, da die Zinsen groesser oder gleich der Geldentnahme sind.";
        }
        //ENDE Überprüfung--
        else
        //START der Berechnung--
        {
            double Kneu = Kin;
            while(Kneu >= Kout)
            {
                Z = (p*Kneu)/100;
                Kneu = Kneu + Z - Kout;
                ++i;
            }
            cout << "\nIhr Kapital reicht >> " << i << " << Jahre.\n";
            cout << "Es bleiben im letzten Jahr >> " << Kneu << " << Euro ueber.";
        }
        //ENDE der Berechnung--
        //ENDE der Berechnung bei Geldentnahme am Jahresende-----
    }
}
//Ende des 2. Unterprogramms-----------------------------------------------------------

int main (int argc, char * const argv[]) {
    //START Hauptprogramm-------------------------------------------------------------------------------------------------
    double repeat = 1;    //Programmwiederholungsvariable
    while(repeat > 0)
    {
        //START Variablen (zurück-)setzen-----------------------------------------------------------------
        double Kneu = 0;    //Kapital für die jährliche Berechnungsgrundlage
        double K1 = 0;        //Fehlerstatus
        double Kin = 0;        //(Jährliche) Kapitaleingabe
        double Kout = 0;    //Jährliche Kapitalauszahlung
        double Z = 0;        //Zinsen
        double p = 0;        //Zinssatz in %
        double tin = 0;        //Laufzeit oder Einzahlunsjahre (Benutzereingabe)
        double tout = 0;    //Zeitpunkt ab dem Geld abgeschöpft wird
        double i = 0;        //Zählervariable (Hilfsvariable)
        double vote = 0;    //Programmauswahl
        //ENDE Variablen (zurück-)setzen------------------------------------------------------------------
        
        //START der Unterprogrammauswahl------------------------------------------------------------------
        cout << "\n\n\n";
        cout << "-------------------------------------------------------------------------------------\n\n";
        cout << "Berechnungsmethode auswählen:\n";
        cout << "Zinsen und Kapital über Kapitaleinlage, Zinsen und Laufzeit errechnen?            (1)\n";
        cout << "Errechnen, wie lange mein Ersparrtes als Rente reicht?                            (2)\n";
        cout << "Sie errechnen wie viele Jahre ihr aktueller Rentensparplan reicht                 (3)\n";
        cout << " > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Auswahl:  ";
        cin >> vote;
        cout << "\n";
        cout << "-------------------------------------------------------------------------------------\n\n";
        //ENDE der Unterprogrammauswahl-------------------------------------------------------------------
        
        //START der Unterprogramme------------------------------------------------------------------------
        //START des 1. Unterprogramms----------------------------------------------------------
        if(vote == 1)
        {
            zins();
        }
        
        //Ende des 1. Unterprogramms-----------------------------------------------------------
        else
        //START des 2. Unterprogramms----------------------------------------------------------
        
        {
            if(vote == 2)
            {
                rente();
            }
            else
            //START 3. Unterprogramm
            {
                //START des Eingabenformulars------------------------
                cout << "Geben Sie erneut die jaehrlich zu sparende Geldmenge ein:                     ";
                cin >> Kin;
                while(Kin <= 0)
                {
                    cout << "\nUngueltige Eingabe: Geben Sie erneut die jaehrlich zu sparende Geldmenge ein: ";
                    cin >> Kin;
                }
                cout << "\nDer Zinssatz in Prozent zu dem gespart wird:                                  ";
                cin >> p;
                while(p <= 0)
                {
                    cout << "\nUngueltige Eingabe: Der Zinssatz in Prozent zu dem gespart wird:              ";
                    cin >> p;
                }
                cout << "\nDie Anzahl der Jahre die gespart wird:                                        ";
                cin >> tin;
                while(tin <= 0)
                {
                    cout << "\nUngueltige Eingabe: Die Anzahl der Jahre die gespart wird:                    ";
                    cin >> tin;
                }
                cout << "\nWieviel Geld wird jährlich entnommen?                                         ";
                cin >> Kout;
                while(Kout <= 0)
                {
                    cout << "\nUngueltige Eingabe: Wieviel Geld wird jaehrlich entnommen?                    ";
                    cin >> Kout;
                }
                cout << "\nNach wie vielen Jahren wird mit der Geldentnahme begonnen?                    ";
                cin >> tout;
                while(tout < 0)
                {
                    cout << "\nUngueltige Eingabe:Nach wie vielen Jahren wird mit der Geldentnahme begonnen? ";
                    cin >> tout;
                }
                //ENDE des Eingabeformulars--------------------------
                
                //START Berechnung
                while(Kneu < Kout && K1 == 0)
                {
                    if(i < tout)
                    {
                        Kneu = Kneu + Kin;
                        Z = (Kneu * p) / 100;
                        Kneu = Kneu + Z;
                        ++i;
                    }
                    else
                    {
                        K1 = 2;
                        Kneu = Kin;
                    }
                }
                if(K1 != 2 || i == 0)
                {
                    K1 = 0;
                    while(Kneu >= Kout)
                    {
                        if(i <= tin)
                        {
                            Kneu = Kneu + Kin;
                        }
                        if(i >= tout)
                        {
                            Kneu = Kneu - Kout;
                        }
                        Z = (Kneu * p) / 100;
                        Kneu = Kneu + Z;
                        ++i;
                        if(Z > Kout)
                        {
                            Kneu = 0;
                            K1 = 1;
                        }
                    }
                }
                //ENDE Berechnung
                //START Ausgabe
                if(K1 == 0)
                {
                    cout << "\nDer Sparplan reicht fuer >> " << i << " << Jahre.\n";
                    cout << "Es bleiben >> " << Kneu << " << Euro ueber.";
                }
                else
                {
                    if(K1 == 1)
                    {
                        cout << "\nIhr Kapital wird nie Ausgehen, da die Zinsen groesser sind, als die Geldentnahme.";
                    }
                    else
                    {
                        cout << "\nIhr Einzahlungsbetrag ist zu gering, als das zum Zeitpunkt der ersten Abhebung genuegend\n";
                        cout << "Geld zur Verfuegung stehen wuerde!";
                    }
                }
                //ENDE Ausgabe
            }
            //ENDE 3. Unterprogramm
        }
        //ENDE Unterprogramme
        cout << "\n\n";
        cout << "Neue Berechnung durchfuehren? (1=Ja|0=Nein)\n";    
        cin >> repeat;
    }
    cout << "\n\n\nDas Programm beendet sich in 3 Sekunden Selbstständig\n";
    double i = 3;
    while(i >= 1)
    {
        cout << i << " Sek.\n";
        system("sleep 1");
        --i;
    }
    cout << "Good Bye!\n";
    system("exit");
    //ENDE Hauptprogramm--------------------------------------------------------------------------------------------------
    return 0;
}
 

scooter010

Klarapfel
Registriert
18.03.06
Beiträge
280
naja, hab das jetzt hinbekommen, nur jetzt habe ich ein anderes Problem:

Code:
    string text = "Wird das Geld am Jahresanfang (0) oder Jahresende (1) entnommen?";
    char* value;
    cout << "\n" << text;
    cin >> value;
    char *ep;
    double value1 = strtod(value, &ep);
    while(!(ep == NULL && (value1 == 0 || value1 == 1)))
    {
        cout << "\nUngueltige Eingabe: " << text;
        cin >> value;
        value1 = strtod(value, &ep);
    }

eal was eingegeben wird, er wiederholt die schleife, obwohl die bedingung in der klammer wenn man 0 oder 1 eingibt false sein müsste...