[C++] Rekurencja i zamiana na liczbę binarną


(Quentin) #1

Witam!

Mam taki oto kod, który oblicza podaną przez nas liczbę dziesiętną na liczbę binarną.

#include 

using namespace std;

void dwojkowo(int licz);

int main()

{


	int liczba;


		cout << "\n\nPodaj liczbe na zamiane dwojkowa: ";

		cin >> liczba;


		cout << "\t Oto liczba w zapisie binarnym: ";

			dwojkowo(liczba);


		cout << "\n\n";



cout << "\n\n\n\n\n\n---------------------------------------------------------------\n";

system("pause");

}

void dwojkowo(int licz)

{


	int reszt = licz % 2; // <----- !


	if(licz > 1)

	{

		dwojkowo(licz / 2);

	}


	static int i = 4;

	if(i)

	{	

		cout << reszt;

		i--;

	}

	else

	{

		cout << " ";

		i = 4;

	}

}

[/code]




Moim zadaniem była taka modyfikacja, aby bity były grupowane po 4. 

Pierwsze dotyczy tego, że: na moment przed kompilacją myślałem, że program nie zadziała. Jednak tak się nie stało, i nie rozumiem dlaczego. Przecież w tym miejscu co zaznaczyłem wykrzyknikiem w komentarzu jest obliczana reszta. Jeżeli przykładowo liczba na zamianę będzie wynosiła [b]14[/b] to zostanie tam wpisane:



[b]0111[/b]



Potem wypisze się na odwrót związku z tym, że jest to funkcja rekurencyjna:



[b]1110[/b]



To rozumiem. Ale tutaj:

[code]static int i = 4; if(i) { cout << reszt; i--; }

W pierwszym "wyskoku" powinno przecież wyświetlić cztery aż 1 i potem przejść dopiero do kolejnego "wyskoku"...

Tzn. za pierwszym "wyskokiem" powinno być takie coś:

:arrow: przy if jest 4, więc wyświetla 1, potem jest dekrementacja,

:arrow: przy if jest 3, więc wyświetla 1, potem jest dekrementacja,

:arrow: przy if jest 2, więc wyświetla 1, potem jest dekrementacja,

:arrow: przy if jest 1, więc wyświetla 1, potem jest dekrementacja,

:arrow: przy if jest 0, więc powinno przejść do else.

Tymczasem to się zachowuje, tak, że przebiega warunek tylko 1 raz. Niezależnie od tego, że nawet wciąż jest tam true...


(Kalin 93) #2
if(i)

   {   

      cout << reszt;

      i--;

}

Musisz to wrzucić w pętle :slight_smile: