Program zmieniajacy z dziesietnych na binarne

0

Witam
Musze napisac program w jezyku c ktory pobiera od uzytkownika 2 liczby, a nastepnie zamienia je na binarne oraz wyswietla.
moj kod:

#include<stdio.h>
#include <stdlib.h>
void na_binarne(int liczba)
{
	int i=0;
	int tab[8];
	while(liczba!=0)
	{
		tab[i]=liczba%2;
		liczba=liczba/2;
		i++;
	}
}
	
int main(void)
{
	int lb1;
	int lb2;
	printf("Podaj 1 liczbe:\n ");
	scanf("%d", &lb1);
	printf("Podaj 2 liczbe:\n ");
	scanf("%d", &lb2);
	na_binarne(lb1);
	na_binarne(lb2);
	
return 0;
}

jak wyswielic te liczby w systemie binarnym?

0

Zwróć po prostu tablicę z funkcji na_binarne i wypisz ją w mainie, albo wypisz tablicę od razu w niej

int* na_binarne(int liczba)
{
int i=0;
int* tab = new int[8];
while(liczba!=0)
{
tab[i]=liczba%2;
liczba=liczba/2;
i++;
}

return tab;
}
void na_binarne(int liczba)
{
int i=0;
int tab[8];
while(liczba!=0)
{
tab[i]=liczba%2;
liczba=liczba/2;
i++;
}

for(int i = 0; i < 8; i++)
     std::cout<<tab[i];
}
0

@Eldorad O.: A jak wypisac ta tablice w mainie?

0

Na przykład tak:

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

int* na_binarne(int liczba)
{
int i=0;
int* tab = new int[8];
while(liczba!=0)
{
tab[i]=liczba%2;
liczba=liczba/2;
i++;
}
return tab;
}

void wypisz(int* tab, int rozmiar)
{
   for(int i = 0; i < rozmiar; i++)
       printf("%d", tab[i]);
       
    printf("%c", '\n');
}

int main(void)
{

int lb1;
int lb2;
printf("Podaj 1 liczbe:\n ");
scanf("%d", &lb1);
printf("Podaj 2 liczbe:\n ");
scanf("%d", &lb2);
na_binarne(lb1);
na_binarne(lb2);

int* lb1_bin = na_binarne(lb1);
int* lb2_bin = na_binarne(lb2);

wypisz(lb1_bin, 8);
wypisz(lb2_bin, 8);

return 0;
}
0

@Eldorad O.: Przy uzytkowaniu programu wyskakuje "Segmenation fault(core dumped)" co to oznacza?

0

To oznacza, że program próbuje uzyskać dostęp do części pamięci do której dostępu nie ma.
Dziwne w sumie, sprawdzałem na różnych kompilatorach i śmiga.
Przekleiłeś/aś cały kod tak jak go podałem?

A weź zamień:

int* tab = new int[8];

na:

int* tab = (int*) malloc(8 * sizeof(int));
0

@Eldorad O.: Teraz wyskakuje:
./nowy.c: line 3: $'\r': command not found
./nowy.c: line 4: syntax error near unexpected token (' '/nowy.c: line 4: int* na_binarne(int liczba)

0

Jaki używasz kompilator, gcc?
Jaką komendą uruchamiasz program?

Edit:
Mała poprawka do funkcji wypisującej, zapomniałem że powinno tę tablicę wypisać się od końca:

void wypisz(int* tab, int rozmiar)
{
   for(int i = rozmiar-1; i >= 0; i--)
       printf("%d", tab[i]);

    printf("%c", '\n');
}
1

@Eldorad O.: Jak nanioslam poprawkę, to program zaczął działac. Dziekuje bardzo za pomoc !!!! :)

2

EDIT: dodałem 3-cią wersję.

#include <iostream>
using namespace std;

void showbin1(ostream &s,int value) { for(int next=1;next;s<<(value-(next<<1)),value=next) next=value>>1; }

void showbin2(ostream &s,int value) 
{
	int next=value>>1;
	if(next) showbin2(s,next);
	s<<(value-2*next);
}

void showbin3(ostream &s,int value)
{
	int bitcount=1;
	for(int tmp=value;tmp>>=1;) ++bitcount;
	while(bitcount--) s<<(1&(value>>bitcount));
}

int main()
{
	showbin1(cout<<endl,127);
	showbin1(cout<<endl,10);
	showbin1(cout<<endl,32);
	showbin1(cout<<endl,0);
	cout<<endl;
	showbin2(cout<<endl,127);
	showbin2(cout<<endl,10);
	showbin2(cout<<endl,32);
	showbin2(cout<<endl,0);
	cout<<endl;
	showbin3(cout<<endl,127);
	showbin3(cout<<endl,10);
	showbin3(cout<<endl,32);
	showbin3(cout<<endl,0);
	return 0;
}
2

@Eldorad O.: > @AnyKtokolwiek: Ok, więc pokaż optymalną wersję

PO PIERWSZE
Zdecydujmy się konsekwentnie na język. Jak widzę new [] ... return ptr to mi ciupaga sama do ręki wskakuje (pamiątka znad morza, po dziadku z AK) a scyzoryk kielecki po babci j/w

