Zahlensystemumrechner



  • Guten Tag,

    ich bin's wieder!
    Nun habe ich die Aufgabe ein Zahlensystemumrechner zu programmieren. Ich muss Dual in Hexadezimal und Dezimal umwandeln, sowie beides in Dual und von Hexa zu Dez und umgekehrt...
    Das Programm ist soweit fertig, mir fehlen nur noch die Umwandlungen von Dual zu Dezimal und Dual zu Hexadezimal.
    Da ich natürlich Anfänger bin, bräuchte ich Hilfe, die einfach strukturiert ist.
    Wie die Umwandlungen auf Papier stattfinden, habe ich schon erstellt. Allerdings kriege ich sie nicht als Programm umgewandelt. Ich wüsste nicht, wie man die dualen Zahlen zerlegt und diese dann wiederum mit der Basis 2 Hoch Zahlenlänge-1 berechnet.

    Vielen Dank schon einmal im Voraus für eure Hilfe!!!

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        printf("Bitte geben Sie eine Zahl fuer die Umrechnung an:\n\n1 = Dual zu Hexadezimal! INAKTIV  \n2 = Dual zu Dezimal! INAKTIV\n3 = Hexadezimal zu Dual!\n4 = Hexadezimal zu Dezimal!\n5 = Dezimal zu Hexadezimal!\n6 = Dezimal zu Dual!\n");
        int eingabe;
        int zahlensys;
        int arr[10];
       
        scanf("%d", &eingabe);
    
        switch(eingabe)
        {
            case 1:
                printf("Sie haben sich fuer Dual zu Hexadezimal entschieden!\n");
                printf("Geben Sie nun eine Duale Zahl ein!\n");
                scanf("%d", &zahlensys);
               
    
                break;
            case 2:
                printf("Sie haben sich fuer Dual zu Dezimal entschieden!\n");
                printf("Geben Sie nun eine Duale Zahl ein!\n");
                scanf("%d", &zahlensys);
                itoa (zahlensys,arr,10);
                printf ("Das Ergebnis lautet in Dual: %s\n",arr);
    
    
                break;
            case 3:
                printf("Sie haben sich fuer Hexadezimal zu Dual entschieden!\n");
                printf("Geben Sie nun eine Hexadezimal Zahl ein!\n");
                scanf("%x", &zahlensys);
                itoa (zahlensys,arr,2);
                printf ("Das Ergebnis lautet in Dual: %s\n",arr);
                break;
            case 4:
                printf("Sie haben sich fuer  Hexadezimal zu Dezimal entschieden!\n");
                printf("Geben Sie nun eine Hexadezimal Zahl ein!\n");
                scanf("%x", &zahlensys);
    
                 printf ("Das Ergebnis lautet in Dezimal: %i\n",zahlensys);
                break;
            case 5:
                printf("Sie haben sich fuer Dezimal zu Hexadezimal entschieden! \n");
                printf("Geben Sie nun eine Dezimal Zahl ein!\n");
                scanf("%i", &zahlensys);
               // itoa (zahlensys,arr,16);
                printf ("Das Ergebnis lautet in Hexadecimal: %x\n",zahlensys);
                break;
            case 6:
                printf("Sie haben sich fuer Dezimal zu Dual entschieden!\n");
                printf("Geben Sie nun eine Dezimal Zahl ein!\n");
                scanf("%d", &zahlensys);
                itoa (zahlensys,arr,2);
                printf ("Das Ergebnis lautet in Dual: %s\n",arr);
                break;
    
    
            default:
                printf("Kein richtiger Wert!");
    
        }
        return 0;
    }
    
    


  • @Luckyingmar sagte in Zahlensystemumrechner:

            printf("Geben Sie nun eine Duale Zahl ein!\n");
            scanf("%d", &zahlensys);
    

    Wofür steht nochmal "%d" in scanf und wie passt das mit deinem Ausgabetext zusammen?

    Da dies eine Übungsaufgabe ist, vermute ich mal, dass du einen String einlesen sollst und den dann von Hand umwandeln sollst. Ansonsten: lies einen String ein und wandle diesen mit strtol in einen int, dann wandle diesen mit itoa zurück. Sowohl bei itoa als auch bei strtol kannst du die Basis angeben.


  • Mod

    Ich denke, du hast die Aufgabe verfehlt. Du sollst bestimmt nicht zeigen, dass du scanf/printf beherrscht, sondern dass du Zahlendarstellungen verstanden hast. Daher hast du dein Problem mit dem Dualsystem, da dir scanf/printf dir da nicht mehr helfen können.

    Die Aufgabenstellung ist so gemeint, dass du eine Ziffernfolge (ein char-Array bekommst) und eine Basis bekommst und damit berechnen sollst, was die Ziffernfolge für einen Zahlenwert darstellt. Und die gleiche Funktion noch einmal umgekehrt, wo du einen Zahlenwert (Integer) und eine Basis bekommst, und daraus eine Darstellung erstellen sollst.

    Das heißt natürlich, dass du deinen bisherigen Ansatz quasi wegwerfen kannst, da er an der Aufgabe vorbeigeht. Ist leider so.

    Genauer gesagt: Du sollst strtol und seine Umkehrfunktion nachprogrammieren:
    http://www.cplusplus.com/reference/cstdlib/strtol/



  • für die umwandlung ins dezimalsystem du must eigentlich nur den wert der ziffer multipliziert mit der basis des zahlensystems potenziert mit der wertigkeit der jeweiligen ziffer (heißt das überhaupt so? also 2^0, 2^1, 2^2, ... bzw. 16^0, 16^1, 16^2, ...) aufsummieren.

    für die umwandlung ins dual- oder hexadezimalsystem nimmst du als ziffer immer den divisionsrest, als dividend den quotienten der letzten runde und als divisor die basis des zahlensystems.

    um das ganze in einen string umzuwandeln kannst du für 0 - 9 einfach '0' hinzuaddieren und für a bis f musst du eben eine switch-verzweigung verwenden.


  • Mod

    @Wade1234 sagte in Zahlensystemumrechner:

    um das ganze in einen string umzuwandeln kannst du für 0 - 9 einfach '0' hinzuaddieren und für a bis f musst du eben eine switch-verzweigung verwenden.

    Bei Zahlensystemumrechnungen aller Art (sowohl hin als zurück) empfiehlt sich, eine Liste der Ziffernzeichen parat zu haben. Wenn du ein Array char digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" definierst, kann man damit alles bis base36 abdecken und braucht keinerlei magische ASCII-Rechnereien.