[C++] - Zamiana z systemu dziesiątkowego na dwójkowy

iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] - Zamiana z systemu dziesiątkowego na dwójkowy

Post autor: iglomosh »

Witam!
Próbuję napisać program, który zamieni liczbę podaną na wejściu na liczbę dwójkową. Kod wydaje mi się realizować dobry tok myślenia, jednak wynik jest niepoprawny. Z programowaniem w C++ mam do czynienia od niedawna, wcześniej zajmowałem się teorią, czyli algorytmami i ich realizacją w Turbo Pascalu, proszę więc o wyrozumiałość.

Kod źródłowy programu:

Kod: Zaznacz cały

#include<iostream>
#include<cstdio>
using namespace std;

int main()
{
    int n=0;
    int liczba, wynik;
    int l, bin=0, x, r;
    cout << "Wpisz liczbe " << endl;
    cin >> liczba;
    x=1;
        
    for (; liczba>0; n++)
    {
        r=liczba%2; // 19mod2=1 | 9mod2=1 | 4mod2=0 | 2mod2=0 | 1mod2=1
        liczba=liczba-r; // 19-1=18 | 9-1=8 | 4-0=4 | 2-0=2 | 1-1=0
        wynik=liczba/2; // 18/2=9 | 8/2=4 | 4/2=2 | 2/2=1 | 0
        liczba=wynik; // liczba=9 | liczba=4 | liczba=2 | liczba=1 | liczba=0
        l=n; // 0 | 1 | 2 | 3 | 4
            for (; l>0; l--)
            {
                x=x*10; // 1 | 10 | 100 | 1000 | 10000
            }    
        bin=bin+r*x; // bin=1+10+0+0+10000=10011
    } 
    cout << "W zapisie binarnym ma ona wartosc " << bin;
    cin.ignore();
    getchar();
    return(0);
}    
W komentarzach przeprowadziłem test algorytmu dla liczby 19, każdy przebieg oddzielony jest |. Jak widać na podstawie moich obliczeń program powinien dać poprawne rozwiązanie, jednak tak nie jest. Zatem gdzie robię błąd, co jest nie tak w tym programie? Z góry dziękuję za odpowiedź.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C++] - Zamiana z systemu dziesiątkowego na dwójkowy

Post autor: Afish »

Na oko przy każdym obrocie pętli powinieneś ustawić x na 1. Poza tym zauważ, że 19 / 2 = 9 jeżeli operujemy na liczbach całkowitych.
iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] - Zamiana z systemu dziesiątkowego na dwójkowy

Post autor: iglomosh »

Afish wielkie dzięki za pomoc, przez taką głupotę się program posypał . Problem rozwiązany.
Xitami

[C++] - Zamiana z systemu dziesiątkowego na dwójkowy

Post autor: Xitami »

chodziło o coś takiego?

Kod: Zaznacz cały

int main() {
	int liczba,bin,x;
	cin>>liczba;
	bin=0; x=1; 
	while(liczba>0){
		bin += (liczba % 2)*x;
		x *= 10;
		liczba /= 2;
	}
	cout << bin;
}
iglomosh
Użytkownik
Użytkownik
Posty: 75
Rejestracja: 6 maja 2010, o 18:05
Płeć: Mężczyzna
Podziękował: 16 razy
Pomógł: 6 razy

[C++] - Zamiana z systemu dziesiątkowego na dwójkowy

Post autor: iglomosh »

Xitami pisze:chodziło o coś takiego?

Kod: Zaznacz cały

int main() {
	int liczba,bin,x;
	cin>>liczba;
	bin=0; x=1; 
	while(liczba>0){
		bin += (liczba % 2)*x;
		x *= 10;
		liczba /= 2;
	}
	cout << bin;
}
Jak pisałem wcześniej, problem został rozwiązany - błąd wyniku spowodowany był tym, że x nie było zerowane co kolejny obieg pętli, więc w 2 obiegu miał prawidłowo 10, w 3 natomiast już 1000, a nie 100. Twój kod również zwraca poprawny wynik, jest krótki i zwięzły, jednak nie znam wszystkich wykorzystanych w nim operatorów - jak wspominałem, od niedawna uczę się programować w C++. Dzięki za pomoc
Xitami

[C++] - Zamiana z systemu dziesiątkowego na dwójkowy

Post autor: Xitami »

bin += (liczba % 2)*x; czyli bin = bin + (liczba % 2) * x;
x *= 10; czyli x = x * 10;
liczba /= 2; czyli liczba = liczba / 2;
ODPOWIEDZ