@Sazoks

Программа перевода из 10 в 2 и 8 систему счисления(С++)?

Всем привет. Мне 16, 4 месяца изучаю С++ и нарыл интересную задачку. Нужно написать программу перевода числ из 10 в 2 и 8 СС, подразумевается, что все числа положительные. Весьма тривиальная задача, как я понял. Вот что сделал я. Прошу более опытных программистов оценить код и сказать, что не так и как можно лучше. Полностью открыт к ОБЪЕКТИВНОЙ критике.
Заранее все спасибо и добра вам!
#include <iostream>
#define DEBUG
using namespace std;

void double_sys(int num)
{
	int count = 1;
	int copy_num = num;
	while (copy_num != 1)
	{
		count++;
		copy_num /= 2;
	}
	int *arr = new int[count];
	for (int i = (count - 1); i > 0; i--)
	{
		arr[i] = num % 2;
		num /= 2;
	}
	arr[0] = (int)(num);
	for (int i = 0; i < count; i++)
		cout << arr[i];
	cout << endl;
	delete[] arr;
}

void eight_sys(int num)
{
	int count = 1;
	int copy_num = num;
	while (copy_num > 7)
	{
		count++;
		copy_num /= 8;
	}
	int *arr = new int[count];
	for (int i = (count - 1); i > 0; i--)
	{
		arr[i] = num % 8;
		num /= 8;
	}
	arr[0] = (int)(num);
	for (int i = 0; i < count; i++)
		cout << arr[i];
	cout << endl;
	delete[] arr;
}

int main()
{
	setlocale(LC_ALL, "ru");

	int num;
	cout << "=====================================================\n";
	cout << "| Перевод числа из десятичной системы счисления(СС) |\n| в двоичную и восьмеричную                         |";
	cout << "\n=====================================================\n\n";

	cout << "Введите число: "; cin >> num;

	cout << "В 2-й: "; double_sys(num);
	cout << "В 8-й: "; eight_sys(num);
	system("pause");
	return 0;
}
  • Вопрос задан
  • 13086 просмотров
Решения вопроса 1
longclaps
@longclaps
подразумевается, что все числа положительные
используй типизацию, а не подразумевай

double_sys, eight_sys - почти 100% дублирование кода

int *arr = new int[count];
в этой задаче максимально необходимый размер строки можно прикинуть и использовать статическую переменную

#include <iostream>

using namespace std;

void to_any_number_system(unsigned num, unsigned radix) {
    // соблюдение условия 2 <= radix <= 16 на совести вызывающего
    const char digits[] = "0123456789abcdef";
    char buf[sizeof(num) * 8], *p = buf; // двоичное представление num влезет
    do *p++ = digits[num % radix]; while (num /= radix);
    do cout << *--p; while (p > buf);
    cout << endl;
}

int main() {
    unsigned n = 0xffffffff; // чтобы мало не казалось )
    for (unsigned r = 2; r <= 16; r++) {
        cout << (r > 9 ? "" : " ") << r << '\t';
        to_any_number_system(n, r);
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы