Variable mit String beschreiben



  • Hey,
    Ich bin seht neu in c++ und somit diesem Forum.
    Als eins meiner ersten Übungsprogramme habe ich mir vorgenommen einen
    Umrechner von Längenmäßen zu erstellen (Zentimeter,Inch,Foot,...).
    Dabei soll der Anwender die Möglichkeit haben sich das Ausgangsmaß und das
    Endmaß auszusuchen (z.b Inch in Zentimeter).
    Nun könnte man ja die Bedingung setzten, dass er die String Eingabe == "Inch"
    eingibt und dann als folge davon wieder jede übrige Größe als einzelne Bedingung angesehen wird.

    also:

    int main()
    {
    double Inch;
    double Zentimeter;
    double Foot;
    double Wert;
    string Eingabe;
    string Eingabe2;

    cout << "Umrechner von Längenmaßen" << endl << "Ausgangsgröße: "

    cin >> Eingabe;

    cout << "Endmaß: ";

    cin >> Eingabe2;

    cout << "Wert: ";

    cin >> Wert;

    if (Eingabe == "Inch")
    {
    if (Eingabe2 == "Zentimeter") {usw.}

    else if (Eingabe2 == "Foot") {usw.}

    }

    else if (Eingabe == "Zentimeter")
    {
    if (usw.)
    else if (usw.)
    }

    return 0;
    }

    Da dies aber sehr umständlich zu programmieren ist, da man bei jedem Fall jeden weiteren Fall betrachten muss, frage ich mich, ob man denn mit eine String-Eingabe eine Variable bezeichnen kann.
    Sprich man gibt ein cin >> "Inch" und das Programm erkennt dann, dass mit der String "Inch" die Variable Inch gemeint ist.

    Gibt es da einen Befehl?

    Danke schon mal für Antworten!

    MfG,
    Felix



  • Hallo Felix,

    Ersteinmal, die Frage verstehe ich jetzt nicht ganz... aber wenn du willst, dass "er" cin >> inch macht, wieso sollte er das bei cin >> "inch" machen ?
    Schreib doch gleich cin >> inch.

    Falls du willst, dass die Eingabe der Inch Variable zugewiesen wird, würde es etwa so gehen: (vorrausgesetzt eingabe und inch sind vom gleichen Typ)

    cin >> eingabe;
    inch = eingabe;

    Ich würde die ganze Sache für den Anfang vielleicht etwas leichter angehen und ein Program scheiben, dass eine feste Einheit hat, in die es umwandelt.
    Sprich "inch, foot und meter in cm"

    mfg

    Edit: Ich sehe schon, ich hab die Frage wohl nicht ganz kapiert ⚠


  • Mod

    Hier würde ich eine andere Herangehensweise empfehlen. Du bist für die Umrechnung nur in dem Zahlenwert der Länge interessiert. Es ist daher vollkommen egal, ob du den Wert in einer Variable namens inch , foot oder zentimeter speicherst. Nimm einfach etwas wie " wert ". Das könnte dann (als ganz simples Beispiel an dem man vieles besser machen könnte) so aussehen:

    #include <iostream>
    #include <string>
    #include <stdexcept>
    using namespace std;
    
    enum laengeneinheit
      {
        inch,
        zentimeter ,
        parsec,
        fuss
      };
    
    laengeneinheit eingabe_zu_einheit(const string &eingabe)
    {
      // Hier könnte man noch allerlei besser machen, aber dies ist bloß ein Beispiel:
      if (eingabe == "Inch")
        return inch;
      if (eingabe == "Zentimeter")
        return zentimeter;
      if (eingabe == "Parsec")
        return parsec;
      if (eingabe == "Fuss")
        return fuss;
      throw invalid_argument(eingabe + " ist keine bekannte Längeneinheit");
    }
    
    const double umrechnungstabelle[4][4] = {
      {1             , 2.54         , 8.2315794e-19 , 0.0833333    },
      {0.393701      , 1            , 3.24077929e-19, 0.0328084    },
      {1.21483369e18 , 3.08567758e18, 1             , 1.01236141e17},
      {12            , 30.48        , 9.87789527e-18, 1            }
    };
    
    int main()
    {
      cout << "Ausgangseinheit: ";
      string von_eingabe;
      cin >> von_eingabe;
      laengeneinheit von_einheit = eingabe_zu_einheit(von_eingabe);
    
      cout << "Zieleinheit: ";
      string zu_eingabe;
      cin >> zu_eingabe;
      int zu_einheit = eingabe_zu_einheit(zu_eingabe);
    
      double umrechnungsfaktor = umrechnungstabelle[von_einheit][zu_einheit];
    
      cout << "Welcher Wert soll umgerechnet werden? ";
      double wert;
      cin >> wert;
    
      cout << wert << ' ' << von_eingabe << " sind " << wert*umrechnungsfaktor << ' ' << zu_eingabe << '\n';
    }
    

    Die if-Kaskade ist immer noch drin (Zeile 17-24) aber schon sehr viel übersichtlicher als bei dir. Wenn man sie ganz los werden möchte, könnte man eine Datenstruktur wie std::map (eine Art Array mit einem beliebigen Typ als Index. Hier würde man dann std::strings als Indizes benutzen) verwenden. Natürlich stecken da immer noch if-Abfragen dahinter, aber man sieht sie nicht mehr und braucht sich auch nicht darum zu kümmern, da bereits alles in der Standardbibliothek für einen erledigt wurde. Das ist aber wahrscheinlich noch weit über deinem Kenntnisstand, lass dich nicht verwirren. Ist bloß als Ausblick gedacht.



  • Danke für die schnelle Antwort!
    Ich verstehe deine Vorschläge, jedoch lösen diese noch nicht das Problem.

    Hier noch mal die Erklärung:

    Also wenn er cin >> "Inch/Zentimeter/Foot" eingibt, hat er die Möglichkeit
    die Maße (Ausgangsmaß und Endmaß) frei auszuwählen.

    Seine Eingabe für das Ausgangsmaß ist z.B "Zentimeter".
    Dann besteht die Möglichkeit, dass er bei den drei Größen Zentimeter,Inch und Foot als zweite Wahl "Inch" oder "Foot" eingibt.

    D.h der erste Fall, dass Zentimeter eingegeben wird ist eingetroffen (eine von 3 if-Schleifen bestätigt) und das Programm steht nun vor weiteren 2 if-Schleifen (Zweite Wahl).

    Wählt er nun als Endmaß "Zentimeter", dann geht das Programm in die letzte if- Schleife über und wählt den Faktor zur Umrechnung von Zentimeter in Inch.

    Das Programm besteht dann aus 3 Schleifen (Ausgangsgmaß) mit jeweils 2 untergeordneten Schleifen (Endmaß), also insgesamt 6 Schleifen.

    Erweitert man die Anzahl von Maßen, so wird Das Schleifengewirr sehr unübersichtlich.

    Die Frage ist kann man dieses Gewirr vermeiden?
    Ein Einfall wäre von mir, dass seine String-Eingabe mit dem Namen der Variable direkt verbunden wird.


  • Mod

    Hast du deinen Beitrag geschrieben, während ich geantwortet habe? Ich denke, mein Beispiel beantwortet deine Frage nämlich ziemlich gut.

    Ach, noch etwas ⚠ Wichtiges ⚠ :
    www.if-schleife.de



  • @Sepp
    Ja hab ich 😃

    Danke für die Antwort !
    Ich versteh ungefähr das Vorgehen, bin aber noch nicht weit genug für die verwendeten Operatoren..
    Ich werds mir noch genauer anschauen.
    Danke nochmals!



  • So Leuts,
    Ich hab mich jetzt mal ein wenig mit der Antwort von SeppJ befasst
    und bin jetzt auf diese Lösung gekommen:

    #include <iostream> 
    #include <string> 
    #include <cmath>
    
    using namespace std;
      double Wert;
      double Faktor1;
      double Faktor2;
      string Eingabe1;
      string Eingabe2;
    
    int main(){
    
        cout << "Umrechner Laengeneinheiten" << endl << "Ausgangseinheit: ";
        cin  >> Eingabe1;
    
        getchar();
    
        if (Eingabe1 == "Inch") {Faktor1 = 0.393701;}
        else if (Eingabe1 == "Meter") {Faktor1 = 0.01;}  
        else if (Eingabe1 == "Yard") {Faktor1 = 0.010936100000000091;}
        else if (Eingabe1 == "Zentimeter") {Faktor1 = 1;}
        else if (Eingabe1 == "Fuss") {Faktor1 = 0.0328084;}
        else {
        cout << Eingabe1 << " ist keine einprogrammierte Laengeneinheit!";
        getchar(); 
        return 0;}
    
        cout <<"Endeinheit: ";
        cin >> Eingabe2;
    
        getchar();
    
        if (Eingabe2 == "Inch") {Faktor2 = 0.393701;}
        else if (Eingabe2 == "Meter") {Faktor2 = 0.01;}
        else if (Eingabe2 == "Yard") {Faktor2 = 0.010936100000000091;}
        else if (Eingabe2 == "Zentimeter") {Faktor2 = 1;}
        else if (Eingabe2 == "Fuss") {Faktor2 = 0.0328084;}
        else {
        cout << Eingabe2 << " ist keine einprogrammierte Laengeneinheit!";
        getchar(); 
        return 0;}
    
        cout << "Wert: ";
        cin >> Wert;
    
        getchar();
    
        cout << Wert << " " << Eingabe1 << " sind " << Faktor2 / Faktor1 * Wert << " " << Eingabe2 << ".";
    
        getchar();
        return 0;
        }
    

    Damit sollte es noch ein bisschen einfacher gehalten sein. 🙂


Log in to reply