Member
Статус: Не в сети Регистрация: 29.11.2003 Откуда: Chelyabinsk
Задача заключается в том чтобы написать программу перевода из одной системы счисления в другую, конкретно из РИМСКОЙ в ДЕСЯТИЧНУЮ...
Также там нужна система проверки ошибок на ввод...
Правило перевода:
Каждая меньшая цифра записывается справа (увеличивает), а запись слева уменьшает, на количество едениц которая она обозначает.
Т.е. например требуется перевести число: MCMXLVI - 1946..
пример неправильного ввода это IC <> 99 (не равно)
Я ее решал вчера 5 часов, но так и не добился абсолютно точной работы, всегда находилось число которая переводилось неправильно...
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;
-Цифры записываются слева направо в порядке убывания. В этом случае их значения складываются (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.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения