Forum: PC-Programmierung Hex zu Dezimal


von Mich A. (ebet14)


Lesenswert?

Versuche grad eine Hexzahl in Dezimal umzurechnen mit Hilfe der Ascii 
Tabelle in C++. Allerdings funktioniert es nicht so wie es soll.
Die if Schleife durchläuft er richtig und das Ergebnis stimmt auch, 
allerdings bei denn beide else if's kommt das Falsche raus kann mit 
jemand helfen?

danke schon mal
1
#include <iostream>
2
using namespace std;
3
4
int b, c, d;
5
char a;
6
7
int main(){
8
    cout<<"Ihre Hexadezimalzahl ist: ";
9
    cin>>a;
10
    cout << a <<"\n";
11
            if(a == 'a'||'b'||'c'||'d'||'e'||'f'){
12
            b = a - 87;
13
            cout<<"Der Dezimalwert der Hexadezimalziffer "<< a <<" ist "<< b <<"\n";
14
            }
15
            else if(a == 'A'||'B'||'C'||'D'||'E'||'F'){
16
            c = a - 55;
17
            cout<<"Der Dezimalwert der Hexadezimalziffer "<< a <<" ist "<< c <<"\n";
18
            }
19
            else if(a == '1'||'2'||'3'||'4'||'5'||'6'||'7'||'8'||'9'||'0'){
20
            d = a - 48;
21
            cout<<"Der Dezimalwert der Hexadezimalziffer "<< a <<" ist "<< d <<"\n";
22
            }
23
            else{
24
            cout<<"Fehler"<<"\n";
25
            }
26
return 0;
27
}

von Peter II (Gast)


Lesenswert?

