myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   C++ Hexa in Binär/Dezimal (https://mygully.com/showthread.php?t=2549523)

flokuek 15.01.12 14:23

C++ Hexa in Binär/Dezimal
 
Hey Leute,

ich bin gerade dabei einen Umrechner auf Konsolenbasis in C++ zu schreiben.
Es wirt dort ein Zahlensystem in ein anderes Zahlensystem umgewandelt.
Bisher habe ich Dezimal in Binär, Dezimal in Hexa, Binär in Dezimal und Binär in Hexa geschrieben.

Doch jetzt verzweifel ich irgendwie an Hexa zu Binär und Hexa zu Dezimal.

Hat wer irgendwelche Lösungsansätze oder kann mir in der Richtung weiter helfen?

Gruß
Flo

7331 15.01.12 14:45

Jedem Zeichen in Hexadezimal ist ein Vierblock aus 0er und 1er zugeordnet, wenn zu z.B. Hexa ein A liest, dann kannst du Binaer 1010 schreiben oder 0100 wenn eine 4 da war. So kannst du den ganzen Hexastring Zeichen fuer Zeichen durchgehen, bei Dez genau so. Bei Zahlen ist hier nichts zu zu tun, nur bei den Buchstaben wie A mit 10 ersetzen.

germgerm 15.01.12 14:45

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

Umwandlungen sind immer sehr ähnlich, ich denke, dass dein Binär zu Dezimal fast gleich sein sollte. Anstatt x0*2^0+x1*2^1+... wird halt x0*16^0+x1*16^1+... daraus.

flokuek 15.01.12 15:15

Okay, Das habe ich nun verstanden :D

Nun scheitert es aber auch an der Umsetzung :(

Wie soll ich denn am besten anfangen?
Soll ich meine Zahl die Ich eingeben in ein Arrey eingelesen werden und dann die Zahl auslesen und wie oben beschrieben daraus die Dezimalzahl ziehen?

germgerm 15.01.12 15:17

Wie hast du deine anderen Umwandlungen gelöst?

flokuek 15.01.12 15:28

So.

Code:

switch(auswahl)
        {         
          case 1:  { 
                        cout << "\n\n    Bitte geben Sie nun ihre Dezimalzahl ein.\n\n";
                        cout << "    Eingabe: ";
                        cin >> dezimal_binaer;
                        cout << "\n    Ergebnis: ";
                       
                        for(i=15;i>=0;i--)
                          {
                              dezimal_binaer_ergebnis[i] = dezimal_binaer%2;
                              dezimal_binaer = dezimal_binaer/2;
                          }
                       
                        for(i=0;i<=15;i++)
                          {
                              cout << dezimal_binaer_ergebnis[i];
                       
                          }
                        cout << "\n\n\n";
                    }
                    break;
         
          // _________________ Dezimal in Hexa ________________________________
                   
          case 2:  { 
                        cout << "\n\n    Bitte geben Sie nun ihre Dezimalzahl ein.\n\n";
                        cout << "    Eingabe: ";
                        cin >> dezimal_hexa;
                        cout << "\n    Ergebnis: ";
                       
                        neu = dezimal_hexa;
                         
                        do
                            {
                                rest[zaehler++] = neu % 16;
                                neu /= 16;
                            }
                        while(neu != 0);
 
                       
 
                        for(int i=zaehler-1; i>-1; i--)
                        {
                            switch(rest[i])
                            {
                            case 10: cout<<"A"; break;
                            case 11: cout<<"B"; break;
                            case 12: cout<<"C"; break;
                            case 13: cout<<"D"; break;
                            case 14: cout<<"E"; break;
                            case 15: cout<<"F"; break;
                           
                            default: cout<< rest[i];
                            }
                        }
                       
                    }
                    break;       
   
          // _________________ Binär in Dezimal _______________________________
   
          case 3:  {
                        cout << "\n\n    Bitte geben Sie nun ihre Bin\x84 \brzahl ein.\n\n";
                        cout << "    Eingabe: ";
                        cin >> binaer_dezimal;
                        cout << "\n    Ergebnis: ";
                       
                        laenge = binaer_dezimal.length();
                        for (i=0; i<laenge; i++)
                            {
                                binarray[i] = (int)binaer_dezimal[i]-48;
                                binaer_dezimal_ergebnis = binaer_dezimal_ergebnis + (binarray[i]*pot[i]);
                            }
                        cout << binaer_dezimal_ergebnis;
                    }
                    break;
                   
          // _________________ Dezimal in Hexa ________________________________
                   
          case 4:  {
                        cout << "\n\n    Bitte geben Sie nun ihre Bin\x84 \brzahl ein.\n\n";
                        cout << "    Eingabe: ";
                        cin >> binaer_hexa;
                        cout << "\n    Ergebnis: ";
                       
                        laenge = binaer_hexa.length();
                        for (i=0; i<laenge; i++)
                            {
                                binarray[i] = (int)binaer_hexa[i]-48;
                                binaer_hexa_ergebnis = binaer_hexa_ergebnis + (binarray[i]*pot[i]);
                            }
                                             
                        neu = binaer_hexa_ergebnis;
                         
                        do
                            {
                                rest[zaehler++] = neu % 16;
                                neu /= 16;
                            }
                        while(neu != 0);
 
                        for(int i=zaehler-1; i>-1; i--)
                        {
                            switch(rest[i])
                            {
                                case 10: {
                                          cout<<"A";
                                        }break;
                                case 11: {
                                          cout<<"B";
                                        }break;
                                case 12: {
                                          cout<<"C";
                                        }break;
                                case 13: {
                                          cout<<"D";
                                        }break;
                                case 14: {
                                          cout<<"E";
                                        }break;
                                case 15: {
                                          cout<<"F";
                                        }break;
                                default: {
                                          cout<< rest[i];
                                        }
                            }
                        }
                    }
                    break;


germgerm 15.01.12 15:44

Hex->Dez:
- Eingabe in einem String
- Von rechts nach links auswerten wie oben beschrieben.

x0*16^0 + x1*16^1
"1F"
F*16^0 + 1*16^1=
15*1 + 1*16=
31

flokuek 15.01.12 15:56

mhhh irgendwie will es einfach nicht in meinen KOPF :((((

@germgerm
kannst du vielleicht ein Beispiel Code schreiben?

EDIT:

Kann mir vielleicht irgendwer anders bei dem Code helfen?????

Gruß
Flo

Your_Conscience 15.01.12 20:28

Zitat:

Zitat von flokuek (Beitrag 23185572)
Kann mir vielleicht irgendwer anders bei dem Code helfen?????

Klar :)
Hex -> Dez:
Code:

#include <iostream.h>

int main()
{
    char hex[101];
    for (int i = 0; i <= 100; i++) hex[i] = 'g';
    bool k = false;
    int p = 1, dez = 0;
    cout << "Hexadezimale Zahl: ";
    cin >> hex;
 
    for (int i = 100; i >= 0; i--) {
        if (!k) {if (hex[i] != 'g') k = true;}
        else {
          if (hex[i] >= 48 && hex[i] <= 57) dez += (int(hex[i]) - 48) * p;        //Ziffer
          else if (hex[i] >= 65 && hex[i] <= 70) dez += (int(hex[i]) - 55) * p;  //großer Buchstabe
          else if (hex[i] >= 97 && hex[i] <= 102) dez += (int(hex[i]) - 87) * p;  //kleiner Buchstabe
          else {
              cout << "Falsche Eingabe: " << hex[i] << " ist unzulaessig!";
              return 1;
          }
          p *= 16; 
        }       
    }
    cout << dez << "\n";
   
    system("PAUSE"); 
}


flokuek 16.01.12 15:21

Cool, ich danke dir schoneinmal :D

Nur was ich noch nicht verstanden habe ist, was das mit der ersten for schleife auf sich hat und wie man das mit dem k = false verstehen soll.

sry mache c++ noch nicht sooo lange :P

Your_Conscience 16.01.12 16:29

Wir haben ja ein Array von 101 Chars (hex) wo noch nichts drin steht.
Ich habe den Array dann einfach mit g's gefüllt, damit man später sieht, wie viele Zeichen der Benutzer eingegeben hat.

Das 'k' ist einfach nur eine Hilfsvariable die am Anfang einfach mal auf false gesetz wird.
Später wird der hex-Array rückwärts durchlaufen, wobei bei jedem Zeichen überprüft wird, ob es sich um ein 'g' handelt oder nicht.
Wenn ja, wurde hier nichts vom Benutzer eingetragen und wenn nicht handelt es sich um eine Eingabe und die Berechnung des Dezimalwertes kann beginnen.

Also wenn k = true, dann muss gerechnet werden. :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.