Anfänger braucht Hilfe bei seinem Programm



  • Hi @

    Haben in der Uni mit C angefangen, habe die ersten Aufgaben gut hin bekommen. In der folgenden Aufgabe geht es darum Dezimalzahlen in Binärzahlen umzuwandeln.

    Mein bisheriges Programm:

    #include <stdio.h>
    #include <string.h>
    #include <math.h>

    void main (void)
    {
    char binzahl[132];
    int intzahl;
    void int2bin(char *binzahl, int intzahlx);

    printf("Zahl eingeben :");
    scanf("%d", &intzahl);

    printf("\n\n");
    int2bin(binzahl, intzahl);

    printf("\n\n");
    printf("Dezimal: %d, Binaer: %s\n", intzahl, binzahl);
    printf("\n\n");
    }

    void int2bin(char *binzahl, int intzahlx)
    {
    int rest, divisor, i;
    divisor = 2;
    i = 0;

    while(intzahlx > 0)
    {
    rest = intzahlx % divisor;
    printf("%d \t : %d = %d \t Rest : %d", intzahlx, divisor, intzahlx / divisor, rest);

    intzahlx = intzahlx / divisor;
    printf("\n");

    if(rest = 0)
    {
    binzahl = '0';
    }

    else
    {
    binzahl = '1';
    }

    i++;
    binzahl = '\0';
    }
    }

    An einem kleinen Bsp möchte zeigen wie mein Ausgabefenster aussieht. Nehmen wir als Beispiel die Zahl "14".

    Bsp.: 14 : 2 = 7 Rest = 0
    7 : 2 = 3 Rest = 1
    3 : 2 = 1 Rest = 1
    1 : 2 = 0 Rest = 1

    Dezimal: 14, Binaer: 0111

    Die Dezimal Zahl von 14 ist im Binär Code aber "1110". Das heißt ich muss meine Binär Ausgabe in genau anderer Reihenfolge ausgeben.

    Wie kann ich das anstellen 😕



  • hier mein vorschlag (ich hab hier den ganzen code. für ausgabe s.u. 🙂
    ka, ob die funktionsköpfe richtig sind ^^ aber das programm ist 100% richtig 🙂

    /* Eingabe einer Zahl zwischen 1 und 99 und Umrechnung in seinen Dualwert
    und Ausgabe in Form einer Zeichenkette */

    #include <stdio.h>
    #include <string.h>

    char *deziDual (int); //Deklaration der Funktionen

    void rev_str(char *);

    int main () {

    int fehler, iZahl;
    char *c;

    printf ("Bitte geben Sie ein Zahl zwischen 1 und 99 ein: ");

    do {
    scanf ("%d", &iZahl);
    if (iZahl >= 1 && iZahl <= 99){ //Bedingung...kann man löschen
    fehler=1;
    }
    else{
    printf ("Zahl liegt nicht zwischen 1 und 99!\n");
    }
    } while(fehler!=1);

    c = deziDual(iZahl);
    rev_str(c); //String umgedreht
    printf("Ausgabe: %s", c);

    return 0;
    }

    /* Umrechnung in den Dualwert

    Aufruf: deziDual (int Zahl)

    Parameter: int iZ: Zahl

    Rückgabetyp:
    int Zahl

    */

    char * deziDual (int zahl){
    int i = 0;
    static char cArray[8];

    while(zahl)
    {
    printf("%u : 2 = %u Rest %u\n", zahl, zahl/2, zahl%2);
    cArray[i] = '0' + zahl%2;
    cArray[++i] = '\0';
    zahl /=2;
    }
    return cArray;
    }

    /* Ausgabe des umgedrehten Strings

    Aufruf: void rev_str (char*)

    Parameter: char c: Kette

    Rückgabetyp:
    char Kette

    */

    void rev_str(char *str){
    char temp;
    char *end = str + strlen(str) -1;
    while(str < end){
    temp = *end;
    *end = *str;
    *str = temp;
    str++;
    end--;
    }
    }



  • @ matic: Keine Crossposts bitte

    @ all: In Zukunft bitte die [cpp]-Tags verwenden, dann ist der Code auch lesbar 😉



  • In etwa so:

    char * invert_char(char * bla)
    {
       int i,j;
       char *array;
       for(i = 0; bla[i] !='\0';i++);
       array = malloc(sizeof(char) *i+1);
    
       for (j = i ; j >=0; j--)
       {
         array[i-j] = bla[j];
       }
    
       array[i+1] = '\0';
       return array;  
    }
    

    somit kannst du die Reihenfolge deines Arrays ändern!!!!!!



  • dat komplette program muss man umkremplen:
    1. warum übergibtst du der funktion bin2int die zahl in binär und in int-form? wenn die beiden nun nicht dieselbe zahl sind??
    2. die funktion muss vorher deklariert werden.
    3. der modulooperator gibt dir direkt den rest an also lass die schleife wech denn
    4. das mit der binärdarstellung macht man anders:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char* int2bin(int ivar)
    {
        char* bin=0;
        bool write=false;
        bin=(char*)malloc(sizeof(char)*33);
        bin[0]=0;//damit man nachher alles per strncat anhängen kann.
    
              for(int i=(sizeof(int)*8)-1;i>=0;i--)
              {
                      if (ivar&1<<i) {write=true;strncat(bin,"1",1);}
                      else
                          if (true==write) strncat(bin,"0",1);
              };
              if (0==ivar) strncat(bin,"0",1);
              return bin;          
    };
    
    int main()
    {
        char* bin=0;
        int ivar=0;//kannst natürlich auch einlesen
        for (int i=0;i<3;i++)
        {
            ivar+=33*(i+1);
            bin=int2bin(ivar);
            printf("Binaerwert: %s\n",bin);
            printf("Dezimalwert: %d\n\n",ivar);
            free(bin);
        };    
        system("pause");    
    };
    

    muss noch schnell wech aber ich werds dir nachher n bisschen ausführen 😉



  • tja, ich habs so gemacht und es funktioniert, ihr besserwisser 😛



  • bill bones schrieb:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    // #include <stdbool.h> vergessen
    
    char* int2bin(int ivar)
    {
        char* bin=0; // NULL
        bool write=false;
        bin=(char*)malloc(sizeof(char)*33);
        /* - malloc wird nicht gecastet
           - sizeof(char) ist immer 1
           - Besser als 33 ist sizeof(int)*CHAR_BIT+1 (#include <limits.h>)
        */
        bin[0]=0;//damit man nachher alles per strncat anhängen kann. // strncat() ist hier mehr als nur übertrieben
                         
              for(int i=(sizeof(int)*8)-1;i>=0;i--) // siehe oben, CHAR_BIT
              {
                      // unnötig umständlich geschrieben, total inkonsistente Einrückung        // unnötige boolsche Variable
                      if (ivar&1<<i) {write=true;strncat(bin,"1",1);}
                      else
                          if (true==write) strncat(bin,"0",1);
              };
              if (0==ivar) strncat(bin,"0",1);
              return bin;          
    };
    


  • manmal hat man ja 'itoa'
    oder das: http://www.jbox.dk/sanos/source/lib/xtoa.c.html



  • @ tactX: ich verwende die Dev C/C++ IDE deshalb (wobei ich nichtmal weiss mit ob der code mit nem C oder C++ compiler compiliert wird, aber der cast z.b. ist dort notwendig) deshalb kein stdbool.h und "0" statt "NULL". "sizeof(char)" war übrigens nur zur besseren verständlichkeit. hab nich mit soviel krititk grechnet ;), einzig beim letzten kommentar muss ich dir zustimmen: hab den code z.t. aus nem C++ code und hab ihn auf die schnelle noch etwas umgeschrieben/teile kopiert usw. naja gut strncat ist hier möglicherweise etwas zu viel des guten 😃 wollts ihm halt verständlich machen.

    @ matic: ich weiss jetzt nich ob dir dinge wie malloc(), zeiger oder bitoperationen bekannt sind. wenn du damit jetzt nix anfangen kannst, kannst du dich ja nochmal melden.



  • bill bones schrieb:

    hab nich mit soviel krititk grechnet 😉

    War nicht böse gemeint. Aber wenn du mit so ultimativen Sätzen wie

    das mit der binärdarstellung macht man anders

    kommst, erwarte ich zumindest kein strncat 😉

    PS: Und hör auf C mit C++ zu compilieren. C Code -> C Compiler.



  • Sorry hab ich vergessen zu erwähnen.
    Die "strlen", "strcpy" Funktionen dürfen nicht verwendet werden.



  • Diese Funktionen kannst du dir auch selber schreiben, wenn du die vorgefertigten Funktionen nicht verwenden darfst. (die C-Stringverarbeitung basiert darauf, daß ein "String" von der Endemarke '\0' abgeschlossen wird)

    int my_strlen(char* str)
    {
      int len=0;
      while(str[len]!='\0') ++len;
      return len;
    }
    
    void my_strcpy(char* tgt,const char* src)
    {
      while(*src!='\0')
      {
        *tgt=*src;
        ++tgt;++src;
      }
    }
    


  • int my_strlen(char *s)
    {
        char *p = s;
        while (*p) p++;
        return p-s;
    }
    
    void my_strcpy(char *to, const char *from)
    {
        while (*to++ = *from++);
    }
    

Anmelden zum Antworten