Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
 
Nek
1 / 1 / 2
Регистрация: 24.11.2009
Сообщений: 23
#1

Преобразование чисел из римской системы в десятичную и обратно - Pascal

24.11.2009, 18:48. Просмотров 18676. Ответов 56
Метки нет (Все метки)

Составить программу преобразования натуральных чисел из римской системы счисления в десятичную и обратно.

Вообще не понимаю как делать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2009, 18:48
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Преобразование чисел из римской системы в десятичную и обратно (Pascal):

Перевод из десятичной системы в двоичную и обратно из двоичной в десятичную
uses crt; var m:arrayof integer; n:longint; i,k:integer; begin clrscr;...

Преобразование натуральных чисел в римской нумерации в восьмеричную систему счисления
Помогите ребят. Нужно написать программу преобразования натуральных чисел в...

перевод со знаком из СС 16 со в десятичную и обратно
Помогите с програмкой) Задание: перевести число с СС16 в десятичную 1....

Перевод чисел из десятичной системы счисления в 2-ичную, 8-ричную, 16-ричную и обратно
Помогите составить проги.Очень нато!!!Желательно в процедурах или функциях.

преобразование из 16(си) в десятичную.
Написать программу,которая преобразует введеное с клавиатуры двухразрадное...

из шестнадцатеричной системы счисления в десятичную
написать программу переводящую целое число из шестнадцатеричной системы...

56
Xak
3 / 3 / 2
Регистрация: 16.03.2011
Сообщений: 151
14.10.2011, 21:34 #41
Цитата Сообщение от Стасечка Посмотреть сообщение
ды эт я ступила,вводила строчные буквы)
как я и сказал)
0
Puporev
Модератор
54149 / 41782 / 28889
Регистрация: 18.05.2008
Сообщений: 98,331
14.10.2011, 21:47 #42
Цитата Сообщение от Xak Посмотреть сообщение
а несуществет команды чтобы в нижний регистр переходить можно было?
В Турбо Паскале нет.
В Авс есть
Pascal
1
2
LowCase(c)//1 символ
LowwerCase(s)//вся строка
1
powerful123
1 / 1 / 6
Регистрация: 30.11.2013
Сообщений: 50
12.03.2014, 19:32 #43
Puporev, а можно сделать так если пользователь введет 'JJKK XX LLL',то также из римскую цифру переведет в арабскую.

Добавлено через 5 минут
Puporev, а можно сделать так если пользователь введет 'JJKK XX LLL',то также из римскую цифру переведет в арабскую.
0
Puporev
Модератор
54149 / 41782 / 28889
Регистрация: 18.05.2008
Сообщений: 98,331
12.03.2014, 19:35 #44
Если ты про код что вначале, то там же написано
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
for i:=1 to length(a) do//идем по строке
    begin
      {if (a[i]<>'I') and (a[i]<>'V') and (a[i]<>'X')
      and (a[i]<>'L')and (a[i]<>'C') and (a[i]<>'D') and (a[i]<>'M')
      then halt;} //это уберем
      if a[i]='I'then b[i]:=1;//если символ римской цифры, то переводим в число
      if a[i]='V'then b[i]:=5;
      if a[i]='X'then b[i]:=10;
      if a[i]='L'then b[i]:=50;
      if a[i]='C'then b[i]:=100;
      if a[i]='D'then b[i]:=500;
      if a[i]='M'then b[i]:=1000;
    end;
потом все складываем, там дальше написано
0
powerful123
1 / 1 / 6
Регистрация: 30.11.2013
Сообщений: 50
12.03.2014, 20:30 #45
Puporev, а как сделать так что если я ввожу XXI KIK,то считало только правильно записанную форму римского числа?
0
Puporev
Модератор
54149 / 41782 / 28889
Регистрация: 18.05.2008
Сообщений: 98,331
13.03.2014, 07:34 #46
Цитата Сообщение от powerful123 Посмотреть сообщение
только правильно записанную форму римского числа?
В принципе четкого однозначного правила написания числа римскими цифрами я не нашел, а потому не люблю эту тему. Проверяю только на символы.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var s:string;
    i,k:byte;
