Switch Anweisung



  • Hallo,
    ich studiere Informatik und habe folgende Aufgabenstellung:

    Aufgabe 10: Switch-Anweisungen
    Entwerfen Sie einen Algorithmus, der einzelne Zeichen einliest und in der gelesenen
    Reihenfolge als Hexadezimal-Zahl interpretiert und ausgibt. Das Ausgabe soll sowohl
    hexadezimal also auch dezimal erfolgen. Dabei sind nur gültige Zeichen zugelassen.

    Beispiel:
    Eingabe > 0 1 f
    Ausgabe: hex: 1f dec: 31

    Mein Problem ist jetzt, dass ich nicht weiß wie ich die einzelnen character einlesen kann bis das ende erreicht ist und nicht nur der erste allein eingelesen wird.

    ich hoffe ihr versteht was ich meine und könnt mir weiterhelfen.



  • Versuch's mal mit einer Schleife 😉

    (aber ansonsten kann ein istream auch schon Hex-Zahlen einlesen)



  • Einlesen von der Tastatur z.B. mit

    string asd = "";
    getline(cin, asd);
    

    Dann hast du alle Zeichen, die kannst du dann weiterverarbeiten.



  • also ich hab das programm soweit das wenn ich die zeichen direkt nacheinander
    eintippe ich den richtigen wert bekommen.
    also für: 01f -> Dezimal 31

    aber im Beispielt ist ja gefordert:0 1 f einzugeben und es dann rauszubekommen und das bekomme ich nicht hin.

    danke für eure mühe 🙂



  • Zeig mal deinen bisherigen, kompilierbaren Quellcode. 😉



  • #include <string>
    #include <iostream>

    using namespace std;

    int main(void)

    {

    string eingabe = "";
    int ergebnis = 0;
    int faktor = 1;

    cin >> eingabe;

    for (unsigned int i = 1; i < eingabe.length(); i++)
    {
    faktor *= 16;
    }

    for (unsigned int i = 0; i < eingabe.length(); i++)
    {
    switch(eingabe[i])
    {
    case '0':
    ergebnis += 0faktor;
    break;
    case '1':
    ergebnis += 1
    faktor;
    break;
    case '2':
    ergebnis += 2faktor;
    break;
    case '3':
    ergebnis += 3
    faktor;
    break;
    case '4':
    ergebnis += 4faktor;
    break;
    case '5':
    ergebnis += 5
    faktor;
    break;
    case '6':
    ergebnis += 6faktor;
    break;
    case '7':
    ergebnis += 7
    faktor;
    break;
    case '8':
    ergebnis += 8faktor;
    break;
    case '9':
    ergebnis += 9
    faktor;
    break;
    case 'a':
    ergebnis += 10faktor;
    break;
    case 'b':
    ergebnis += 11
    faktor;
    break;
    case 'c':
    ergebnis += 12faktor;
    break;
    case 'd':
    ergebnis += 13
    faktor;
    break;
    case 'e':
    ergebnis += 14faktor;
    break;
    case 'f':
    ergebnis += 15
    faktor;
    break;
    }

    faktor/=16;

    }

    cout << ergebnis<<endl;

    return 0;
    }



  • Bitte [ cpp] und [ /cpp] Tags verwenden.

    #include <string>
    #include <iostream>
    
    using namespace std;
    
    int main(void)
    
    {
    
    string eingabe = "";
    int ergebnis = 0;
    int faktor = 1;
    
    cin >> eingabe;
    
    for (unsigned int i = 1; i < eingabe.length(); i++)
    {
    faktor *= 16;
    }
    
    for (unsigned int i = 0; i < eingabe.length(); i++)
    {
    switch(eingabe[i])
    {
    case '0':
    ergebnis += 0*faktor;
    break;
    case '1':
    ergebnis += 1*faktor;
    break;
    case '2':
    ergebnis += 2*faktor;
    break;
    case '3':
    ergebnis += 3*faktor;
    break;
    case '4':
    ergebnis += 4*faktor;
    break;
    case '5':
    ergebnis += 5*faktor;
    break;
    case '6':
    ergebnis += 6*faktor;
    break;
    case '7':
    ergebnis += 7*faktor;
    break;
    case '8':
    ergebnis += 8*faktor;
    break;
    case '9':
    ergebnis += 9*faktor;
    break;
    case 'a':
    ergebnis += 10*faktor;
    break;
    case 'b':
    ergebnis += 11*faktor;
    break;
    case 'c':
    ergebnis += 12*faktor;
    break;
    case 'd':
    ergebnis += 13*faktor;
    break;
    case 'e':
    ergebnis += 14*faktor;
    break;
    case 'f':
    ergebnis += 15*faktor;
    break;
    }
    
    faktor/=16;
    
    }
    
    cout << ergebnis<<endl;
    
    return 0;
    }
    

    Achja, und immer schön Einrücken nicht vergessen, damit man es auch lesen kann. 🙂



  • Versuch es mal mit einer Schleife und cin.get(c);
    Sowas wie

    //
    while(cin.get(c)) {
       switch(c){
           // Auswerten der Zeichen
       }
    }
    

    Mit der Schleife liest du jedes Zeichen, auch Leerzeichen, ein.



  • Du könntest einfach alle nicht-hexadezimalen Zeichen löschen, bevor du den String verarbeitest. Außerdem empfiehlt sich, alles in Kleinbuchstaben umzuwandeln, falls jemand auf die Idee kommt, 123AF einzutippen.



  • snOOfy schrieb:

    Du könntest einfach alle nicht-hexadezimalen Zeichen löschen, bevor du den String verarbeitest. Außerdem empfiehlt sich, alles in Kleinbuchstaben umzuwandeln, falls jemand auf die Idee kommt, 123AF einzutippen.

    ja genau sowas in der art brauch ich, nur hab ich (noch) keine ahnung, wie man in einem string prüft ob es sich bei einem zeichen um einen hex-zeichen handelt



  • Ich würde die Zahl stückweise aufbauen, während sie eingelesen wird:

    while(cin.get(c) && c!='\n')
    {
      switch(c)
      {
      case '0': ergebnis = 16*ergebnis; break;
      case '1': ergebnis = 16*ergebnis+1; break;
      ...
      default:  // Behandlung von unbekannten Eingabezeichen
    }
    

    (wobei ich mir auch kürzere Möglichkeiten vorstellen könnte, aus einem Zeichen eine Hex-Ziffer zu extrahieren)


Log in to reply