• 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++]

Aruba Cloud - Virtual Private Server VPS
0 głosów
576 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 (155,140 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 (6,420 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,210 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 534 wizyt
+1 głos
1 odpowiedź 183 wizyt
pytanie zadane 30 marca 2020 w Systemy operacyjne, programy przez Michalecekxd Użytkownik (830 p.)
0 głosów
2 odpowiedzi 984 wizyt
pytanie zadane 1 kwietnia 2020 w C i C++ przez Atman Użytkownik (810 p.)

93,337 zapytań

142,332 odpowiedzi

322,424 komentarzy

62,677 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...