Problem z konwersją dziesiętnej do binarnej

0

Jak w temacie, chcę utworzyć kalkulator realizujący operacje bitowe z konwersją do liczb binarnych na samym końcu. Moim problemem jest to, że zawsze wychodzi mi ten sam błędny wynik w przypadku każdego case'a (00010110000).

#include <stdio.h>
#include <stdlib.h>
    void konwert(){
    int a[10],i,sum;
    for(i=0;sum>0;i++)
    {
    a[i]=sum%2;
    sum=sum/2;
    }
    printf("Liczba binarna=");
    for(i=i-1;i>=0;i--)
    {
    printf("%d",a[i]);
    }
    }



int main()
{
    int var1,var2,sum,a[10],i;
    char op;
    printf("Jaka operacje chcesz wykonac?\n");
    scanf("%c", &op);
    printf("Podaj wartosci\n");
    scanf("%d %d", &var1, &var2);
    switch(op){

    case '&':
    sum=var1&var2;
    konwert();
    break;

    case '|':
    sum=var1|var2;
    konwert();
    break;

    case '^':
    sum=var1^var2;
    konwert();
    break;

    case '!':
    sum=~var1;
    konwert();
    break;

    default:
    printf("Niepoprawny operator");
    break;


    }
    }


Jeśli macie jakieś uwagi co mógłbym poprawić, albo jakieś ciekawsze rozwiązania to chętnie posłucham :)

2

A co Ty próbujesz konwertować? Bo jak na moje to jakieś śmieci co zalegają w sum, bo tam nie ma żadnej wartości.

0
hauleth napisał(a):

A co Ty próbujesz konwertować? Bo jak na moje to jakieś śmieci co zalegają w sum, bo tam nie ma żadnej wartości.

Śmieci ? Nie do końca rozumiem, chciałbym osiągnąć efekt gdzie po podaniu 2 liczb dziesiętnych wybieram operacje bitową której wynik ląduje w sum i odpala się funkcja która konwertuje to na binarny.

0
Harov napisał(a):
hauleth napisał(a):

A co Ty próbujesz konwertować? Bo jak na moje to jakieś śmieci co zalegają w sum, bo tam nie ma żadnej wartości.

Śmieci ? Nie do końca rozumiem, chciałbym osiągnąć efekt gdzie po podaniu 2 liczb dziesiętnych wybieram operacje bitową której wynik ląduje w sum i odpala się funkcja która konwertuje to na binarny.

Poczytaj o zasięgu zmiennych. Zmienne wewnatrz funkcji i w programie głównym to różne zmienne, nawet jeżeli się tak samo nazywają. W związku z tym, wewnątrz funkcji konwert() zmienne mają niezdefiniowane wartości i nie mają nic wspólnego z tym, co siedzi poza funkcją konwert.

Pozostaje albo zrobić zmienne globalne (średnio sensowne) albo przekazywać je do funkcji jako parametr (tylko uwaga na tablicę, bo dla niej przekazuje się wskaźnik)

0

Zamiast

void konwert(){
  int a[10],i,sum;
  // ....
}
int main()
{
    int var1,var2,sum,a[10],i;
    char op;
   // ....
}

napisz tak

int sum;
void konwert(){
  int a[10],i;
  // ....
}
int main()
{
    int var1,var2,a[10],i;
    char op;
   // ....
}

i przetestuj jeszcze raz.

0
heillos napisał(a):
Harov napisał(a):
hauleth napisał(a):

A co Ty próbujesz konwertować? Bo jak na moje to jakieś śmieci co zalegają w sum, bo tam nie ma żadnej wartości.

Śmieci ? Nie do końca rozumiem, chciałbym osiągnąć efekt gdzie po podaniu 2 liczb dziesiętnych wybieram operacje bitową której wynik ląduje w sum i odpala się funkcja która konwertuje to na binarny.

Poczytaj o zasięgu zmiennych. Zmienne wewnatrz funkcji i w programie głównym to różne zmienne, nawet jeżeli się tak samo nazywają. W związku z tym, wewnątrz funkcji konwert() zmienne mają niezdefiniowane wartości i nie mają nic wspólnego z tym, co siedzi poza funkcją konwert.

Pozostaje albo zrobić zmienne globalne (średnio sensowne) albo przekazywać je do funkcji jako parametr (tylko uwaga na tablicę, bo dla niej przekazuje się wskaźnik)

Poleciałem na zmiennych globalnych póki co bo w sumie to zadziałało tak jak powinno z tego co widzę, ale douczę się co do przekazywania o którym wspomniałeś, dzięki :)

1

Każda funkcja powinna być zamkniętym pudełkiem do którego coś wchodzi i coś wychodzi.
Zmienna globalna jest najgorszym sposobem komunikacji z funkcją, wiec nawet nie myśl o tym.

Ta twoja funkcja konwert powinna wyglądać tak (łącznie ze zmianą nazwy - jeszcze lepiej jakbyś pisał to po angielsku):

void zapisz_binarnie(char *wynik, int rozmiar, int wartosc)
{
    ....
}

Jeśli wskaźniki to dla ciebie za dużo to:

void wypisz_binarnie(int wartosc)
{
    ....
}

Wtedy wynik funkcji trafia na standardowe wyjście.

1 użytkowników online, w tym zalogowanych: 0, gości: 1