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

Gotowa funkcja konwersji między systemami liczbowymi [C++]

Object Storage Arubacloud
0 głosów
427 wizyt
pytanie zadane 5 kwietnia 2020 w C i C++ przez Dorian Bajorek 1 Początkujący (270 p.)

Witam, czy jest jakaś gotowa funkcja która konwertuje liczbę np z systemu czwórkowego na dziesiętny. Potrzebuję czegoś takiego, żeby nie tracić czasu na maturze jeśli coś takiego byłoby potrzebne. Spotkałem się jedynie z czymś takim:
 

int y=0b101
cout<<y;

Wynikiem tego jest 5. Tylko, że takie coś znam tylko na binarne liczby. Z góry dziękuję za pomoc 

2 odpowiedzi

0 głosów
odpowiedź 5 kwietnia 2020 przez tangarr Mędrzec (154,860 p.)

Napisanie własnych funkcji wczytujących / wypisujących liczby w różnych systemach liczbowych nie jest takie trudne.
Przygotowałem uniwersalny kod pracujący na systemach liczbowych o podstawie od 2 do 36 (na więcej zabrakło mi liter w alfabecie).
Przeanalizuj ten kod.

char koduj_cyfre(unsigned int cyfra) {
    if (cyfra < 10)
        return '0'+cyfra;
    return 'a'+cyfra-10;
}

std::string koduj_liczbe(unsigned int liczba, unsigned int podstawa=10) {
    if (podstawa < 2 || podstawa > 36)
        throw std::invalid_argument("podstawa");
    if (liczba == 0)
        return "0";
    std::string wynik;
    while (liczba > 0) {
        int reszta = liczba % podstawa;
        liczba /= podstawa;
        wynik.insert(0, 1, koduj_cyfre(reszta));
    }
    return wynik;
}

unsigned int dekoduj_cyfre(char znak) {
    if (znak >= '0' && znak <= '9')
        return znak-'0';
    if (znak >= 'a' && znak <= 'z')
        return 10+znak-'a';
    if (znak >= 'A' && znak <= 'Z')
        return 10+znak-'A';
    throw std::invalid_argument("znak");
}

unsigned int dekoduj_liczbe(const std::string &liczba, unsigned int podstawa=10) {
    if (podstawa < 2 || podstawa > 36)
        throw std::invalid_argument("podstawa");
    if (liczba.empty())
        throw std::invalid_argument("liczba");
    unsigned int wynik = 0;
    for (const auto &znak : liczba) {
        wynik *= podstawa;
        auto cyfra = dekoduj_cyfre(znak);
        if (cyfra >= podstawa)
            throw std::invalid_argument("znak");
        wynik += cyfra;
    }
    return wynik;
}

 

komentarz 5 kwietnia 2020 przez TOWaD Mądrala (5,700 p.)

wow!!!

a ja chciałem wyskoczyć z czymś takim

#include <iostream>
#include <algorithm>
#include <sstream>

using namespace std;

int main() {
    int i=156,base=4, k=0;
    string sb;
    stringstream ss;

    do  {
        int j=i%base;
        ss<<j;
    }
    while (i/=base);
    ss>>sb;
cout<<"czworkowo wspak="<<sb<<endl;

    for (int i=0; i<sb.size(); i++) {

        k+=(pow(base,i)*(sb[i]-'0'));
      //  cout<<k<<endl;
    }
   cout<<"dziesiatkowo ="<<k<<endl;
    reverse(sb.begin(),sb.end());

cout<<"czworkowo ="<<sb<<endl;

    return 0;
}

 

0 głosów
odpowiedź 5 kwietnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)

Jeżeli możesz korzystać z C++17, to tu masz rozwiązanie. W mainie przeprowadziłem konwersję ze znanego kawału :) Spróbuj zmienić input_base, input_as_string oraz output_base ;)

Uruchom poniższy kod na godbolt.org

#include <array>
#include <charconv>
#include <iostream>
#include <string>

std::string itos(int value, int base = 10)
{
    std::array<char, 128> output_as_characters;

    auto result = std::to_chars(
        std::begin(output_as_characters),
        std::end(output_as_characters),
        value,
        base
    );

    return std::string(
        std::begin(output_as_characters),
        result.ptr - std::begin(output_as_characters)
    );
}

int main()
{
    std::cout << "Why do programmers always mix up Halloween and Christmas?" << "\n";

    int input_base = 8; // octal
    std::string input_as_string = "31";

    int number_as_int = std::stoi(input_as_string, nullptr, input_base);

    int output_base = 10; // decimal
    std::string output_as_string = itos(number_as_int, output_base);

    std::cout << "Because Oct " << input_as_string << " = Dec " << output_as_string << "." << "\n";
    std::cout << input_as_string << "[" << input_base << "] = " << output_as_string << "[" << output_base << "]" << "\n";
}

 

Podobne pytania

0 głosów
0 odpowiedzi 485 wizyt
+1 głos
1 odpowiedź 122 wizyt
pytanie zadane 30 marca 2020 w Systemy operacyjne, programy przez Michalecekxd Użytkownik (830 p.)
0 głosów
2 odpowiedzi 731 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Atman Użytkownik (810 p.)

92,575 zapytań

141,425 odpowiedzi

319,650 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!

...