Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 5 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 29.11.2003
Откуда: Chelyabinsk
Задача заключается в том чтобы написать программу перевода из одной системы счисления в другую, конкретно из РИМСКОЙ в ДЕСЯТИЧНУЮ...
Также там нужна система проверки ошибок на ввод...

Правило перевода:
Каждая меньшая цифра записывается справа (увеличивает), а запись слева уменьшает, на количество едениц которая она обозначает.

Т.е. например требуется перевести число: MCMXLVI - 1946..
пример неправильного ввода это IC <> 99 (не равно)

Я ее решал вчера 5 часов, но так и не добился абсолютно точной работы, всегда находилось число которая переводилось неправильно... :(

Название изменено. vor

_________________
Ушел, но обещал вернутся...



Партнер
 

Member
Статус: Не в сети
Регистрация: 06.11.2003
таблицу символов для римской приведи можно будет поковыряться, задачка интересна...


 

Member
Статус: Не в сети
Регистрация: 30.01.2003
Откуда: Москва
DenisMak I - 1, V - 5, X - 10, L - 50, C - 100, D - 500, M - 1000. Видимо, если меньшее число стоит слева, оно должно быть не далее двух позиций от большего по таблице. Т.е., XC - допустимо, но VC - уже нет (ну и сокращения ;) )

Добавлено спустя 1 минуту, 18 секунд:
Хотя нет, тут посложнее...LC - неверное сочетание...


 

Member
Статус: Не в сети
Регистрация: 17.10.2003
Откуда: Киев
только что написал программку:
Код:
const rim:array [1..7]
of char=  ('I', 'V', 'X', 'L', 'C', 'D', 'M');
const eqv:array [1..7]
of integer=(1 ,   5,  10,  50, 100,500 ,1000) ;
var i,n,t,ts,t1,t2:integer;
a:array [1..20] of integer;
s:string;
begin
  { TODO -oUser -cConsole Main : Insert code here };

writeln('VVedite chislo v rimskoi s.s.');
readln(s);
n:=length(s);

for i:=1 to n do
begin
  for t:=1 to 7 do
   begin
   if upcase(s[i])=rim[t] then a[i]:=eqv[t];
  end;
end;
     t1:=0;
     t2:=0;
     ts:=0;
     t:=0;
i:=2;
repeat
if (a[i-1]<a[i]) and (a[i]/a[i-1]<=10) then
 begin
 t1:=t1+a[i]+a[i-1];
 t2:=t2+a[i]-a[i-1]
 end;
inc(i);
until i>n;

for i:=1 to n do ts:=ts+a[i];

t:=ts-t1+t2;
//writeln('t= ',t,' t1= ',t1, ' t2= ',t2,' ts= ',ts);
writeln(s, ' = ', t);
readln;
end.


пользовался этими правилами:
Цитата:
-Цифры записываются слева направо в порядке убывания. В этом случае их значения складываются (VI = 5 + 1).
-Если слева записана меньшая цифра, а справа большая – то их значения вычитаются (IV = 5 – 1 = 4).
-Перед старшей цифрой не может быть записано более одной младшей цифры.
(Нельзя писать IIV = 5 – 1 – 1 = 3. Надо: III = 1 + 1 + 1 = 3)
- левая «цифра» может быть меньше правой максимум на один порядок: так перед L(50) и С(100) из «младших» может стоять только Х(10), перед D(500) и М(1000) — только С(100), перед V(5) — только I(1);


вроде работает


 

Member
Статус: Не в сети
Регистрация: 29.11.2003
Откуда: Chelyabinsk
LS Спасибо! :) Но я потом тоже ее решил, внизу будет мой вариант, без проверок ошибок на ввод, она оказалось не нужна,
просто мне ее сегодня сдавать, поэтому закипешил....
Код:
Uses crt;
Var ch: string;
    chis:char;
    i,otv:integer;
    mas:array [1..30] of integer;
begin
  clrscr;
  otv:=0;
  Writeln ('Roman: (Capital)');
  Readln(ch);
  for i:=1 to length(ch) do begin
    chis:=ch[i];
    case chis of                {sopostavlenie}
      'I': mas[i]:=1;
      'V': mas[i]:=5;
      'X': mas[i]:=10;
      'L': mas[i]:=50;
      'C': mas[i]:=100;
      'D': mas[i]:=500;
      'M': mas[i]:=1000
    end
  end;
  for i:=1 to length(ch) do        {Perevod}
    if mas[i]<mas[i+1] then otv:=otv-mas[i]
    else otv:=otv+mas[i];
  Writeln('Decimal: ',otv);
  Readkey
end.

_________________
Ушел, но обещал вернутся...


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 5 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan