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

2018-12-04 16:09
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.

edytowany 2x, ostatnio: bogdans, 2018-12-04 16:29

Pozostało 580 znaków

2018-12-04 16:22
2

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

2018-12-04 16:28
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ć.

Pozostało 580 znaków

2018-12-04 16:46
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2018-12-04 18:11
0

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

Pozostało 580 znaków

2018-12-04 18:56

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;
}

edytowany 2x, ostatnio: lion137, 2018-12-04 18:58
jak ja widzę pow(2, k) to mi się płakać chce. - MarekR22 2018-12-05 11:02
Niby tak, ale jak się zastanowić, to wynik zawsze (dla rozsądnych wartości - w każdym razie dużo większych niż w typach stałoprzecinkowych) będzie dokładny. - kq 2018-12-05 11:19
wynik będzie prawidłowy, ale każde użycie liczb zmiennoprzecinkowych w miejscu, w którym jest to zbędne to jest fail. Nie sprawdzałem, ale kompilator raczej nie potrafi zoptymalizować takich kwiatków. - MarekR22 2018-12-05 11:24
To jego kod:) - lion137 2018-12-05 12:46
Tu racja, kompilatory to poniekąd optymalizują (szczególnie z -ffast-math), ale nie jest to przesunięcie bitowe w lewo, którego się spodziewałem. No i pow zwraca double'a, co też jest rzeczywiście problematyczne. - kq 2018-12-05 12:58

Pozostało 580 znaków

2018-12-05 11:16
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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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