1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

C++ Variablenumwandlung

Dieses Thema im Forum "OS X-Developer" wurde erstellt von scooter010, 21.03.08.

  1. scooter010

    scooter010 Klarapfel

    Dabei seit:
    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
     
  2. below

    below Kalterer Böhmer

    Dabei seit:
    08.10.06
    Beiträge:
    2.865
    Poste mal den ganzen Code. Das ist mir sonst zu verworren

    Alex
     
  3. scooter010

    scooter010 Klarapfel

    Dabei seit:
    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;
    }
    
     
  4. scooter010

    scooter010 Klarapfel

    Dabei seit:
    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...
     

Diese Seite empfehlen