Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamiana systemów liczbowych

Ostatnio zmodyfikowano 2017-05-07 21:02
Autor Wiadomość
tymet
Temat założony przez niniejszego użytkownika
Zamiana systemów liczbowych
» 2017-05-07 15:07:47
Napisałem taki program zamieniający system dziesiętny na dwójkowy:
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    cout << "Zamiana systemu dziesietnego na dwojkowy" << endl;
    cin.get();
    int liczba, liczba2, y, a, b, mi, x, w, w2;

    b=1;
    while (b==1)
    {
    cout<<"Podaj liczbe w systemie dziesietnym"<< endl;
    cin>>liczba;
    liczba2=liczba;
    y=0;


    do
    {
    x=pow(2,y);
    mi=liczba-x;
    if (mi>=x)
    {
        y++;
        a=0;
    }


    else
    {
        a=1;

    }
    }while(a==0);

    w=0;
    while (!(y==-1))
    {
    x=pow(2,y);
    if (liczba>=x)
    {
           liczba=liczba-x;
            w2=1;
    }
    else
    {
        w2=0;
    }
    y--;
    w=10*w+w2;

    }

    cout<<"Liczba "<<liczba2<<" w systemie dwojkowym ma zapis "<<w<< endl;
    cin.get();
    cout<<"Chcesz kontynuowac - wybierz 1, chcesz zakonczyc - wybierz 0"<<endl;
    cin>>b;
    }


    return 0;
}
Wiem, że jest topornie wykonany, ale dopiero się uczę. Program działa poprawnie dla liczb mniejszych niż 1024. Dla 1024 i większych wyrzuca dziwne liczby. Gdzie popełniłem błąd?
P-160796
mateczek
» 2017-05-07 16:34:35
dlaczego tak skomplikowanie?? Algorytm ciężki do analizy. Nazwy zmiennych liczba2, y, a, b, mi, x, w, w2; nic nie mówią o ich przeznaczenu. kod wstawiaj w znaczniki
[cpp]tutaj kod c++[/cpp]
 

Algorytm generujący reprezentację dwójkową liczby "int" to sprawdzanie reszty z dzielenia przez 2 i wstawianie tejże reszty na początek stringa. (Jak za 2 wstawisz 8 to otrzymasz zapis ósemkowy)
 
C/C++
#include <iostream>
using namespace std;
int main() {
    int liczbaDzies;
    cin >> liczbaDzies;
    string liczbaBin;
    while( liczbaDzies ) {
        liczbaBin.insert( liczbaBin.begin(), liczbaDzies % 2 + '0' );
        liczbaDzies /= 2;
    }
    cout << liczbaBin << endl;
}

Dla systemu dwójkowego możesz zamiast sprawdzać resztę testować ostatni bit np instrukcją
liczbaDzies&1
 a zamiast dzielić przez 2 przesuwać w prawo instrukcją
liczbaDzies>>=1

C/C++
#include <iostream>
using namespace std;
int main() {
    int liczbaDzies;
    cin >> liczbaDzies;
    string liczbaBin;
    while( liczbaDzies ) {
        liczbaBin.insert( liczbaBin.begin(),( liczbaDzies & 1 ) + '0' );
        liczbaDzies >>= 1;
    }
   
    cout << liczbaBin << endl;
}



Problem z twoim algorytmem jest taki, że nie generujesz stringa dla liczby zapisanej w pamięci, Ale zamieniasz liczbę na inną np liczbę "9" słownie dziewięć przekształcasz w liczbę "1001" słownie: "tysiąc jeden"  i tutaj ograniczeni typu int który pmieści maksymalnie 2147483647  !!!

C/C++
long long liczba, liczba2, y, a, b, mi, x, w, w2;
// ta zmiana wydłóży Ci zakres ale moim zdaniem generowanie innej liczby kłóci się z ideą wyświetlania liczby w systemie dwójkowym. Bo liczba "9 dec" powinna się równać "1001 bin" te liczby w pamięci powinny wyglądać tak samo !!!
P-160804
tymet
Temat założony przez niniejszego użytkownika
» 2017-05-07 21:02:53
Wielkie dzięki za pomoc
P-160823
« 1 »
  Strona 1 z 1