Тема: Функції перетворення чисел в різних системах числення

Написати програму яка буде виконувати перетворення чисел з різних систем числення ( двійкової, вісімкової, шістнадцяткової) С++.  Допоможіть будь ласка

2

Re: Функції перетворення чисел в різних системах числення

Можна, наприклад, якось так:

#include <iostream>
#include <string>
#include <cctype>

int conv_digit(char digit) {
  if (std::isalpha(digit)) {
    return std::toupper(digit) - 'A' + 10;
  } else if (std::isdigit(digit)) {
    return digit - '0';
  }

  return -1;
}

int main() {
  int base;
  std::string numstr;

  std::cout << "Введіть основу системи числення (2, 8, 16, тощо):\n";
  std::cin >> base;
  std::cout << "Введіть число у вказаній системі числення:\n";
  std::cin >> numstr;

  int abs_result = 0;
  int sign = 1;
  bool number_started = false;

  std::string::iterator it;
  for (it = numstr.begin(); it != numstr.end(); it++) {
    if (std::isspace(*it)) continue;

    if ((*it == '-') && number_started) {
      std::cout << "Мінус не на початку числа!\n";
      return -1;
    }

    if (*it == '-') {
      sign = -1;
      number_started = true;
      continue;
    }

    int digit = conv_digit(*it);
    if (digit < 0 || digit >= base) {
      std::cout << "Неправильна цифра: " << *it << "\n";
      return -1;
    }
    abs_result = abs_result * base + digit;
    number_started = true;
  }
  int result = sign * abs_result;

  std::cout << "Результат: " << result << "\n";
  return 0;
}

Я не використовую C++ професійно, тому код може бути неідеальний (хай поправлять ті, хто знає C++ краще за мене). Але він принаймні працює. :D

Якщо треба щось пояснити в цьому коді, кажіть.

3

Re: Функції перетворення чисел в різних системах числення

Ітератор використовуєте, могли просто через foreach.

for(auto& it : numstr)

і прибрати вказівники

Подякували: Dmy1

4

Re: Функції перетворення чисел в різних системах числення

vlad032 (переклад ad hoc) написав:

Ітератор використовуєте, могли просто через foreach.

for(auto& it : numstr)

і прибрати вказівники

Щиро дякую! Буду знати про foreach

#include <iostream>
#include <string>
#include <cctype>

int conv_digit(char digit) {
  if (std::isalpha(digit)) {
    return std::toupper(digit) - 'A' + 10;
  } else if (std::isdigit(digit)) {
    return digit - '0';
  }

  return -1;
}

int main() {
  int base;
  std::string numstr;

  std::cout << "Введіть основу системи числення (2, 8, 16, тощо):\n";
  std::cin >> base;
  std::cout << "Введіть число у вказаній системі числення:\n";
  std::cin >> numstr;

  int abs_result = 0;
  int sign = 1;
  bool number_started = false;

  for (auto &it : numstr) {
    if (std::isspace(it)) continue;

    if ((it == '-') && number_started) {
      std::cout << "Мінус не на початку числа!\n";
      return -1;
    }

    if (it == '-') {
      sign = -1;
      number_started = true;
      continue;
    }

    int digit = conv_digit(it);
    if (digit < 0 || digit >= base) {
      std::cout << "Неправильна цифра: " << it << "\n";
      return -1;
    }
    abs_result = abs_result * base + digit;
    number_started = true;
  }
  int result = sign * abs_result;

  std::cout << "Результат: " << result << "\n";
  return 0;
}