w C++ to można zwracać std::vektor, albo swoją klasę, która enkapsuluje alokację

Ale temat mówi o C
W C jest kilka możliwości / konwencji

  • zwracanie nowo alokowanego - mocno udokumentowanego :"musisz zwalniać"
  • zwracanie statycznego obszaru - obecne w b.stand, wspominam tu dla pełności
  • funkcja w konwencji "wypełnij strukturę" i tu jest moja sympatia w tym zadaniu. Dane są nazwane, nie ma dylematu "czym jest zwracana tablica" itd.
struct Binary {
   short bin_digits[64];
}

void to_binary (int number,  Binary * bin)
{
}
...

main() {
Binary wrk;
to_binary(v, &wrk);
}

UPDATE: w "nowszych" wersjach C, czyli gdzieś od > 20 lat można zwracać struktury

Binary to_binary(int number){
   Binary wrk;
   return wrk;
}

main() {
Binary wrk;
wrk = to_binary(v);
}
0

Ja wrzucę ci cały algorytm na zamianę liczb dziesiętnych na binarne - napisany jest w C++ - a ty masz chyba zajęcia z C - pozmieniaj sobie wszystkie "cout" i "cin" na "printf" i "scanf" - chyba powinno działać, bo ja nie miałem styczności z C

#include <iostream>

using namespace std;

int main(void)
{
    int wyn, bin, rozm_tab, ile_bitow, przesuniecie;

    std::cout << "Podaj liczbe dziesietna ";

    std::cin >> bin;

    for(int i=bin, j=1; i>=1; i=i/2, j++)
    {
        rozm_tab=j;
    }

    int *tab = new int [rozm_tab];
    int *tabPOM = new int [rozm_tab];

    for(int i=bin, j=0; i>=1; i=i/2, j++)
    {
        if(i % 2 == 0)
        {
            wyn = i % 2;
        }
        else if(i % 2 == 1)
        {
            wyn = i % 2;
        }
        tab[j]=wyn;
    }

    for(int j=0, i=rozm_tab-1; j<rozm_tab; j++, i--)
    {
        tabPOM[j]=tab[i];
    }

    std::cout << bin << " -> ";

    ile_bitow = rozm_tab;

    if(rozm_tab % 4 == 0)
    {
        ile_bitow = (ile_bitow + 0);
        przesuniecie = 0;
    }
    else if(rozm_tab % 4 == 1)
    {
        std::cout << "000";
        ile_bitow = (ile_bitow + 3);
        przesuniecie = 3;
    }
    else if(rozm_tab % 4 == 2)
    {
        std::cout << "00";
        ile_bitow = (ile_bitow + 2);
        przesuniecie = 2;
    }
    else if(rozm_tab % 4 == 3)
    {
        std::cout << "0";
        ile_bitow = (ile_bitow + 1);
        przesuniecie = 1;
    }

    for(int i=0, j=1; i<rozm_tab; i++, j++)
    {
        tab[i]=tabPOM[i];
        std::cout << tab[i];

        if((j+przesuniecie) % 4 == 0)
        {
            std::cout << " ";
        }
    }

    std::cout << " = (" << rozm_tab << ") bitow i (" << przesuniecie << ") zera wiodace" << std::endl;
    std::cout << std::endl;
    std::cout << "razem (" << ile_bitow << ") bitow" << std::endl;

    delete [] tab;
    delete [] tabPOM;

    std::cout << std::endl;

    return 0;
}

3
zkubinski w komentarzu napisał(a):

... jako programista powinieneś rozumieć ten kod i powinno ci wystarczyć — zkubinski 5 minut temu

zkubinski napisał(a):
    for(int i=bin, j=0; i>=1; i=i/2, j++)
    {
        if(i % 2 == 0)
        {
            wyn = i % 2;
        }
        else if(i % 2 == 1)
        {
            wyn = i % 2;
        }
        tab[j]=wyn;
    }

No właśnie jako programista nie rozumiem tego kodu, każdemu przynajmniej początkującemu programiście na widok tego kodu włos się będzie jeżył.
Czy rozumiesz że o ten kod:
for(int i=bin,j=0;i>=1;i=i/2,j++) tab[j]=i%2;
robi dokładnie to samo co ten wyżej?
Może zostaw próby odpowiadania na posty przynajmniej do czasu kiedy zaczniesz takie rzeczy widzieć, czyli zostaniesz początkującym programistą.

0

@_13th_Dragon:

for(int i=bin,j=0;i>=1;i=i/2,j++) tab[j]=i%2;
robi dokładnie to samo co ten wyżej?

doprawdy ? a może chciałem napisać to dla jasności ? Raczej ty napisałeś to tak, a raczej zagmatwałeś, że początkujący nie wie co dzieje się w środku, bo skróciłeś sobie do jednej linijki - pytanie mam takie - walczysz o 0,000000001s aby twój algorytm szybciej się wykonał ? Czy uważasz, że w tym przypadku to nie ma sensu ? Ja postawiłem na czytelność, każdy ma swój styl i tyle

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