Перевод арабских чисел в римские - C (СИ)
Формулировка задачи:
Нужна программа в С для перевода арабских чисел в римские,желательно что-то попроще.
Решение задачи: «Перевод арабских чисел в римские»
textual
Листинг программы
function RomanToInt(const S: string): Longint;
const
RomanChars = ['C','D','I','L','M','V','X'];
RomanValues: array['C'..'X'] of Word =
(100,500,0,0,0,0,1,0,0,50,1000,0,0,0,0,0,0,0,0,5,0,10);
var
Index, Next: Char;
I: Integer;
Negative: Boolean;
begin
Result := 0;
I := 0;
Negative := (Length(S) > 0) and (S[1] = '-');
if Negative then Inc(I);
while (I < Length(S)) do begin
Inc(I);
Index := UpCase(S[I]);
if Index in RomanChars then begin
if Succ(I) <= Length(S) then Next := UpCase(S[I + 1])
else Next := #0;
if (Next in RomanChars) and (RomanValues[Index] < RomanValues[Next]) then
begin
Inc(Result, RomanValues[Next]);
Dec(Result, RomanValues[Index]);
Inc(I);
end
else Inc(Result, RomanValues[Index]);
end
else begin
Result := 0;
Exit;
end;
end;
if Negative then Result := -Result;
end;
function IntToRoman(Value: Longint): string;
Label
A500, A400, A100, A90, A50, A40, A10, A9, A5, A4, A1;
begin
Result := '';
{$IFNDEF WIN32}
if (Value > MaxInt * 2) then Exit;
{$ENDIF}
while Value >= 1000 do begin
Dec(Value, 1000); Result := Result + 'M';
end;
if Value < 900 then goto A500
else begin
Dec(Value, 900); Result := Result + 'CM';
end;
goto A90;
A400:
if Value < 400 then goto A100
else begin
Dec(Value, 400); Result := Result + 'CD';
end;
goto A90;
A500:
if Value < 500 then goto A400
else begin
Dec(Value, 500); Result := Result + 'D';
end;
A100:
while Value >= 100 do begin
Dec(Value, 100); Result := Result + 'C';
end;
A90:
if Value < 90 then goto A50
else begin
Dec(Value, 90); Result := Result + 'XC';
end;
goto A9;
A40:
if Value < 40 then goto A10
else begin
Dec(Value, 40); Result := Result + 'XL';
end;
goto A9;
A50:
if Value < 50 then goto A40
else begin
Dec(Value, 50); Result := Result + 'L';
end;
A10:
while Value >= 10 do begin
Dec(Value, 10); Result := Result + 'X';
end;
A9:
if Value < 9 then goto A5
else begin
Result := Result + 'IX';
end;
Exit;
A4:
if Value < 4 then goto A1
else begin
Result := Result + 'IV';
end;
Exit;
A5:
if Value < 5 then goto A4
else begin
Dec(Value, 5); Result := Result + 'V';
end;
goto A1;
A1:
while Value >= 1 do begin
Dec(Value); Result := Result + 'I';
end;
end;
Объяснение кода листинга программы
Код выполняет перевод чисел из римской системы счисления в арабскую и наоборот. Он также проверяет корректность ввода данных. Список элементов кода:
- Переменная S содержит строку с числом в римской системе счисления.
- Переменная RomanValues - массив, содержащий значения соответствующих римских цифр.
- Переменная I используется в качестве счётчика для обработки каждого символа входной строки.
- Переменная Negative используется для обработки отрицательных чисел.
- Функция RomanToInt выполняет перевод числа из римской системы счисления в арабскую.
- Функция IntToRoman выполняет перевод числа из арабской системы счисления в римскую.
- В каждой функции используется цикл while для обработки каждого символа входной строки.
- Каждый символ проверяется на соответствие римским цифрам.
- Если символ соответствует римской цифре, выполняется проверка следующего символа.
- Если следующий символ больше текущего, происходит обработка ошибки.
- Результат вычислений сохраняется в переменной Result.
- Если значение числа превышает максимальное для арабской системы счисления, выполняется обработка ошибки.
- Для каждой функции определён набор меток, используемых для перехода к определённым частям кода.
- В конце кода выполняется обработка отрицательных чисел.