Перевод с десятичной в восьмеричную систему счисления - C (СИ)
Формулировка задачи:
Написал такую вот программу:
Все работает, число переводится.
Но преподавателю не понравилось, слишком просто.
Каким еще способом можно написать данную программу?
#include <stdio.h>
#include <stdafx.h>
void main(void)
{
int n;
scanf("%d", &n);
printf("%o", n);
}Решение задачи: «Перевод с десятичной в восьмеричную систему счисления»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#define MAX_DECIMAL_NUMBER_LENGTH 9
#define MAX_OCTAL_NUMBER_LENGTH 12
int input_decimal_number()
{
static char buf[MAX_DECIMAL_NUMBER_LENGTH + 1];
fflush(stdin);
fgets(buf, sizeof(buf), stdin);
return strtol(buf, NULL, 10);
}
char* number_to_octal_digits(int number)
{
static char octal_digits[MAX_OCTAL_NUMBER_LENGTH + 1];
char* pos = octal_digits + MAX_OCTAL_NUMBER_LENGTH - 1;
for( ; pos >= octal_digits; --pos ) {
*pos = (number % 8) + '0';
number /= 8;
if( number <= 0 ) break;
}
octal_digits[MAX_OCTAL_NUMBER_LENGTH] = '\0';
return pos;
}
int main(void)
{
int number;
do {
number = input_decimal_number();
puts(number_to_octal_digits(number));
} while( number != 0 );
return 0;
}
Объяснение кода листинга программы
- Объявлены две функции:
input_decimal_number()иnumber_to_octal_digits(). - Функция
input_decimal_number()считывает десятичное число с помощьюfgets(), а затем используетstrtol()для перевода строки в целое число. - Функция
number_to_octal_digits()переводит десятичное число в восьмеричное, используя циклforдля прохода по всем цифрам числа. - Каждая цифра числа вычисляется как остаток от деления на 8, преобразуется в символ с помощью операции
+ '0'и записывается в буферoctal_digits. - Число делится на 8, чтобы получить следующую цифру.
- Если результат деления равен 0, то цикл прерывается.
- В функции
main()используется циклdo-whileдля считывания и вывода десятичных чисел до тех пор, пока не будет введено число, равное 0. - Буфер
octal_digitsвыделяется динамически в функцииnumber_to_octal_digits(), и его размер устанавливается равнымMAX_OCTAL_NUMBER_LENGTH + 1.