Нужен код программы для перевода чисел с десятичной системы счисления в римские числа - C (СИ)
Формулировка задачи:
нужен код простой программы с проверками на ANSI C, которая переводит числа из десятичной системы счисления в римские числа.
Решение задачи: «Нужен код программы для перевода чисел с десятичной системы счисления в римские числа»
textual
Листинг программы
#include <stdio.h>
char res[20] = {'\0'};
void made_rom(int count, char litera);
char * end_str(void);
int main(void) {
int div[8] = {1,1,5,10,50,100,500,1000};
char rom[8] = {' ','I','V','X','L','C','D','M'};
int ab, x, y, i;
ab = 2949; // Переводимое число в арабском виде.
//в данном случае, должно быть меньше 3999, т.к. asci буков не хватает
for(i=7; i>0; i--)
{
x = ab/div[i];
y = ab % div[i];
if(x)
{
if(i==5 && x==4) // for 400
{
made_rom(1,'C');
made_rom(1,'D');
ab = y;
continue;
}
else if(i==3 && x==4) // for 40
{
made_rom(1,'X');
made_rom(1,'L');
ab = y;
continue;
}
else if(i==1 && x==4) // for 4
{
made_rom(1,'I');
made_rom(1,'V');
break;
}
if(i==6 && y >=400) // for 900
{
made_rom(1,'C');
made_rom(1,'M');
ab = y - 400;
continue;
}
else if(i==4 && y >=40) // for 90
{
made_rom(1,'X');
made_rom(1,'C');
ab = y - 40;
continue;
}
else if(i==2 && y ==4) // for 9
{
made_rom(1,'I');
made_rom(1,'X');
break;
}
made_rom(x,rom[i]);
}
ab = y;
}
printf("%s", res);
return 0;
}
//#######################
void made_rom(int count, char litera)
{
char *ptr;
ptr = end_str();
while(count)
{
*ptr = litera;
ptr++;
count--;
}
}
//######################
char * end_str(void)
{
char *ptr_res;
ptr_res = res;
while(*ptr_res)
ptr_res++;
return ptr_res;
}
Объяснение кода листинга программы
- В программе присутствует функция
made_rom, которая принимает два аргумента: целое числоcountи символlitera. Эта функция отвечает за преобразование чисел в римскую систему счисления. - Функция
end_strвозвращает указатель на последний символ в строкеres. Она используется для добавления символов в конец строкиresв функцииmade_rom. - В функции
mainопределены две массивы:divиrom.divсодержит делители для чисел от 1 до 8, аromсодержит римские символы для этих чисел. - Переводимое число в арабском виде хранится в переменной
ab. В данном случае, это число 2949. - В цикле
forпроисходит деление числаabна делители из массиваdivи сохранение остатка в переменнойy. - Если остаток от деления больше или равен 4, то выполняется блок кода, который добавляет соответствующие римские символы в строку
res. - Если остаток от деления меньше 4, то выполняется другой блок кода, который добавляет римские символы в строку
res. - После выполнения всех блоков кода, в строку
resдобавляется символ пробела. - В конце программы, с помощью функции
printf, выводится значение переменнойres, которое представляет собой римское число для исходного числа. - Возвращаемое значение функции
mainравно 0, что означает успешное выполнение программы.