Hexadezimalzahl -> Dezimalzahl



  • spagetti schrieb:

    zahl |= dectab[j];
    
    zahl |= (j%16 + j/16*10);
    

    :xmas2:



  • hmmm, ich bekomms nicht hin...
    ich scheitere schon bei der eingabe von der hexzahl.
    welche variable wird für die eingabe genutzt, und wie sieht da die syntax aus?
    wenn ich etwas mit

    gets ( variable );
    

    mache, spuckt er mir einen fehler beim compilieren aus.
    könntet ihr mir ne erklärung zu den verwendeten variablen geben, ich verstehe es leider einfach nicht 😞 daher schaff ichs auch nich das "drum herrum" zu programmieren.
    achja und ein frohes neues wünsche ich 🙂



  • tim-buktu schrieb:

    gets ( variable );
    
    char variable[256];
    gets (variable);
    

    aber vorsicht,
    nicht mehr als 'sizeof(variable)-1' zeichen eingeben, weil 'gets' nicht weiss wieviel platz da ist...
    :xmas2:



  • Ohne den Code wie du variable definiert hast können wir nichts sagen. Die Fehlermeldungen gehören auch zu einer ordentlichen Problembeschreibung.
    Außerdem ist gets() eh nicht gut. fgets() sollte für Eingaben benutzt werden. Ein einfaches Beispiel für die Benutzung von fgets liefer ich dir sogar:

    #include <stdio.h>
    
    #define BUFF_MAX 64
    
    int main(void){
        char buffer[BUFF_MAX];
        fgets(buffer, BUFF_MAX, stdin);
        puts(buffer);
        return 0;
    }
    


  • nun ja, ich wollte es jetzt mit diesem code umsetzten

    char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};
    int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15};
    
    char hex[256] = "ffffffff";
    int zahl = 0;
    
        for (int i = 0, j; i < 8; i++)
        {
    
            for (j = 0; j < 24; j++)
            {
                if (hex[i] == hextab[j])
                {
                    zahl <<= 4;
                    zahl |= dectab[j];
                    break;
    
                }
            }
            if (hex[i] != hextab[j])
            {            
                printf("Fehler in Hexzahl!");
                break;
            }
        }
    

    aber ich verstehe ihn leider nicht wirklich 😞
    wie muss ich den code abändern, damit ich eine eingabe machen kann bzw. auch wieder die richtige dezimalzahl ausgegeben wird...also welche variable wird dazu genutzt? ist das hextab[] oder hex[] ? 😕 ich hätte nich so viel feiern sollen an den feiertagen, ich glaub das hat mir das gehirn zermatscht 🙄



  • hmmm also, so langsam steige ich doch dahinter...
    das problem an dem programm bisher ist nur, das wenn ich nur eine ziffer eingebe, das der hinter diese ziffer nullen stellt, also praktisch die maximale wertigkeit für diese eine ziffer nimmt, wobei er dabei glaub ich auch en rechnen fehler hat(glaube ich jedenfalls). hab den code mal so abgeändert:

    char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'};
    int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15};
    char hex[256] = "ffffffff";
    unsigned long zahl = 0,i,j;
    gets (hex);
    
        for ( i = 0 ; i < 8; i++)
        {
    
            for (j = 0; j < 24; j++)
            {
                if (hex[i] == hextab[j])
                {
                    zahl <<= 4;
                    zahl |=(j%16 + j/16*10);
                    break;
    
                }
            }
            if (hex[i] != hextab[j])
            {
                printf("Fehler in Hexzahl!");
                break;
            }
        }
    
        puts(hex);
        printf("%li",zahl);
    
        getch();
    

    wie bekomm geht das, das der wenn ich nur eine ziffer eingebe, die kleinste wertigkeit dafür nimmt, sprich die vorderen 7 stellen mit 0en füllt?



  • machs so

    #include <stdio.h>
    #include <string.h>
    int main()
    {
    const char hextab[24] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','A','B','C','D','E','F'}; 
    const int  dectab[24] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10, 11, 12, 13, 14, 15, 10, 11, 12, 13, 14, 15}; 
    
    char hex[256]; 
    
    unsigned long zahl = 0;
    size_t i, j; 
    
        gets (hex); 
    
        for ( i = 0 ; i < strlen(hex) && i < 8; i++) 
        { 
    
            for (j = 0; j < 24; j++) 
            { 
                if (hex[i] == hextab[j]) 
                { 
                    zahl <<= 4; 
                    zahl |= dectab[j]; 
                    break; 
    
                } 
            } 
            if (hex[i] != hextab[j]) 
            { 
                printf("Fehler in Hexzahl!"); 
                //break; 
                return 0;
            } 
        } 
        if (strlen(hex) >= 8) printf("Fehler Hexzahl hat mehr als 8 Stellen!"); 
        else
            printf("%li\n",zahl); 
    
        return 0;
    }
    

    🕶



  • dankö, so meinte ich es.
    verstehe nur 2 zeilen nicht 100%ig

    size_t
    

    wozu braucht man das ?
    und

    i < strlen(hex)
    

    ansonsten ist der code ja fast gleich dem von vorher.

    aufgabe 2 hab ich mitlerweile auch fertig.

    #include <stdio.h>
    #include <conio.h>
    void main()
    {
    int awahl;
    
    do
    {
    int a[5]={ 0,0,0,0,0},b[5]={ 0,0,0,0,0},tmp[6]={ 0,0,0,0,0,0},i;
    clrscr();
    printf("Menupunkt 1:\tSkalarprodukt berechnen\n");
    printf("Menupunkt 0:\tEnde");
    printf("\n\nBitte geben Sie einen Menupunkt ein: ");
    scanf("%i",&awahl);
    
    switch (awahl)
    {
    	case 1:
       {
       clrscr();
    
    for (i=0;i<5;i++)
    {
    	printf("Bitte geben Sie a%i ein: ",i);
       scanf("%i",&a[i]);
    }
    for (i=0;i<5;i++)
    {
    	printf("Bitte geben Sie b%i ein: ",i);
    	scanf("%i",&b[i]);
    }
    clrscr();
    for (i=0;i<5;i++)
    {
    	tmp[i]=a[i]*b[i];
       printf("Produkt aus a%i und b%i ist: %i\n",i,i,tmp[i]);
       getch();
    }
    tmp[6]=tmp[0]+tmp[1]+tmp[2]+tmp[3]+tmp[4]+tmp[5];
    printf("\n\nDas Skalarprodukt ist: %i",tmp[6]);
    getch();
    break;
    }
    
    	case 0:
       {
       clrscr();
       printf("Ende");
       break;
       }
    	default:
       {
       clrscr();
       if (awahl!=1 && awahl !=0)
       {printf("Falsche Eingabe");
       getch();
       break;
       }
       }
       }
    }while(awahl!=0);
    
    }
    

    jemand was dran auszusetzen ? 😃



  • size_t ist ein vorzeichenloser Ganzzahltyp - der laut Standard zur Angabe von Speichergrößen verwendet wird. Und der Vergleich auf strlen(hex) sichert, daß du nicht über die Länge der Eingabe hinausliest (hinter der Eingabe stehen eventuell noch Nonsens-Zeichen, die dir die Berechnung zerstören könnten)

    Zu deiner neuen Frage: Was genau war die Aufgabe? Und ist es wirklich nötig, die Zwischenergebnisse der Skalarprodukt-Berechnung mitzuführen?



  • das ist die aufgabe:
    zur aufgabe2:
    ein programm, das die berechnung eines skalarproduktes realisiert.
    vorgabe:
    zwei int felder a und b jeweils der länge 5 sollen eingelesen werden (a0,a1,a2...) (b0,b1,b2...)
    es soll nach der formel skprod=∑i=0..4 Ai*Bi berechnet werden und anschließend sollen die beiden vektoren a und b bzw ihre komponenten sowie das ergebniss skprod ausgegeben werden.


Anmelden zum Antworten