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

Konwertowanie liczb

Object Storage Arubacloud
0 głosów
236 wizyt
pytanie zadane 31 października 2018 w C i C++ przez BinaryMan Stary wyjadacz (12,620 p.)

Witam ! 
Zadanie polega na tym, że dopóki nie wpiszę -1, program ma wyświetlać liczbę. Jeśli wpiszę liczbę dziesiętną ma wyświetlić szesnastkową i odwrotnie. 

Przykład: 
Wejście:
4
7
44
0x80685
-1


Wyjście
0x4
0x7
0x2C
525957

Oto mój kod:

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

string liczba;
string przerwij = "-1";

void change_system_number(string liczba);

int main()
{
    cin >> liczba;
    while (liczba != przerwij)
    {
        change_system_number(liczba);
        liczba = "";
        cin >> liczba;
    }
    return 0;
}

void change_system_number(string liczba)
{

    if (liczba[1] == 'x') // hex to dec
    {

        int l_hex = stoi(liczba, 0, 16);
        cout << l_hex << endl;
        liczba = "";
        l_hex = 0;
    }
    else //dec to hex
    {
        int l_hex = atoi(liczba.c_str());
        cout << hex << "0x" << l_hex << endl;
        liczba = "";
        l_hex = 0;
    }
    liczba = "";
}

Problem: 
Jeśli zamienię pierwszy raz liczbę 16 na 10 to działa dobrze, później wpisuję serię liczb dziesiętnych i też jest spoko. Problem jest wtedy, gdy chcę zamienić liczbę 16 na 10 raz jeszcze. Wyświetla mi się wtedy sama końcówka, po 0x...

2 odpowiedzi

+2 głosów
odpowiedź 31 października 2018 przez niezalogowany
wybrane 31 października 2018 przez BinaryMan
 
Najlepsza

Jeżeli chcesz wypisywać liczby raz w systemie dziesiątkowym, a raz szesnastkowym musisz oprócz std::hex używać tez std::dec:

int l_hex = stoi(liczba, 0, 16);
cout << dec << l_hex << endl;
1
komentarz 31 października 2018 przez BinaryMan Stary wyjadacz (12,620 p.)
Dzięki bardzo, działa !
komentarz 31 października 2018 przez niezalogowany
Mam jeszcze kilka uwag :) Możesz usunąć te wszystkie przypisania pustych łańcuchów i zer, bo są zbędne. Zmienne globalne wrzuć do main. Zamień atoi i c_str na std::stoi dla else.
komentarz 31 października 2018 przez BinaryMan Stary wyjadacz (12,620 p.)
Okay dzięki
0 głosów
odpowiedź 31 października 2018 przez criss Mędrzec (172,590 p.)

"0x" to umowny symbol stawiany przed liczbą który ma oznaczać, że jest zapisana w systemie szesnastkowym (mogłoby to nie być oczywiste gdyby nie było w niej żadnej cyfry większej od 9), ale w żaden sposób "0x" nie jest integralną częścią systemu szesnastkowego. Nawet zakładając tylko funkcje informacyjną tego "0x", to funkcja stoi() i tak tego nie potrzebuje bo system jest podawany z góry w 3 argumencie. Zatem wystarczy, że nie będziesz kazał przekonwertować na liczbe łącznie z "0x". Możesz użyć substr: stoi(liczba.substr(2), nullptr, 16);

komentarz 31 października 2018 przez BinaryMan Stary wyjadacz (12,620 p.)
Tylko, że ta część programu działa dobrze. To z górną częścią if-a jest problem
komentarz 31 października 2018 przez criss Mędrzec (172,590 p.)
Oh, wybacz. Więc widocznie stoi "0x" nie przeszkadza :D

Pozbądź się zmiennych globalnych. Tzn napisz to bez zmiennych globalnych. Założe się, że dziwnym trafem zacznie działać albo przynajmniej szybciej znajdziesz błąd
komentarz 31 października 2018 przez BinaryMan Stary wyjadacz (12,620 p.)
Dalej to samo :( po uruchomieniu i wpisaniu np
i: 123
o: 0x7b
i:0x7b
o:7b

i- input o- output

Podobne pytania

0 głosów
1 odpowiedź 768 wizyt
pytanie zadane 30 grudnia 2019 w C i C++ przez amtrax Dyskutant (9,630 p.)
0 głosów
1 odpowiedź 250 wizyt
pytanie zadane 11 stycznia 2018 w C i C++ przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 2,892 wizyt
pytanie zadane 27 stycznia 2017 w C i C++ przez Pshemeg Nowicjusz (120 p.)

92,555 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,941 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!

...