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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2011, 10:21   #1
phreaker228
Пользователь
 
Регистрация: 31.05.2011
Сообщений: 18
По умолчанию Римские цифры!

Уважаемые программисты,помогите..
Как в этой функции перевода римских чисел в 10-ую систему счисления сделать,чтобы цифры стоящие позади старшей цифры отнимались от неё?
Например римское число: IIIIV = 1 ?

Код:
function RomanToDec(const Value: string): integer;
var
  i, lastValue, curValue: integer;
begin
  Result := 0;
  lastValue := 0;
  for i := Length(Value) downto 1 do
  begin
   case UpCase(Value[i]) of
   'C':
   curValue := 100;
   'D':
   curValue := 500;
   'I':
   curValue := 1;
   'L':
   curValue := 50;
   'M':
   curValue := 1000;
   'V':
   curValue := 5;
   'X':
   curValue := 10;
   else
   raise Exception.CreateFmt('Invalid character: %s', [Value[i]]);
   end;
   if curValue < lastValue then
   Dec(Result, curValue)
   else
   Inc(Result, curValue);
   lastValue := curValue;
  end;
end;
phreaker228 вне форума Ответить с цитированием
Старый 11.06.2011, 13:44   #2
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

IIIIV = 1 ? как сейчас помню на олимпиаде (лет 15 назад) мне такая задача попалась. решил, если очень критично завтра сутра напишу, если нужно будет стучи в аську.

проверь функцию

Код:
function grm(Value: Char): integer;
begin
result:=0;
Value:=UpCase(Value);
   if Value='C' then result:= 100  else
   if Value='D' then result:= 500  else
   if Value='I' then result:= 1  else
   if Value='L' then result:= 50 else
   if Value='M' then result:= 1000 else
   if Value='V' then result:= 5    else
   if Value='X' then result:= 10;
end;

Function GetIntegerFromRomatText(s:string):integer;
  var summa,r,x:integer;
  EL:BOOLEAN;
begin
summa:=0;
x:=length(s);
EL:=FALSE;
while x>0 do begin

 if grm(s[x])<grm(s[x+1]) then BEGIN
 summa:=summa-grm(s[x]);
 EL:=FALSE;
 END
 else
 if grm(s[x])>grm(s[x+1]) then BEGIN
 summa:=summa+grm(s[x]);
 EL:=TRUE;

 END
 ELSE
 IF EL THEN
 summa:=summa+grm(s[x]) ELSE summa:=summa+grm(s[x]);

 x:=x-1;



end;
result:=summa;
end;
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype

Последний раз редактировалось denisbrain; 11.06.2011 в 18:05.
denisbrain вне форума Ответить с цитированием
Старый 11.06.2011, 23:55   #3
phreaker228
Пользователь
 
Регистрация: 31.05.2011
Сообщений: 18
По умолчанию

Всё уже,разобрался кое как додумался))
А всего то надо было в первом условие дописать Cvalue:=lastValue;
Спасибо большое!
phreaker228 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Римские цифры NewMen Паскаль, Turbo Pascal, PascalABC.NET 5 14.06.2012 17:04
Римские числа в любую систему счисления phreaker228 Помощь студентам 2 07.06.2011 13:59
Контроль ввода - римские цифры Kortes Visual C++ 23 24.01.2011 15:46
Сортирует цифры по строкам, а надо чтобы сортировала цифры , записанные через пробелы Алексей_xXx Помощь студентам 14 06.05.2009 17:42
Римские цифры Sergeevich Помощь студентам 2 26.05.2008 18:21