Является ли текст правильной записью римскими цифрами целого числа от 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.

Объяснение кода листинга программы

  1. В функции RomanToInteger используется строка IVXLCDM, которая представляет собой набор римских цифр.
  2. Переменная Ri содержит длину входной строки R.
  3. Переменная iPred устанавливается равной 0 перед первым проходом цикла, а затем увеличивается на 1 на каждом следующем проходе, пока Ri не станет равным 0.
  4. На каждой итерации цикла значение i определяет позицию символа в строке IVXLCDM, который соответствует числу, которое нужно преобразовать.
  5. Если значение i меньше iPred, то это означает, что текущий символ был уже учтен на предыдущем проходе, поэтому мы вычитаем его значение из результата (Res).
  6. Если значение i больше или равно iPred, то это означает, что текущий символ еще не был учтен, поэтому мы увеличиваем результат (Res) на соответствующее значение из массива iDigits.
  7. После каждой итерации цикла iPred обновляется, чтобы отразить текущую позицию символа.
  8. В конце функция возвращает результат (Res).
  9. В функции IntegerToRoman используется массив Digits, который содержит наборы римских цифр для каждого числа от 1 до 28.
  10. Переменная i устанавливается равной 28, и цикл while выполняется до тех пор, пока N не станет равным 0.
  11. Если N больше или равно значению Digits[i].S, то это означает, что число можно представить с помощью Digits[i].R.
  12. Значение N уменьшается на Digits[i].S, и к результату (Res) добавляется Digits[i].R.
  13. Если N меньше Digits[i].S, то i уменьшается на 1, чтобы перейти к следующему набору римских цифр.
  14. В конце функция возвращает результат (Res).
  15. В основной программе строка IXI передается в функцию RomanToInteger, которая возвращает 99.
  16. Затем эта цифра преобразуется обратно в строку с помощью функции IntegerToRoman, которая возвращает XC.
  17. Если строки совпадают, то выводится сообщение правильно, иначе выводится сообщение не правильно.

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы