Konwerter z systemu dziesiętnego na binarny i vice-versa. Prośba o pomoc.

0

Witam. Chciałbym prosić o pomoc lub pomysły jak napisać poprawnie kod na konwerter z 10 na 2 i na odwrót. Niżej jest tyle ile zdołałem wymyślić.

#include <iostream>
#include <conio.h>
#include <cmath>

using namespace std;

void z10na2(int x)
{
	int i=0, j, tab[15];

	while (x) //kazda x powyzej 1 daje wartosc true, wiec jesli bedzie 0, konczy petle
	{
		tab[i++] = x % 2;
		x /= 2;
	}
	for (j = i - 1; j >= 0; j--)
		cout << tab[j] << endl;
}

int z2na10(int tab[15])
{
	int x, suma = 0;
	for (x = 0; x < 16; x++)
	{
		suma += tab[x] * pow(2, x);
	}
	return suma;
}

int main()
{
	int x;
	cout << "Podaj liczbe typu integer: ";
	cin >> x;
	cout << "liczba: ";
	z10na2(x);
	z2na10(x);
	_getche();
	return 0;

}

Nie mam pojęcia jak to zrobić, żeby wynik z konwersji 10na2 był użyty do konwersji 2na10.

2

alej C i rób to za pomocą C++.
Czyli np użyj std::string zamiast char[]

0
MarekR22 napisał(a):

alej C i rób to za pomocą C++.
Czyli np użyj std::string zamiast char[]

Można by było trochę jaśniej? Bo jestem trochę niekumaty i chciałbym to zrozumieć.

1

Nie znam określenia typ integer, i po zobaczeniu komunikatu Podaj liczbe typu integer: nie wiedziałbym jakie wejścia są dopuszczalne. Czy liczby

-687
8888888888888888888888888888888888888888

są dopuszczalne? Tzn. czy nie wywalą programu i zostaną poprawnie skonwertowane.

0

Da radę jakoś zapisać wartość cout cout << tab[j] << endl;, żeby jej móc później użyć?

1

Tak się Zaplątasz, bo zwykłe tablice w C++, nie "wiedzą" o swojej długości, zwraca się je jako wskaźnik, którego potem trza by znaleźć rozmiar, i tak dalej...:). Używaj STL, dumy języka C++(działa tylko dla liczb dodatnich):

#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<int>  z10na2(int x){
    vector<int> tab;
 
    while (x){ //kazda x powyzej 1 daje wartosc true, wiec jesli bedzie 0, konczy petle
   
        tab.push_back(x % 2);
        x /= 2;
    }
	std::reverse(tab.begin(), tab.end());; // odwraca vector, void
	return tab;
}
 
int z2na10(vector<int> tab){	
	int len = tab.size();
    int x, suma = 0;
    for (int i = 0, k = len - 1; (i < len || k >= 0); i++, k--)
    {
        suma += tab[i] * pow(2, k);
    }
    return suma;
}
 
int main(){
    int x;
    
    cout << "Podaj liczbe typu integer: ";
    cin >> x;
    
    cout << endl;
    
    cout << z2na10(z10na2(x)); // jak działa to powinno drukować x
    cout << endl;
    return 0;
}
1
template<typename T>
int oldestBit(T x)
{
    int r = 0;
    std::make_unsigned_t<T> a = x;
    while (a>>=1)  ++r;
    return r;
}

template<typename T>
std::ostream& asBin(std::ostream& out, T x)
{
     for (auto mask = 1u << oldestBit(x); mask != 0; mask>>=1)
         out << ((x & mask) != 0 ? '1' : '0');
     return out;
}

https://wandbox.org/permlink/LMl7qj4Dgmkv3OBz

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