• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przeliczanie systemów liczb w C++

Object Storage Arubacloud
0 głosów
2,310 wizyt
pytanie zadane 29 września 2017 w C i C++ przez tagi s Nowicjusz (200 p.)

Witam! Jestem początkujący w C++ i w ramach jakichś ćwiczeń postanowiłem wykonać przelicznik systemów liczbowych. Nie chcę tutaj dostać gotowych rozwiązań, tylko pomocy w rozwiązaniu pewnego problemu w moim kodzie. Podejrzewam, iż nie jest on najczystszy, ale starałem się jak mogłem.

(dodam iż funkcja "oct_to_dec(string lo)" działa jak najbardziej prawidłowo)

//Przeliczanie oktalnej na binarną przez dziesiętną
long long oct_to_bin(string lo)
{
    long long ld;             //"liczba dziesiętna"
    ld=oct_to_dec(lo);        //przeliczenie liczby oktalnej na dziesiętną
    long long lb=0;           //"liczba binarna"
    short cyfbin=0;           //"cyfra w binarnym zapisie"
    int i=0;                  //iterator do pętli poniżej

    while(ld>0)
    {
        cout << i <<"  "<< ld <<"  "<< cyfbin <<"  "<< lb <<"  "<< pow(10,i) << endl;
                              // ^wypisanie wartości zmiennych do testów^
        cyfbin=ld%2;          //wyzn. reszty z dzielenia liczby dziesiętnej przez 2
        ld=ld/2;              //podzielenie lizcby dziesiętnej przez 2
        lb+=cyfbin*pow(10,i); //"przemiana" liczby binarnej do int'a
        i++;                  //zwiększenie iteratora do potęgowania liczby 10
    }
    return lb;
}

A problem wygląda następująco, kiedy przeliczam liczbę (załóżmy 117, której wartość binarna jest równa: 1001111) wynik jest nieprawidłowy. Pierwsze powtórzenie pętli zdaje się nie wykonywać poprawnie:

Jeśli ktoś wie, w czym tkwi problem bardzo prosiłbym o pomoc ;)

Z góry dziękuje!

~tagis

1 odpowiedź

0 głosów
odpowiedź 29 września 2017 przez Bosswell Nałogowiec (36,470 p.)
wybrane 29 września 2017 przez tagi s
 
Najlepsza
Liczba w zapisie ósemkowym zapisana jest na 3 bitach 0-7

0 - 000

1 - 001

2 - 010

3 - 011

4 - 100

5 - 101

6 - 110

7 - 111

Liczbę ósemkowa przekazana do funkcji, to string. Więc wystarczy w pętli sprawdzać każdą literę (liczbę) i switchem wybierać odpowiednią liczbę binarną i łączyć ją w jeden napis.
komentarz 29 września 2017 przez tagi s Nowicjusz (200 p.)

Chodzi o coś takiego?

(operator >> już poprawiony na <<)*

    for(int i=0; i<lo.size(); i++) //pęla sprawdzająca każdą cyfre liczby okt. po kolei
    {
        switch(lo[i])              //jedna z cyfr liczby oktalnej
        {
        case '1':
            cout << "001";
        case '2':
            cout << "010";
        }
    }

Czy może da się to zapisać lepiej?

komentarz 29 września 2017 przez Bosswell Nałogowiec (36,470 p.)
for(int i=0; i<lo.length()-1; i++) 
{
    string tmp = "";

    switch(lo[i])             
    {
    case '1':
        tmp+="001"; break;
    case '2':
        tmp+="010"; break;
    }
}
 return tmp;

 

komentarz 29 września 2017 przez Bosswell Nałogowiec (36,470 p.)
W tym zapisie pozostał problem zer wiodących. W pętli wypadałoby usunąć wiodące zera.
komentarz 29 września 2017 przez tagi s Nowicjusz (200 p.)

Dziękuje za pomoc, po kilku poprawkach kod działa. Nwm czy to kwestia zwykłej pomyłki, ale twój kod nie miałby prawa działać poprawnie.

 

for(int i=0; i<lo.length()-1[1]; i++)

{

    string tmp = "";[2]

 

    switch(lo[i])            

    {

    case '1':

        tmp+="001"; break;

    case '2':

        tmp+="010"; break;

    }

}

 return tmp;

[1] - Pętla wykonywała się 1 raz za mało (choć sam osobiście nie mam pojęcia czemu tak było)

[2] - string tmp był zmienną lokalną tylko w obrębie pętli

 

Ale kod działa, jeszcze raz dziękuje za pomoc wink

komentarz 29 września 2017 przez Bosswell Nałogowiec (36,470 p.)

Masz racje, pisałem na szybko i nawet go nie sprawdziłem. Dobrze zauważyłeś i wysunąłeś wnioski. Co do [1] to mój zapis byłby poprawny gdybym dał <=, ale ze znakiem < i bez -1 jest jeszcze lepiej ;)

Podobne pytania

0 głosów
1 odpowiedź 596 wizyt
pytanie zadane 17 marca 2018 w Nasze projekty przez konrad99 Gaduła (4,090 p.)
0 głosów
0 odpowiedzi 164 wizyt
pytanie zadane 17 października 2020 w Rozwój zawodowy, nauka, praca przez Rafał Masny Obywatel (1,700 p.)
0 głosów
2 odpowiedzi 841 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...