Michael Estner schrieb:
> if(a == 'a'||'b'||'c'||'d'||'e'||'f'){

ich kenn zwar nicht den neusten C++ Standard, aber dieser Syntax ist mir 
neu und macht bestimmt nicht was du willst.
1
if(a >= 'a' && a <= 'f' ){

von Noch einer (Gast)


Lesenswert?

Die Syntax ist OK.

C rechnet zuerst a'||'b'||'c'||'d'||'e'||'f' und vergleicht dann das 
Ergebnis mit a.

von Steffen R. (steffen_rose)


Lesenswert?

Noch einer schrieb:
> Die Syntax ist OK.
>
> C rechnet zuerst a'||'b'||'c'||'d'||'e'||'f' und vergleicht dann das
> Ergebnis mit a.

Auch wenn Du recht hast finde ich es für einen Anfänger schwer 
verständlich, dass Du auch speziell mit der letzten Teil darauf 
hinweisen willst, dass es wohl nicht das ist, was der TO bezwecken will.

von Dirk B. (dirkb2)


Lesenswert?

Tipp: Auch ein Zeichenliteral wie 'a' ist nur ein Zahlenwert:
1
b = a - 'a' + 10;
2
c = a - 'A' + 10;
3
d = a - '0';
 Und schon is es egal, welchen Code die Zeichen eigentlich haben.

von Caligulaminus (Gast)


Lesenswert?

Noch einer schrieb:
> C rechnet zuerst a'||'b'||'c'||'d'||'e'||'f' und vergleicht dann das
> Ergebnis mit a.

Nö, andersherum.

== geht vor ||

von Max H. (hartl192)


Lesenswert?

Schau dir mal das an, für das was du erreichen willst gibt's auch 
fertige Funktionen:
http://www.cplusplus.com/reference/cctype/


Mich Ael schrieb:
> if Schleife
http://www.if-schleife.de/

: Bearbeitet durch User
von Rene H. (Gast)


Lesenswert?

Es kommt das falsche raus, weil Deine else if nie durchlaufen werden.

Mich Ael schrieb:
1
> if(a == 'a'||'b'||'c'||'d'||'e'||'f'){

ist immer true. Konkret vergleicht er
1
a == 'a'

und wertet dann Dein
1
|| 'b'

aus. Das ist aber immer true, wie auch die nachfolgenden.
Also rechnet er immer
1
b = a - 87;

aus.

Grüsse,
René

von Heinz L. (ducttape)


Lesenswert?

Noch einer schrieb:
> Die Syntax ist OK.
>
> C rechnet zuerst a'||'b'||'c'||'d'||'e'||'f' und vergleicht dann das
> Ergebnis mit a.

Egal ob == oder || vorgehen, da kommt Murks heraus. Wenn == vorgeht 
sowieso, aber auch wenn man's klammert oder Du 'n Compiler hast der || 
die Präferenz gibt. Warum?

97 || 98 || 99 || 100 || 101 || 102

Das Ergebnis davon ist 103. Und damit ist a == .... NIEMALS true. Weil 
103 ist der ascii-code von g.

Und warum ist es 103?

Weil die Veroderung von Zahlen einfach nur alle Bits setzt die in 
irgendeiner der Zahlen gesetzt sind.

Entsprechend ist so ein a || b || c ... Konstrukt in fast jedem Fall 
Grütze. Syntaktisch korrekt, und der Compiler frisst es auch. Rauskommen 
tut nur halt fast sicher Nonsense.

: Bearbeitet durch User
von Martin N. (Gast)


Lesenswert?

So ist es einfacher:
1
#include <iostream>
2
using namespace std;
3
4
int b, c, d;
5
char a;
6
7
int main(){
8
  cout << "Ihre Hexadezimalzahl ist: ";
9
  cin >> a;
10
  cout << a << "\n";
11
  if (a >= 'a' && a <= 'f'){
12
    b = a - 87;
13
    cout << "Der Dezimalwert der Hexadezimalziffer " << a << " ist " << b << "\n";
14
  }
15
  else if (a >= 'A' && a <= 'F'){
16
    c = a - 55;
17
    cout << "Der Dezimalwert der Hexadezimalziffer " << a << " ist " << c << "\n";
18
  }
19
  else if (a >= '0' && a <= '9'){
20
    d = a - 48;
21
    cout << "Der Dezimalwert der Hexadezimalziffer " << a << " ist " << d << "\n";
22
  }
23
  else{
24
    cout << "Fehler" << "\n";
25
  }
26
  return 0;
27
}

von Martin N. (Gast)


Lesenswert?

Und das kürzer:
1
#include <iostream>
2
using namespace std;
3
4
char a;
5
int b;
6
7
int main(){
8
  cout << "Ihre Hexadezimalzahl ist: ";
9
  cin >> a;
10
  cout << a << "\n";
11
12
  b = a;
13
14
  if (a >= 'a' && a <= 'f') b = a - 87;
15
  else if (a >= 'A' && a <= 'F') b = a - 55;
16
  else if (a >= '0' && a <= '9') b = a - 48;
17
    
18
  if (a != b) cout << "Der Dezimalwert der Hexadezimalziffer " << a << " ist " << b << "\n";
19
  else cout << "Fehler" << "\n";
20
21
  return 0;
22
}

von rm (Gast)


Lesenswert?

Heinz L. schrieb:
> 97 || 98 || 99 || 100 || 101 || 102
>
> Das Ergebnis davon ist 103. Und damit ist a == .... NIEMALS true. Weil
> 103 ist der ascii-code von g.
>
> Und warum ist es 103?
>
> Weil die Veroderung von Zahlen einfach nur alle Bits setzt die in
> irgendeiner der Zahlen gesetzt sind.

aber nur bei | und nicht mit ||
bitweise oder / logisch oder

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Martin N. schrieb:
> Und das kürzer:
> [...]
1
>   if (a >= 'a' && a <= 'f') b = a - 87;
2
>   else if (a >= 'A' && a <= 'F') b = a - 55;
3
>   else if (a >= '0' && a <= '9') b = a - 48;
4
>

Und das lesbarer und verständlicher, ohne dass man eine ASCII-Tabelle in 
der Tasche mit sich rumtragen muss:
1
  if (a >= 'a' && a <= 'f')      b = a - 'a' + 10;
2
  else if (a >= 'A' && a <= 'F') b = a - 'A' + 10;
3
  else if (a >= '0' && a <= '9') b = a - '0';

: Bearbeitet durch Moderator
von Rolf M. (rmagnus)


Lesenswert?

Heinz L. schrieb:
> 97 || 98 || 99 || 100 || 101 || 102
>
> Das Ergebnis davon ist 103.

Falsch. Das Ergebnis ist 1.

> Und warum ist es 103?
>
> Weil die Veroderung von Zahlen einfach nur alle Bits setzt die in
> irgendeiner der Zahlen gesetzt sind.

Nur daß es sich hier um ein boolesches Oder handelt. Das nimmt jeden 
Wert, der 0 ist, als false und jeden anderen als true. Das Ergebnis ist 
dann 0 für false und 1 für true.

> Entsprechend ist so ein a || b || c ... Konstrukt in fast jedem Fall
> Grütze.

Nein, der ist oft nützlich. In diesem Fall macht er aber was völlig 
anderes als beabsichtigt.

von Timmo H. (masterfx)


Lesenswert?

Wieso nicht einfach strtol/strtoul?

: Bearbeitet durch User
von Rene H. (Gast)


Lesenswert?

Timmo H. schrieb:
> Wieso nicht einfach strtol/strtoul?

Und dann? Für Hex geht das nicht.

von Karl H. (kbuchegg)


Lesenswert?

Rene H. schrieb:
> Timmo H. schrieb:
>> Wieso nicht einfach strtol/strtoul?
>
> Und dann? Für Hex geht das nicht.

Nicht ganz.
strtol bzw strtoul kann man die Basis des Zahlensystems schon angeben.
Aber inklusive Fehlererkennung und allem drum und drann ist die Lösung 
mittels strtol dann schon deutlich aufwändiger als eine simple 
Fallunterscheidung für ein hexadezimales Digit.

von Dirk B. (dirkb2)


Lesenswert?

Timmo H. schrieb:
> Wieso nicht einfach strtol/strtoul?

Der Weg ist das Ziel.

von Timmo H. (masterfx)


Lesenswert?

Wenn man bei strtol '0' als Basis nimmt ist eine Autoerkennnung für 
0x.... drin. Warum wird hier das Rad ständig neu erfunden?
Da wo es geht sollte man immer auf Standardfunktionen zurückgreifen, die 
sind bereits hochoptimiert, und wenn es um "PC-Programmierung" geht, 
sind ein paar Bytes/Clocks mehr die das ganze brauch doch eh wurst.

: Bearbeitet durch User
von Jürgen (Gast)


Lesenswert?

Programmiere zwar ASM, aber vielleicht hilft es dir trotzdem:

In deine Variablen a Bit5 löschen, dann hast du auf jeden Fall einen 
Grossbuchstaben.
Nun von a 48 oder '0' abziehen.

Ist a > 9 noch mal 7 abziehen.

Fertig, und nur ein IF gebraucht

von Dirk B. (dirkb2)


Lesenswert?

Jürgen schrieb:
> In deine Variablen a Bit5 löschen, dann hast du auf jeden Fall einen
> Grossbuchstaben.

Dafür gibt es in C toupper

> Fertig, und nur ein IF gebraucht

Und was ist, wenn z.B ein 'g' eingegeben wurde?

Zudem funktioniert dein Code nur für ASCII (oder Abarten davon)

von nur so (Gast)


Lesenswert?

#include<stdio.h>

int main(){


    char num ;
    printf("gibt dein hexnummer ein bitte");
    scanf("%hx",&num);

    printf("hex =%hx und das ist dezimal =%d\n",num, num);




    return 0;
}

von Heinz L. (ducttape)


Lesenswert?

nur so schrieb:
> #include<stdio.h>
>
> int main(){
>
> [...]
>     printf("hex =%hx und das ist dezimal =%d\n",num, num);
>
> [...]
> }

Cheater. :)

von Rolf M. (rmagnus)


Lesenswert?

Heinz L. schrieb:
> Cheater. :)

Und falsch ist es auch noch.

nur so schrieb:
> scanf("%hx",&num);

Das müßte heißen:
1
scanf("%hhx",&num);

Beim printf kann man das h dafür auch einfach weglassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.