begin
repeat
writeln('Введите римское число');
read(s);
k:=0;
i:=1;
while(i<=length(s))and(k=0) do
if not (Upcase(s[i])in ['C','D','I','L','M','V','X']) then k:=1
else inc(i);
if k=1 then writeln('Число введено неверно, повторите ввод')
until k=0;
end.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3755 / 2452 / 2034
Регистрация: 22.11.2013
Сообщений: 6,821
13.03.2014, 10:04 #47
Цитата Сообщение от Puporev Посмотреть сообщение
четкого однозначного правила написания числа римскими цифрами я не нашел
Для записи используются цифры: I - 1, V - 5, X - 10, L - 50, C - 100; D - 500, M - 1000. Цифра не может быть повторена более 3-х раз подряд. Меньшие цифры, стоящие после большей, складываются. Меньшая цифра (одна!), стоящая перед большей, вычитается из большей.
Максимальное число: MMMIM - 3999.
Примеры: http://latinpro.info/latin_cifrae.php
0
Puporev
Модератор
54149 / 41782 / 28889
Регистрация: 18.05.2008
Сообщений: 98,331
13.03.2014, 10:06 #48
Согласен, так и писал прежде, но вот почитал про эти римские, например в Википедии и потерял веру в такие утверждения.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3755 / 2452 / 2034
Регистрация: 22.11.2013
Сообщений: 6,821
13.03.2014, 10:16 #49
При переводе в римские нужно помнить, что одно и то же число может быть записано разными способами в зависимости от проделанных упрощений, например, 3999:
MMMIM: 3000+(-1+1000)
MMMVMIV: 3000+(-5+1000)+(-1+5)
MMMXMIX: 3000+(-10+1000)+(-1+10)
MMMLMVLIV: 3000+(-50+1000)+(-5+50)+(-1+5)
MMMCMXCIX: 3000+(-100+1000)+(-10+100)+(-1+10)
0
Alex-Borshch
0 / 0 / 1
Регистрация: 13.04.2015
Сообщений: 28
27.06.2016, 16:02 #50
Вот реализация на джаве, как по мне, наиболее правильная.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public static int roman2Decimal(String romanNumber) {
 
        matcher = pattern.matcher(romanNumber);
        int numericDigit = 3;
        int sum = 0;
        if (matcher.find()) {
            for (int i = 1; i < 5; i++) {
                sum += roman2DecimalHelper(matcher.group(i), numericDigit--);
            }
        }
        return sum;
    }
 
    private static int roman2DecimalHelper(String fragment, int numericDigit) {
        String regex1 = "^I{1,3}$";
        String regex2 = "^VI{0,3}$";
        String fragment2 = "";
 
        if (fragment.isEmpty())
            return 0;
 
        if (numericDigit == 1) {
            fragment2 = fragment.replace('X', 'I').replace('L', 'V').replace('C', 'X');
            numericDigit *= 10;
        } else if (numericDigit == 2) {
            fragment2 = fragment.replace('C', 'I').replace('D', 'V').replace('M', 'X');
            numericDigit = 1 * 100;
        } else if (numericDigit == 3) {
            fragment2 = fragment.replace('M', 'I');
            numericDigit = 1 * 1000;
        } else if (numericDigit == 0) {
            numericDigit = 1;
            fragment2 = fragment;
        }
 
        Pattern pattern = Pattern.compile(regex1);
        Matcher matcher = pattern.matcher(fragment2);
 
        if (matcher.find()) {
            return numericDigit * fragment2.length();
        }
        pattern = Pattern.compile(regex2);
        matcher = pattern.matcher(fragment2);
        if (matcher.find()) {
            return numericDigit * (4 + fragment2.length());
        }
        if (fragment2.equals("IV")) {
            return numericDigit * 4;
        }
 
        return numericDigit * 9;
    }
0
ElectronicZ
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 25
25.04.2017, 14:36 #51
А почему -2*ar1 ?

Добавлено через 1 час 49 минут
Здравствуй, твоя программа отлично работает, но вот зачем мы умножаем -2*ar1 ? Можешь объяснить, мне просто очень стало интересно.
0
Puporev
Модератор
54149 / 41782 / 28889
Регистрация: 18.05.2008
Сообщений: 98,331
25.04.2017, 14:39 #52
Цитата Сообщение от ElectronicZ Посмотреть сообщение
-2*ar1 ?
Это Вы кого спрашиваете?, у кого в коде такая строка? Дайте ссылку или укажите номер поста.
0
ElectronicZ
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 25
25.04.2017, 15:20 #53
Вот в этом коде
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
.Program bez_tab;
uses crt;
var rz:string;
    n,ar,ar1,i,a: integer;
 
Begin
clrscr;
Writeln ('Liczba rzymska');
Readln(rz);
ar:=0; n:=0;
for i := 1 to length (rz) do
  begin
  ar1:=ar;
    if rz[i]='I' then ar:=1;
    if rz[i]='V' then ar:=5;
    if rz[i]='X' then ar:=10;
    if rz[i]='L' then ar:=50;
    if rz[i]='C' then ar:=100;
    if rz[i]='D' then ar:=500;
    if rz[i]='M' then ar:=1000;
 
    if ar>ar1 then a:=-2*ar1
              else a:=0;
    n:=n+a+ar
  end;
 
 Writeln ('Arabska =  ',n);
 Readln;
end.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3755 / 2452 / 2034
Регистрация: 22.11.2013
Сообщений: 6,821
25.04.2017, 16:41 #54
Цитата Сообщение от ElectronicZ Посмотреть сообщение
А почему -2*ar1 ?
Вычитают два ar1 (бывший на прошлом шаге ar) (стр.22), потому как на прошлом шаге один безусловно прибавили (стр.24), и получится, что в итоге вычли один "прошлошаговый" ar.
0
ElectronicZ
0 / 0 / 0
Регистрация: 13.04.2017
Сообщений: 25
25.04.2017, 16:44 #55
Но там же умножают... на -2 , а не вычитают
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3755 / 2452 / 2034
Регистрация: 22.11.2013
Сообщений: 6,821
25.04.2017, 16:59 #56
ElectronicZ,
если ar (текущая цифра) больше ar1 (цифра на прошлом шаге), то в строке 24 получится: n := n - 2*ar1 + ar.
Один ar1 -- чтобы убрать прибавленное на прошлом шаге, еще один -- по правилам, когда цифра слева меньше, ее нужно вычесть -- итого вычитают предыдущую цифру дважды.

Добавлено через 10 минут
Можно переписать, например, так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var
  s: String;
  n, ar, a, i: integer;
begin
  Write('Римское: '); Readln(s);
  ar:=0; n:=0;
  for i:=1 to Length(s) do begin
    a:=ar;
    case UpCase(s[i]) of
    'I': ar:=1;
    'V': ar:=5;
    'X': ar:=10;
    'L': ar:=50;
    'C': ar:=100;
    'D': ar:=500;
    'M': ar:=1000;
    end;
    if ar>a then a:=2*a else a:=0;
    n:=n+ar-a;
  end;
  WriteLn('Арабское: ',n);
end.
или так (вместо 18-19):
Pascal
18
    Inc(n,ar-Ord(ar>a)*2*a);
0
Puporev
Модератор
54149 / 41782 / 28889
Регистрация: 18.05.2008
Сообщений: 98,331
25.04.2017, 17:16 #57
Цитата Сообщение от ElectronicZ Посмотреть сообщение
А почему -2*ar1 ?
Pascal
1
2
if ar>ar1 then a:=-2*ar1  else a:=0;
 n:=n+a+ar
Например VI=1+0+5=6 IV=1-2*1+5=4
0
25.04.2017, 17:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2017, 17:16
Привет! Вот еще темы с решениями:

Подпрограмма из шестнадцатеричной системы в десятичную
Прошу помочь написать программу на паскале которую нужно разбить на...

Перевод из двоичной системы счисления в десятичную
Помогите создать программу на языке паскаль Добавлено через 40 секунд и...

Перевод из двоичной системы в двоично-десятичную
var bin: string; {в этой переменной будем хранить считанное значение число в...

Перевод числа из пятеричной системы в десятичную систему счисления.
помогите сделать 2 лабы пожалуйста, а то оч надо Заранее благодарен !! вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
57
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru