Variable übernimmt nicht das was sie soll



  • Hey Leute

    Bin dabei C++ zu lernen und acker gerade ein Buch durch. Bin gerade bei Übungsaufgaben aber komme dort leider nicht weiter... und Lösungen gibt es dafür auch keine.

    Also die Aufgabe ist:
    Man soll Zahlen mit Werten wie cm, inch, m und ft eingeben.
    Dann werden diese Werte in Meter umgerechnet.
    Am Ende wird ausgegeben, was der bisher kleinste und bisher größte Wert war.

    val1 = kleinste Zahl
    val2 = größte Zahl

    Das Programm funzt auch an sich wie es soll, nur mit der ersten Eingabe, sollen die double val1 und val2 auf den gleichen Wert x gesetzt werden, den ich als erstes eingebe.
    Komischerweise übernimmt bei 0cm, val1 auch "0 Meter", aber bei val2 steht dann 6.95335e-310 Meter "...

    Und wenn ich 1cm eingebe, dann steht bei val1 "62.0756e-317 Meter" und bei val2 "0.01 Meter"...

    Woran liegt das?

    Hier ist das Programm:

    int main()
    {
        double x;           // Eingabe -> Größe
        double val1;        // Kleinste Zahl
        double val2;        // Größte Zahl
        string wert;        // Eingabe -> Wert
        char wert1;         // Erster Buchstabe von Wert
        while(0 < 1) {      // KA was ich ich sonst eingeben soll dass sich die schleife immer wiederholt
            cin >> x >> wert;
            wert1 = wert[0];      // Wandelt ersten Buchstaben von string in char um
            switch(wert1) {
                case 'c':       // cm
                    x=x/100;
                    break;
                case 'm':       // m
                    x=x;
                    break;
                case 'i':       // inch
                    x=x*2.54/100;
                    break;
                case 'f':       // ft
                    x=x*12*2.54/100;
                    break;
                default:
                    cout << "Bitte geben sie cm, inch, m oder ft ein!\n";
            }
            if(val1 && val2 == 0) {
                val1=x;
                val2=x;
            }
            else {
                if(x < val1) {
                    val1 = x;
                }
                else {
                    if(x > val2) {
                        val2 = x;
                    }
                }
            }
            cout << "Bisher kleinster Wert:    " << val1 << " Meter\n";
            cout << "Bisher grösster Wert:     " << val2 << " Meter\n";
        }
    }
    

    Schonmal Danke 😃



  • // ...
            if(val1 == 0 && val2 == 0) {
                val1=x;
                val2=x;
            }
    // ...
    
    }
    


  • Das hilft iwie auch nicht weiter.



  • Du hast vergessen, die beiden Variablen am Anfang zu initialisieren - das heißt, sie erhalten bis zur ersten Zuweisung einen unbestimmten Wert.

    PS: alle Variablen am Anfang der Funktion zu definieren war in C++ noch nie nötig 😉 Und für Endlosschleifen gibt es auffälligere Lösungen wie for(;; ) oder while(true)



  • Ok danke, habe es jetzt geändert:

    double val1 = '0';
    double val2 = '0';
    

    Jetzt kommt aber bei der Eingabe von 1cm:

    Bisher kleinster Wert: 0.01 Meter
    Bisher grösster Wert: 48 Meter

    Das ist ja auch nicht wirklich richtig oO

    Das mit der Whileschleife funktioniert, danke 😃

    Warum funzt das alles immernoch nicht? Weiß einer noch ne Lösung?...



  • Naja, richtig ist das schon ;P '0' == 48. Du hast halt intern ein cast von char nach int erreicht, laut ASCII-Tabelle ist '0' der Wert 48. Lass die ' ' weg und es sollte funzen.



  • Ahh vielen Dank, jetzt funzt es 😃

    Hier das funzende:

    #include "std_lib_facilities.h"
    
    int main()
    {
        double x;
        double val1 = 0;
        double val2 = 0;
        string wert;
        char wert1;
        while(true) {
            cin >> x >> wert;
            wert1 = wert[0];
            switch(wert1) {
                case 'c':
                    x=x/100;
                    break;
                case 'm':
                    x=x;
                    break;
                case 'i':
                    x=x*2.54/100;
                    break;
                case 'f':
                    x=x*12*2.54/100;
                    break;
                default:
                    cout << "Bitte geben sie cm, inch, m oder ft ein!\n";
            }
            if(val1 == 0 && val2 == 0) {
                val1=x;
                val2=x;
            }
            else {
                if(x < val1) {
                    val1 = x;
                }
                else {
                    if(x > val2) {
                        val2 = x;
                    }
                }
            }
            cout << "Bisher kleinster Wert:    " << val1 << " Meter\n";
            cout << "Bisher grösster Wert:     " << val2 << " Meter\n";
        }
    }
    


  • Ist zwar nur eine Kleinigkeit, aber die die Prüfung, welche Einheit der Nutzer eingegeben hat, ist etwas ungenau und unflexibel. Was kommt heraus, wenn er "cl" (Zentiliter - bestimmt keine Längeneinheit) oder "fische" eingibt? Was macht du, wenn du das Programm später mal auf Meilen oder mm erweitern willst?

    (btw, was soll herauskommen, wenn der erste eingegebene Wert tatsächlich 0 ist?)



  • Habe ich noch gar nicht dran gedacht oO

    Habs halt jetzt blind gemacht wie es die Übungsaufgabe verlangt.

    Und des mit 0 ist auch nicht so das Wahre ich weiß, aber kümmert mich gerade recht wenig 😃



  • Bumblebee schrieb:

    Habe ich noch gar nicht dran gedacht oO

    Habs halt jetzt blind gemacht wie es die Übungsaufgabe verlangt.

    Und des mit 0 ist auch nicht so das Wahre ich weiß, aber kümmert mich gerade recht wenig 😃

    Nun ja ... man muss sich immer überlegen, wozu denn Übungsaufgaben gut sein könnten ...


Anmelden zum Antworten