Является ли текст правильной записью римскими цифрами целого числа от 1 до 999 - Turbo Pascal
Формулировка задачи:
Дан текст из заглавных латинских букв, за которым следует пробел. Определить, является ли этот текст правильной записью римскими цифрами целого числа от 1 до 999, и, если является, напечатать это число арабскими цифрами (в десятичной системе).
Данная задача уже запрашивалась на этом сайте, однако это было на другом языке программирования. Любители ТурбоПаскаля, помогите, пожалуйста)Решение задачи: «Является ли текст правильной записью римскими цифрами целого числа от 1 до 999»
textual
Листинг программы
function RomanToInteger(R : String) : Integer; const sRoman = 'IVXLCDM'; iDigits : array [1..7] of Integer = (1, 5, 10, 50, 100, 500, 1000); var Ri, i, iPred : Byte; Res : Integer; begin Res := 0; Ri := Length(R); iPred := 0; while Ri > 0 do begin i := Pos(R[Ri], sRoman); if i < iPred then Dec(Res, iDigits[i]) else Inc(Res, iDigits[i]); iPred := i; Ri -= 1; end; RomanToInteger := Res; end; function IntegerToRoman(N : Integer) : String; type tDigit = record R : String[10]; S : Integer; end; const Digits : array [1..28] of tDigit = ((R: 'I'; S: 1), (R: 'II'; S: 2), (R: 'III'; S: 3), (R: 'IV'; S: 4), (R: 'V'; S: 5), (R: 'VI'; S: 6), (R: 'VII'; S: 7), (R: 'VIII'; S: 8), (R: 'IX'; S: 9), (R: 'X'; S: 10), (R: 'XX'; S: 20), (R: 'XXX'; S: 30), (R: 'XL'; S: 40), (R: 'L'; S: 50), (R: 'LX'; S: 60), (R: 'LXX'; S: 70), (R: 'LXXX'; S: 80), (R: 'XC'; S: 90), (R: 'C'; S: 100), (R: 'CC'; S: 200), (R: 'CCC'; S: 300), (R: 'CD'; S: 400), (R: 'D'; S: 500), (R: 'DC'; S: 600), (R: 'DCC'; S: 700), (R: 'DCCC'; S: 800), (R: 'CM'; S: 900), (R: 'M'; S: 1000)); var i : Integer; Res : String; begin Res := ''; i := 28; while N > 0 do begin if N >= Digits[i].S then begin Dec(N, Digits[i].S); Res := Res + Digits[i].R; end else i -= 1; end; IntegerToRoman := Res; end; var S : String; begin S := 'IXI'; WriteLn(S); WriteLn(RomanToInteger(S)); WriteLn(IntegerToRoman(RomanToInteger(S))); if S <> IntegerToRoman(RomanToInteger(S)) then Write('не '); WriteLn('правильно'); end.
Объяснение кода листинга программы
- В функции RomanToInteger используется строка
IVXLCDM
, которая представляет собой набор римских цифр. - Переменная Ri содержит длину входной строки R.
- Переменная iPred устанавливается равной 0 перед первым проходом цикла, а затем увеличивается на 1 на каждом следующем проходе, пока Ri не станет равным 0.
- На каждой итерации цикла значение i определяет позицию символа в строке
IVXLCDM
, который соответствует числу, которое нужно преобразовать. - Если значение i меньше iPred, то это означает, что текущий символ был уже учтен на предыдущем проходе, поэтому мы вычитаем его значение из результата (Res).
- Если значение i больше или равно iPred, то это означает, что текущий символ еще не был учтен, поэтому мы увеличиваем результат (Res) на соответствующее значение из массива iDigits.
- После каждой итерации цикла iPred обновляется, чтобы отразить текущую позицию символа.
- В конце функция возвращает результат (Res).
- В функции IntegerToRoman используется массив Digits, который содержит наборы римских цифр для каждого числа от 1 до 28.
- Переменная i устанавливается равной 28, и цикл while выполняется до тех пор, пока N не станет равным 0.
- Если N больше или равно значению Digits[i].S, то это означает, что число можно представить с помощью Digits[i].R.
- Значение N уменьшается на Digits[i].S, и к результату (Res) добавляется Digits[i].R.
- Если N меньше Digits[i].S, то i уменьшается на 1, чтобы перейти к следующему набору римских цифр.
- В конце функция возвращает результат (Res).
- В основной программе строка
IXI
передается в функцию RomanToInteger, которая возвращает 99. - Затем эта цифра преобразуется обратно в строку с помощью функции IntegerToRoman, которая возвращает
XC
. - Если строки совпадают, то выводится сообщение
правильно
, иначе выводится сообщениене правильно
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д