Błędy w obliczeniach
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Błędy w obliczeniach

AutorWiadomość
Temat założony przez niniejszego użytkownika
Błędy w obliczeniach
» 2018-05-06 18:49:41
Witam.
Chciałem zrobić pewien program zmieniający liczby z różnych systemów liczbowych na inne.
Pomysł był taki, by najpierw te liczby były zamieniane na system dziesiętny, a następnie na docelowy.
To tak w małym uproszczeniu.

No więc napisałem program, którego fragment wygląda w ten sposób:
C/C++
{
    int system1;
    int liczbacin;
    int system2;
    int liczbacout = { 0 };
    int ktory_rzad = { 0 };
    int reszta;
   
   
    cout << "Z jakiego systemu chcesz podac liczbe? Mozesz wybrac 2-10. ";
    cin >> system1;
    cout << "\nTeraz podaj liczbe z tego systemu. ";
    cin >> liczbacin;
    cout << "\nNa jaki system chcesz przekonwertowac liczbe? ";
    cin >> system2;
   
    //Konwersja na system dziesietny
    do
    {
        if( liczbacin > 10 )
        {
            reszta = { liczbacin % system1 };
            liczbacout = { liczbacout + reszta * pow( system1, ktory_rzad ) };
            liczbacin = {( liczbacin - reszta ) / 10 };
            ktory_rzad++;
        }
    }
    while( liczbacin > 10 );
   
    liczbacout = { liczbacout + liczbacin * pow( system1, ktory_rzad ) };
    cout << liczbacout;
}

Najpierw użytkownik wprowadza system1, potem liczbę z tego system, a następnie system, na który chce zamienić liczbę.
Następnie liczba przeliczana jest na liczbę dziesiętną.

W teorii (wg mnie) wszystko powinno działać, jednak wpisując:

system1 = 10
liczbacin = 123456
system2 = dowolny (jeszcze nie ma zastosowania)

, to ostatnia linijka programu wypisująca liczbę, zamiast 123456, wypisuje 123454.

Niestety po kilkukrotnej analizie programu, nie widzę żadnego błędu.
Byłbym bardzo wdzięczny, jeśli ktoś z was byłby w stanie mi pomóc.

Pozdrawiam.
P-170940
» 2018-05-06 19:48:25
Wczytana liczba jest w systemie dziesiętnym, ta konwersja nie ma sensu.
P-170941
Temat założony przez niniejszego użytkownika
.
» 2018-05-06 20:18:37
Zdaję sobie z tego sprawę, lecz chciałem po prostu przetestować czy program działa, tymczasem wynik, który otrzymałem nie był równy wprowadzonej liczbie.
Może i zamiana liczby z systemu dziesiętnego ponownie na dziesiętny nie ma sensu, jednakże program powinien wykonywać ją poprawnie.
Dlatego poprosiłem o pomoc, by dowiedzieć się co źle zrobiłem.
P-170943
» 2018-05-06 20:52:22
pow() nie nadaje się do takiego zastosowania i nie jest tu też do niczego potrzebne.
P-170945
Temat założony przez niniejszego użytkownika
» 2018-05-06 21:12:35
Dzięki, zmieniłem pow(system1, ktory_rzad) na coś takiego i teraz działa poprawnie:

C/C++
{
    int system1;
    int liczbacin;
    int system2;
    int liczbacout = { 0 };
    int ktory_rzad = { 0 };
    int reszta;
    int potega = { 1 };
   
   
    cout << "Z jakiego systemu chcesz podac liczbe? Mozesz wybrac 2-10. ";
    cin >> system1;
    cout << "\nTeraz podaj liczbe z tego systemu. ";
    cin >> liczbacin;
    cout << "\nNa jaki system chcesz przekonwertowac liczbe? ";
    cin >> system2;
   
    //Przejscie do pierwszej cyfry + Konwersja na system dziesiatkowy
    do
    {
        if( liczbacin > 10 )
        {
            reszta = { liczbacin % system1 };
            liczbacout = { liczbacout + reszta * potega };
            liczbacin = {( liczbacin - reszta ) / 10 };
            potega = potega * system1;
        }
    }
    while( liczbacin > 10 );
   
    liczbacout = { liczbacout + liczbacin * potega };
    cout << liczbacout;
}

Mam tylko pytanie, dlaczego poprzednia wersja nie działała?
P-170946
» 2018-05-06 21:42:12
To ci działa??
P-170947
Temat założony przez niniejszego użytkownika
» 2018-05-06 22:10:22
Tak, ale jest to tylko fragment, wcześniej jest jeszcze kilka niezwiązanych z tym funkcji, dlatego użyłem tu tylko tego.
P-170948
» 2018-05-07 07:58:53
Masz poprawiony kod bo trochę przekombinowałeś
C/C++
#include <iostream>
#include<string>
using namespace std;
int main() {
    int system1;
    int liczbacin;
    int liczbacout = { 0 };
    int reszta;
    int potega = { 1 };
   
   
    cout << "Z jakiego systemu chcesz podac liczbe? Mozesz wybrac 2-10. ";
    cin >> system1; //
    //jak wczytasz 1001 to jest to liczba "tysiąc jeden" w pamięci komputera. 
   
    cout << "\nTeraz podaj liczbe z tego systemu. ";
    cin >> liczbacin; //!!!!! takie wczytywanie już ci robi konwersję. To zawsze jest zamiana ciągu znaków na liczbę w systemie dziesiętnym.                                
    //Pętla trochę przekombinowana i z jednym zasadniczym błędem. stąd moje pytanie czy ci to działało.
    while( liczbacin ) {
        reszta = liczbacin % 10; // tu był błąd !!!! Cin<<liczba wczytuje liczbę w systemie dziesiętnym. Stąd chcąc uzyskać ostatnią cyfrę trzeba podzielić przez 10!!!
        liczbacout = liczbacout + reszta * potega;
        liczbacin = liczbacin / 10;
        potega = potega * system1;
    }
    cout << liczbacout;
}


Zobacz takie rozwiązanie
C/C++
#include <iostream>
#include<string>
using namespace std;

//funkcja konwertująca ciąg znaków w podanym systemie liczbowym  na liczbę int
int to_int( string & s, int system ) {
    int liczba = 0;
    for( char znak: s ) {
        int cyfra = znak - '0';
        liczba = liczba * system + cyfra;
    }
    return liczba;
}

//funkcja konwertująca liczbę na ciąg znaków odpowiadający określonemu systemowi liczboewemu
string int_to_string( int liczba, int system ) {
    string s;
    while( liczba ) { //póki jest co konwertować
        int reszta = liczba % system;
        s.insert( s.begin(), reszta + '0' ); //wstaw na początek napisu.
        liczba /= system;
    }
    return s;
}
int main() {
    string s = "1000"; //ciąg znaków w systemie dwójkowym
    int liczba = to_int( s, 2 ); //konwersja ciągu znaków na liczbę int;
    //jakieś operacje na liczbie int
    liczba = liczba * 3;
    cout << liczba << " : " << int_to_string( liczba, 8 ); //wyświetlenie liczby w systemie dziesiętnym(domyślna konwersja) i ósemkowym nasza konwersja;
}
P-170951
« 1 » 2
 Strona 1 z 2Następna strona