Taschenrechner, binaer



  • Hallo!
    Ich habe folgenden kleinen Taschenrechner geschrieben (Code zum verstaendnis wieder vereinfacht):

    #include <stdio.h>
    
    void itob(int dec, char stack[]){
    
      unsigned short int bin, i;  
    
      for(i = 0; i!= 10; i += 1) {
        bin = (dec % 2);
        dec = (dec / 2);
        stack[i] = bin;
    
        if(dec == 0) {break;}
      }
    
    /* for(i = i; i >= 0; i -= 1) { :warning: 
        printf("%d", stack[i]);
        if(i == 0) {break;}
      } */
    
    } // end itob() 
    
    int solve(int x, char op, int y){
        int z; // speichert das Ergebnis der Rechnung
        switch(op){
            case '+': return z = x + y; break;
            case '-': return z = x - y; break;
            case '/': return z = x / y; break;
            case '*': return z = x * y; break;
            case '&': return z = x & y; break;
            case '|': return z = x | y; break;
            default: printf("Es wurde ein ungueltiges Zeichen eingegeben. \n");
        } 
    } // end solve()
    
    int main(int argc, char *argv[]) {
        char sx[10], sy[10],sz[10];
        int x = 4;
        int y = 6;
        int z = 0;
        char op = '+';    
    
        // Aufgabe loesen 
        printf("solve: %i %c %i \n", x, op, y);
        z = solve(x,op,y);
       // printf("%i \n", z);
    
        // Binaerdarstellungen ermitteln 
        itob(x,sx); 
        itob(y,sy);
        itob(z,sz);
    
        // Ausgabe des Ergebnisses
       printf("\n %s %d\n%c %s %d\n= %s %d\n", sx,x,op,sy,y,sz,z); 
       getchar();
        return 0; 
    }
    

    Mein Problem: Die Methode itob() zum Umwandeln von Dezimal- in Binaerzahlen funktioniert einwandfrei.
    In Zeile 55 moechte ich alles ausgeben, aber sx, sy und sz werden nicht ausgegeben.
    Ich vermute das bei der Uebergabe der Zeichenketten irgendein Fehler passiert.

    Ich glaube ich muss die Methode itob() von void zu char* itob() oder aehnliches aendern, aber wie kann ich dann die Zeichenkette korrekt zurueckgeben, damit ich sie in Zeile 55 ausgeben kann?

    Vielen vielen Dank schonmal!



  • Dein Problem ist vermutlich, daß itob() nicht die Zeichen '0' und '1' in die Ausgabe schreibt, sondern die char-Werte 0 und 1 (Stringende bzw. nicht-darstellbares Sonderzeichen). Und da fehlt die Stringende-Marke, wenn du die Ausgabe als Text weiterverarbeiten willst.



  • wieso fehlt die string ende marke?



  • Weil du keine gesetzt hast 😉 (C Stringfunktionen wie strcpy() oder auch printf() gehen von der übergebenen Position bis zur ersten '\0', die sie im Speicher finden - wenn du beim Aufbauen des Strings (ich gehe davon aus, daß du den Unterschied zwischen '1' und 1 korrigiert hast) keine entsprechende Kennung setzt, ist das irgendwo im Speicher.



  • ehrlich gesagt weiss ich nicht wie ich das aendern soll 😉



  • Da der Rest des Programms ganz ordentlich aussieht und ich hoffe, auch wirklich von dir ist, helfe ich mal:

    void itob(int dec, char stack[]){ 
    
      unsigned short int bin, i;   
    
      for(i = 0; i < 10; ++i)
      { 
        bin = (dec % 2); 
        dec = (dec / 2); 
        stack[i] = '0' + bin; /* changed */
    
        if(dec == 0) break;
      } 
      stack[i] = '\0'; /* changed */
    }
    


  • Leider funktioniert deine Verbesserung nicht.

    -- i ist am Ende der Schleife immer der höchste Element.
    -- Die Zeichen stehen in der falschen Reihenfolge im Speicher
    -- wenn die Schleife nicht mit break sondern mit i=10 abbricht
    schreibst du mit stack[10] hinter das Array.

    Hier meine Verbesserung:

    #include <stdio.h> 
    #include <string.h>
    
    static void print_bin(char stack[])
    {
        int i;
        for (i=0; i<10; ++i)  printf("%c", stack[i]);
        printf("\n");
    }
    
    static void itob(int dec, char stack[])
    {
        int bin, i;
        printf("dec = %3d    bin: ", dec);
        for(i = 10; i > 0; --i) {
            bin = dec % 2;
            dec = dec >> 1;
            stack[i-1] = bin+'0';
            if (dec == 0) break;
        }
        print_bin(stack);
    }
    
    static int solve(int x, char op, int y)
    {
        int z;
        switch(op){
            case '+': return z = x + y; break;
            case '-': return z = x - y; break;
            case '/': return z = x / y; break;
            case '*': return z = x * y; break;
            case '&': return z = x & y; break;
            case '|': return z = x | y; break;
            default: printf("Es wurde ein ungueltiges Zeichen eingegeben. \n");
        }
        return -1;
    }
    
    int main(void) {
        char sx[11], sy[11],sz[11];
        int x = 4;
        int y = 6;
        int z = 0;
        char op = '+';
    
        /* Aufgabe loesen */
        printf("solve: %i %c %i \n", x, op, y);
        z = solve(x,op,y);
    
        /* Binaerdarstellungen ermitteln */
        memset(sx, '0', 10); sx[10] = 0;
        memset(sy, '0', 10); sy[10] = 0;
        memset(sz, '0', 10); sz[10] = 0;
        itob(x,sx);
        itob(y,sy);
        itob(z,sz);
    
        /* Ausgabe des Ergebnisses */
        printf("\n  %s %3d\n%c %s %3d\n= %s %3d\n", sx,x,op,sy,y,sz,z);
        getchar(); 
        return 0;
    }
    

    Ach ja,
    du hattest ursprünglich i als unsigned (in itob) definiert.
    Und in der Schleife anschließend i=i (brauchst du nicht) und
    i>=0 verwendet. unsigned ist IMMER >=0.

    Gruß mcr



  • Wenn du in den Zeilen 53 - 55 statt '0' ein Leerzeichen ' '
    einträgst, verschwinden auch die führenden Nullen.

    memset(sx, ' ', 10);
    anstelle von:
    memset(sx, '0', 10);
    

    Gruß mcr


Anmelden zum Antworten