Operacje logiczne na liczbach dwójkowych

0

Witam. Mam dziwny problem. Wie ktoś może czemu nie działa ten kod. Chodzi o to, że program ma przekonwertować liczby podane w parametrach w wierszu poleceń na postać binarną. Do tego ma pobrać operator także podany w tych parametrach. Konwersja z liczby dziesiętnej na dwójką działa. Pojawił się problem gdy chce zrobić operację logiczną. Gdy wpisuje nazwa_programu.exe 10 9 OR program niby wyświetla dwie liczby binarne i jakąś tam operacje lecz jest to ciągle and. Dodatkowo jeszcze wypisuje komunikat "Nie podałeś operatora" obok tej operacji za każdym razem. Co zrobić aby program po wpisaniu w trzecim parametrze danej operacji wykonywał ją poprawnie? Nie mam już pomysłu jak to naprawić :(

 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
int podaj_liczbe()
{
    int liczba_dziesietna;
    printf("Podaj liczbe: ");
    scanf("%d", &liczba_dziesietna);
    return liczba_dziesietna;
}
int konwersja(int liczba_dziesietna)
{
int i=0, tab[31];
while(liczba_dziesietna)
{
    tab[i++]=liczba_dziesietna%2;
    liczba_dziesietna/=2;
}
for(int j=i-1;j>=0;j--)
printf("%d",tab[j]);
}
int main ( int argc, char* argv[] )
{
   int wynik, wynikk, wynikkk;
   printf(" ");
   konwersja(atoi(argv[1]));
   printf(" ");
   konwersja(atoi(argv[2]));

   if((argv[3])=="OR"){
   wynik = atoi(argv[1]) | atoi(argv[2]);
   printf("=");
   konwersja(wynik);
   }else if((argv[3])=="AND"){
   wynik = atoi(argv[1]) & atoi(argv[2]);
   printf("=");
   konwersja(wynikk);
   }else if((argv[3])=="XOR"){
   wynik = atoi(argv[1]) ^ atoi(argv[2]);
   printf("=");
   konwersja(wynikkk);
   }else{
       printf("Nie podales operatora");
   }
  return 0;
}
`````````````````````````````````````````````````````````````````````````````````````````````````````````
1
   wynik = atoi(argv[1]) & atoi(argv[2]);
   printf("=");
   konwersja(wynikk);

Przyjrzyj się zmiennym w tym fragmencie.

1

Sugerowane rozwiązanie

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

void binary_print(unsigned value,const char *suffix) // nic nie zwraca to void nie int, nazwa konwesja która nie konwertuje lecz wyświetla jest myląca
{
    bool tab[sizeof(value)<<3]; //ilość bajtów razy 8
    for(int i=0;;)
    {
        tab[i++]=value&1; // szybsza wersja %2, po to uczą was opiercji bitowych
        // value>>=1; // szybsza wersja /=2 - wstawiono bezpośrednio w warunek
        if(!(value>>=1)) // aby zdążyło wypisać 0 w przypadku kiedy value od początku 0
        {
            printf(" ");
            while(i) printf("%c",'0'+tab[--i]);
            printf(" %s",suffix);
            return;
        }
    }
}

int main(int argc,char* argv[])
{
    if(argc<=3) // warto sprawdzić czy podano 3 parametry
    {
        printf("Oczekiwano 3 parametry\n");
        return 1;
    }
    else
    {
        unsigned a=(unsigned)atoi(argv[1]),b=(unsigned)atoi(argv[3]),c; // unsigned żeby nie mieć problemów że znakiem
        const char *op=strupr(argv[2]); // teraz można podać OR, or, Or, a nawet oR
        if(!strcmp(op,"OR")) c=a|b; // napisy typu c-string nie da się porównać za pomocą ==
        else if(!strcmp(op,"AND")) c=a&b;
        else if(!strcmp(op,"XOR")) c=a^b;
        else
        {
            printf("Nieznana operacja\n");
            return 1;
        }
        binary_print(a,op); // po to suffix w binary_print, aby nie dawać tu dodatkowych printów pomiędzy
        binary_print(b," = ");
        binary_print(c,"\n");
    }
    return 0;
}
0
_13th_Dragon napisał(a):

Sugerowane rozwiązanie

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

void binary_print(unsigned value,const char *suffix) // nic nie zwraca to void nie int, nazwa konwesja która nie konwertuje lecz wyświetla jest myląca
{
    bool tab[sizeof(value)<<3]; //ilość bajtów razy 8
    for(int i=0;;)
    {
        tab[i++]=value&1; // szybsza wersja %2, po to uczą was opiercji bitowych
        // value>>=1; // szybsza wersja /=2 - wstawiono bezpośrednio w warunek
        if(!(value>>=1)) // aby zdążyło wypisać 0 w przypadku kiedy value od początku 0
        {
            printf(" ");
            while(i) printf("%c",'0'+tab[--i]);
            printf(" %s",suffix);
            return;
        }
    }
}

int main(int argc,char* argv[])
{
    if(argc<=3) // warto sprawdzić czy podano 3 parametry
    {
        printf("Oczekiwano 3 parametry\n");
        return 1;
    }
    else
    {
        unsigned a=(unsigned)atoi(argv[1]),b=(unsigned)atoi(argv[3]),c; // unsigned żeby nie mieć problemów że znakiem
        const char *op=strupr(argv[2]); // teraz można podać OR, or, Or, a nawet oR
        if(!strcmp(op,"OR")) c=a|b; // napisy typu c-string nie da się porównać za pomocą ==
        else if(!strcmp(op,"AND")) c=a&b;
        else if(!strcmp(op,"XOR")) c=a^b;
        else
        {
            printf("Nieznana operacja\n");
            return 1;
        }
        binary_print(a,op); // po to suffix w binary_print, aby nie dawać tu dodatkowych printów pomiędzy
        binary_print(b," = ");
        binary_print(c,"\n");
    }
    return 0;
}

A jak chciałbym dać negację to analogicznie robię:

else if(!strcmp(op,"N")) c=~a;

czy inaczej?

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