hexadezimal ausgeben und umrechnen

cpp_rookie

Grünschnabel
Hallo,

ich hab ein Programm zum einlesen einer Hexzahl geschrieben, dass sie dann auch direkt als Dezimalzahl ausgibt. Hab es bewusst mit Switch gemacht!
Nun will ich aber mehrere Zeichen eingeben, die dann in der Reihenfolge als Hex ausgegeben werden und umgerechnet in Dez. werden. Kann mir da einer helfen?
Wie man eine Hex in Dez umrechnet ist mir bewusst, nur das ganze zu realisieren fällt mir noch schwer..

Und noch eine Frage: Wenn ich z.b. 16 eingebe, dann gibt er mir nur die 1 aus, woran liegt das? Weil die nicht im Switch vorkommt und er deswegen nur die erste Ziffer anwählt? Oder wegen dem char?

Bin absolut froh über jede Hilfestellung!

C++ Code
Code:
int main()
{
	
int a;
char i;
cout << "Eingabe: ";
cin >> i;

switch(i) {
case '1' : a=1; break;
case '2' : a=2; break;
case '3' : a=3; break;
case '4' : a=4; break;
case '5' : a=5; break;
case '6' : a=6; break;
case '7' : a=7; break;
case '8' : a=8; break;
case '9' : a=9; break;
case 'a' : a=10; break;
case 'b' : a=11; break;
case 'c' : a=12; break;
case 'd' : a=13; break;
case 'e' : a=14; break;
case 'f' : a=15; break;
default : i=0;
}

cout<<"hex: "<<i<<" dec: "<<a<<endl;

}
 
Du solltest ein char-Array anlegen, und das dann Zeichen für Zeichen durchackern.

Edit:

Die Umwandlung Hex in Dez ist eigenlich auch nicht so schwer.
für jede Stelle:
Ergebnis nullsetzen
4x Linksshiften
Du bestimmest den Dezimalwert der Stelle und addierst ihn.

Code:
// 4 stellige hex in dez
.. einlesen des strings
for(i=0;i<4;i++)
{
  //hier char in wert umwandeln
  ergebnis<<=4;  // entspr *16
  ergebnis+=wert;// letze stelle (16^0) addieren
}
 
Zuletzt bearbeitet:
Deine Eingabevariable "char i;" kann nur ein einziges Zeichnen aufnehmen, daher wird z.B. bei einer "16" nur die "1" gespeichert. Du müsstest also ein char-Array oder ein string-Objekt bei der Eingabe verwenden und für jedes einzelne Zeichen die switch-Abfrage ausführen und am Schluss daraus die Zahl berechnen.

Ansonsten, warum eigentlich so umständlich? Geht doch auch einfacher:
C++:
int nValue;
cout << "Eingabe: ";
cin >> hex >> nValue;       // Hex-Zahl einlesen
cout<<"hex: "<< hex << nValue<<" dec: "<< dec << nValue << endl;     // Alles ausgeben
Gruß
MCoder
 
Zuletzt bearbeitet:
Erstmal danke für die Antworten.
So wie du es da gemacht hast, hatte ich es auch schon, ist aber leider nicht gefragt.. wäre auch etwas zu trivial.
Das mit den Arrays klappt nicht so ganz bei mir.
Vielleicht könnte das auch schnell einer hinhauen, wenn das geht :confused: , ist bestimmt nicht die Arbeit, ich verzweifel hier nämlich bald :suspekt:

Aufgabe lautete:
-Mit hilfe von Switch-Anweisungen-
Schreibe ein Programm, welches einzelne Zeichen einliest und in der gelesenen
Reihenfolge als Hexadezimal-Zahl interpretiert und ausgibt. Die Ausgabe soll sowohl
hexadezimal also auch dezimal erfolgen. Dabei sind nur gültige Zeichen zugelassen.

Beispiel:
Eingabe > 1 2 f
Ausgabe: hex: 12f dec: 303

Wäre überaus dankbar.
 
Zuletzt bearbeitet:
Anstelle des Arrays ist ein string-objekt günstiger, weil es eine beliebige Anzahl von Zeichen aufnehmen kann.
C++:
#include <iostream>
#include <string>

string str;

cout << "Eingabe: ";
cin >> str;

for( int i = 0; i < str.size(); i++ )
{
    switch( str[i] )
    {
        // ...                
    }

    // Ermittelten Wert entsprechend der Stellenposition verrechnen
    // oder verwerfen, wenn das Zeichen ungültig ist
}
Gruß
MCoder
 
Hallo,

das Thema ist zwar schon etwas älter, aber ich habs über Google gefunden und hätte jetzt eine Frage zu dem oberen Beispiel von MCoder. Ich habe mir das mal zu Nutze gemacht und kann jetzt hex Werte in dec Werte umrechnen und andersherum auch, dazu habe ich die Begriffe ja einfach nur umdrehen müssen. Ich habe das jetzt so aufgestellt dass ich immer zu erst einen dec Wert in einen hex Wert rechnen lasse und dann als Probe den herausgekommen hex Wert wieder in einen dec Wert umrechnen lasse. Das klappt auch super, bis ich es mit negativen Werten ausprobiert habe. Wenn man also z.B. "-25" in hex umrechnet bekommt man "ffffffe7" wenn ich das jetzt allerdings wieder in dec umrechnen lasse bekomme ich "-858993460". Das stimmt ja dann leider nicht mehr. Kann mir jemand einen Tip geben wie ich auch negative Werte wandeln kann?

Vielen Dank schonmal
Gruß,
Laura
 
Also im Endeffekt genauso wie oben nur etwas umgeschrieben und noch dupliziert:

C++:
int zValue;
cout << "Eingabe: ";
cin >> dec >> zValue;       // Dec-Zahl einlesen
cout<<"dec: "<< dec << zValue<<" hex: "<< hex << zValue << endl;     // Alles ausgeben

int nValue;
cout << "Eingabe: ";
cin >> hex >> nValue;       // Hex-Zahl einlesen
cout<<"hex: "<< hex << nValue<<" dec: "<< dec << nValue << endl;     // Alles ausgeben
 
Hi.

Du prüfst nicht ob die Eingabe überhaupt erfolgreich war. Du versuchst den Wert 0xffffffe7 in einen signed int einzulesen, was nicht möglich ist, da der Wert zu groß ist. Deshalb wird dann ein zufälliger Wert ausgegeben.
C++:
int nValue;
if (cin >> hex >> nValue) {
  cout << dec << nValue << endl;
} else {
  cerr << "Fehler: Wert wurde nicht gelesen" << endl;
}
Gruß
 
Okay, danke für den Tip. Heißt das jetzt aber auch dass man gar keine negativen Werte konvertieren kann? Also ist es denn schon falsch wenn mir "-25" in "ffffffe7" umgerechnet werden? Oder ist das richtig und man kann nur nicht mehr in die andere Richtung konvertieren?

Oh man, langsam nervts mich schon ziemlich. Ich hab das Ganze auch schon in MATLAB versucht, aber das kann es auch nicht. Es muss doch irgend eine Möglichkeit geben negative integer Werte in hex Werte umzurechnen. Normalerweise wären es ja sogar noch Kommazahlen, aber davon hab ich mittlerweile abgesehen weil es sonst wahrscheinlich erst recht unmöglich ist.
 
Zurück