Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2013, 18:16   #1
Alekzinder
Пользователь
 
Регистрация: 05.05.2012
Сообщений: 24
По умолчанию Проверить, правильна ли запись числа римскими цифрами.

Помогите решить
Проверить, правильна ли запись числа римскими цифрами.
Alekzinder вне форума Ответить с цитированием
Старый 20.03.2013, 20:31   #2
hon
Форумчанин
 
Регистрация: 08.06.2011
Сообщений: 693
По умолчанию

Я видел, когда не было наработок, я видел, когда не было информации, в чем проблема, но чтобы не было условия (!), я такого не видел.
hon вне форума Ответить с цитированием
Старый 20.03.2013, 20:49   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

hon, да чего уж тут непонятного?..
Автору топика нужен код программы на языке Паскаль, который по введённой строке определяет, корректная ли запись числа римскими цифрами и выдаёт сообщение правильна запись числа или нет. вот и всё...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.03.2013, 21:07   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
function IsRoman(s: String): Boolean;
const
  Romans:string =  'I IV V IX X XL L XC C CD D CM M ';
var
  i: Integer;
begin
  for i := 1 to Length(s) do
   if (pos(copy(s,1,1),Romans)=0) and (pos(copy(s,1,2),Romans)=0) then begin
    Result:=false; exit;
   end;
  Result := true;
end;
Применять как:
Код:
 if IsRoman('XVII') then write('Ога') else write('Неа');
Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.03.2013, 21:36   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

да "щас"!


XCIXCI
VXIIIIIICIXCI
IXIIIIIII
CXCIXI

Вы точно уверены, что данные записи представляют собой корректную запись числа римскими цифрами?!


я бы предложил такое решение (оно, конечно, наверняка не самое короткое и эффективное, зато рабочее!)
Код:
{Источник: "Наука и жизнь" N12 1986  cтр. 95 }
{Алгоритм: В. Птицын г.Москва }
{доработка 30.05.2010 - проверка входного римского числа на ошибочность}
type str2 = string[2];

const
   MaxVariant = 14;
const
   Rims : array[1..MaxVariant] of str2 = ('M','CM','D','CD','C','XC','L','XL','X','IX','V','IV','I',' ');
   Arab : array[1..MaxVariant] of integer = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1, 0);

var
  N, NI, I, J : integer;
  S    : string;

  function Arab2Rim(N : integer) : string;
  var S : string;
      I : integer;
  begin
    S := ''; I:=1;
    while N > 0 do begin
      while Arab[I]<=N do begin
        S := S + Rims[I];
        N := N - Arab[I]
      end;
      I:=I+1
    end;
    Arab2Rim := S
  end;

  function Rim2Arab (S:string) : integer;
  var I, N, Offset : integer;
    s0 : string;
  begin
    Rim2Arab := -1;
    I:=1; N := 0; Offset := 0; s0 := trim(S);
    while S<>'' do begin
      while Rims[I] = Copy(S, 1, Length(Rims[I]) ) do begin
        S := Copy( S, 1+Length(Rims[I]), 255);
        Offset := Offset + Length(Rims[I]);
        N := N + Arab[I]
      end;
      I:=I+1;
      if I>MaxVariant then begin
         {  WriteLn('Ошибка в исходной строке '+s0+' с позиции ',Offset:1); }
         exit
      end;
    end;
    if Arab2Rim(N)=s0 then  Rim2Arab := N;
  end;

var
  rimStr : string;
  rez : integer;
begin
  WriteLn('Перевод из арабских цифр в римские. 1999 B_SA');
  
  repeat
     WriteLn;
     Write('Введите число, римскими цифрами (пустая строка - выход): ');
     Readln(rimStr);
     if Trim(rimStr) <> '' then begin
        rez := Rim2Arab( rimStr );
        if  rez < 0 then
          WriteLn('Введённая запись НЕ является корректной записью числа римскими цифрами')
        else
          WriteLn('Это правильная запись! ( ', rez,' )');
     end;
  until Trim(rimStr) = '';
end.

Последний раз редактировалось Serge_Bliznykov; 21.03.2013 в 11:51.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.03.2013, 01:40   #6
Alekzinder
Пользователь
 
Регистрация: 05.05.2012
Сообщений: 24
По умолчанию

Большущее спасибо!) я бы даже не додумался таким способом решать
Alekzinder вне форума Ответить с цитированием
Старый 21.03.2013, 09:26   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вы точно уверены
Нет. Я просто предложил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.03.2013, 10:10   #8
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
да "щас"!


XCIXCI
VXIIIIIICIXCI
IXIIIIIII
CXCIXI

Код:
function IsRoman(s: String): Boolean;
const
  Romans:string =  'I IV V IX X XL L XC C CD D CM M ';
var
  i: Integer;
begin
  for i := 1 to Length(s) do
   if (pos(copy(s,1,1),Romans)=0) and (pos(copy(s,1,2),Romans)=0) then begin
    Result:=false; exit;
   end;
  Result := true;
end;
Любопытно, что как раз эта функция (простите за каламбур), похоже, свою функцию не выполняет.
s-andriano вне форума Ответить с цитированием
Старый 21.03.2013, 11:53   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от s-andriano
Любопытно, что как раз эта функция (простите за каламбур), похоже, свою функцию не выполняет.
АА! Точно! Это я прокосячил.
Тестировал и забыл её в коде. Она, разумеется, в данном примере не нужна (я уже убрал её из своего примера), и нигде не вызывается..

Приношу извинения за свою невнимательность.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись любого целого числа n (n<3999) арабскими цифрами перевести в запись римскими цифрами (на языке C) qazse Помощь студентам 1 24.11.2011 12:05
Калькулятор с римскими цифрами WideSide Помощь студентам 1 04.05.2011 20:31
запись числа римскими символами (Си++) kOvr1K Помощь студентам 3 18.10.2008 23:19