Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/47: Рейтинг темы: голосов - 47, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 19

Перевести римские числа в арабские, и наоборот

16.05.2016, 22:05. Показов 8961. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите решить задание в среде C++ Builder.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.05.2016, 22:05
Ответы с готовыми решениями:

Перевести арабское число в римское и наоборот.
Нам по курсовой задали написать компоненту перевода арабского числа в римское и компоненту перевода римского числа в арабское. Помогите...

Перевести арабские числа в римские числа
Существует ли эргономичный способ перевода арабских чисел в римские и обратно?

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

12
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,009
16.05.2016, 22:29
Свой код имеется?
Переводить арабские в римские несложно, зная правила составления последних.
Для перевода римских в арабские лучше использовать "таблицу переходов" (точное название не помню), особенно если нужна проверка правильности ввода. Должны были давать подобную теорию.
Делал перевод давно (консольное приложение), но дискета с кодом ушла к одногруппнику и не вернулась.
Может быть вспомню молодость и попробую сделать снова.
Но на меня лучше особо не надеяться.
0
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 19
16.05.2016, 22:56  [ТС]
Да нету теории. Да и кода нет. Пытался что то найти, а все что откопал это в C#, C++ и сраном паскале...Если поможешь, буду очень признателен)
0
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,009
17.05.2016, 02:35
Арабское в римское:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
String ArabicToRoman(UINT number)
{
  const count = 13;
  UINT arabic[count] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}, i, j;
  String roman[count] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}, result = "";
  for (i = 0; i < count; i++)
  {
    for (j = 0; j < number / arabic[i]; j++)
      result += roman[i];
    number %= arabic[i];
  }
  return result;
}
Миниатюры
Перевести римские числа в арабские, и наоборот  
3
0 / 0 / 0
Регистрация: 16.05.2016
Сообщений: 19
17.05.2016, 15:34  [ТС]
Ну это в С++, а надо в билдере.
0
17.05.2016, 15:37

Не по теме:

Цитата Сообщение от index50 Посмотреть сообщение
Ну это в С++, а надо в билдере.
Зачет, садись - два!

0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
17.05.2016, 15:41
index50, ошалеть... А на скрине что по твоему??? Если ты не в состоянии готовую функцию к делу пристроить, то нафига тебе это программирование???
1
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,009
17.05.2016, 17:32
Лучший ответ Сообщение было отмечено index50 как решение

Решение

Цитата Сообщение от index50 Посмотреть сообщение
Ну это в С++, а надо в билдере.
А билдер зря что ли имеет "приставку" "C++"?
Так бы и сказал, что тебе нужно полностью готовое.
Неужели и правда трудно поместить на форму "кнопку" Button, "поле редактирования" Edit и "текстовую метку" Label?
Плюс написать в обработчике нажатия кнопки одну строку (с помощью двойного клика по нужному событию)?
Чтобы получилось подобное (верхние строки до функции ArabicToRoman создаются автоматом, самому их писать не нужно):
C++
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
String ArabicToRoman(UINT number)
{
  const count = 13;
  UINT arabic[count] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}, i, j;
  String roman[count] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}, result = "";
  for (i = 0; i < count; i++)
  {
    for (j = 0; j < number / arabic[i]; j++)
      result += roman[i];
    number %= arabic[i];
  }
  return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonClick(TObject *Sender)
{
  Label->Caption = ArabicToRoman(StrToIntDef(Edit->Text, 0));
}
Если ты не можешь из практически готового (на 99,999%) сделать рабочую программу, то я не знаю, как вас там учат или вы сами там учитесь.
Раньше, когда начинали писать код с консольных приложений в древних уже IDE и все нужно было указывать самостоятельно, такие нулевые знания очень редко встречались.
А если даже "формошлепством" заниматься не получается, то о каком коде может идти речь.
2
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,009
17.05.2016, 20:46
Я не поленился и нашел некоторые старые записи, где я, будучи студентом, на бумаге решал задачу, указанную в заголовке темы, лет 15-16 назад. Пытался не один день, но в итоге сделал "таблицу переходов", нужную по условию для решения (возможно, финального варианта нет во вложении, оригинал либо не нашел, либо он не сохранился на бумаге). А это всего лишь одно из заданий зачетной лабораторной работы.
Вот так мы тогда учились (вполне успешно), когда интернет был медленный и малодоступный, компьютеры дорогие и не сильно производительные, думали головой, а не искали халявы на форумах (про них, к счастью, ничего не знали, пусть даже они и были).
Миниатюры
Перевести римские числа в арабские, и наоборот   Перевести римские числа в арабские, и наоборот   Перевести римские числа в арабские, и наоборот  

Перевести римские числа в арабские, и наоборот   Перевести римские числа в арабские, и наоборот   Перевести римские числа в арабские, и наоборот  

2
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,009
19.05.2016, 03:11
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Добавил перевод римских чисел в арабские (функция RomanToArabic).
Имеется проверка ввода (EditRomanKeyPress) и "правильности" римского числа (с помощью "таблицы переходов" trans_table).
Один нюанс - допустимо размещение подряд более трех символов M. Тут либо нужно изменять таблицу, либо не вводить соответствующие числа (больше 3999).
Код (вместе с ArabicToRoman):
C++
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
String ArabicToRoman(UINT number)
{
  const count = 13;
  UINT arabic[count] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}, i, j;
  String roman[count] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}, result = "";
  for (i = 0; i < count; i++)
  {
    for (j = 0; j < number / arabic[i]; j++)
      result += roman[i];
    number %= arabic[i];
  }
  return result;
}
//---------------------------------------------------------------------------
UINT RomanToArabic(String roman_number)
{
  const count = 7, rn = 18;
  String roman = "IVXLCDM", cond = "";
  UINT arabic[count] = {1, 5, 10, 50, 100, 500, 1000}, result = 0, test = 0;
  int i, j, length = roman_number.Length();
  UINT trans_table[rn+1][count] = {
                                   6,  5,  4,  3,  2,  1,  1,
                                  rn, rn, rn, rn,  7, rn,  7,
                                  rn, rn,  9, rn,  8,  7,  7,
                                  rn, rn,  9, rn, 10,  1,  1,
                                  12, rn, 11,  9, 10,  1,  1,
                                  12, rn, 13,  3,  2,  1,  1,
                                  14, 12,  4,  3,  2,  1,  1,
                                  rn, rn, rn, rn, rn, rn,  7,
                                  rn, rn, rn, rn, 15,  7,  7,
                                  rn, rn, rn, rn, 10,  1,  1,
                                  rn, rn, rn, rn,  8,  7,  7,
                                  rn, rn, 16,  9, 10,  1,  1,
                                  rn, rn, 13,  3,  2,  1,  1,
                                  rn, rn, 11,  9, 10,  1,  1,
                                  17, 12, 13,  3,  2,  1,  1,
                                  rn, rn, rn, rn, rn,  7,  7,
                                  rn, rn, rn,  9, 10,  1,  1,
                                  rn, 12, 13,  3,  2,  1,  1,
                                  rn, rn, rn, rn, rn, rn, rn
                                };
  for (i = length; i > 0; i--)
    for (j = 0; j < count; j++)
      if (roman_number[i] == roman[j+1])
        test = trans_table[test][j];
 
  if (test > 0 && test < rn)
  {
    for (i = 1; i <= length; i++)
      cond += "0";
 
    for (i = length; i > 0; i--)
      for (j = 0; j < count; j++)
        if (roman_number[i] == roman[j+1])
          cond[i] = j;
 
    result += arabic[ cond[length] ];
 
    for (i = length; i > 1; i--)
    {
      if (cond[i-1] >= cond[i])
        result += arabic[ cond[i-1] ];
      else
        result -= arabic[ cond[i-1] ];
    }
  }
 
  return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonArabicToRomanClick(TObject *Sender)
{
  LabelRoman->Caption = ArabicToRoman(StrToIntDef(EditArabic->Text, 0));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonRomanToArabicClick(TObject *Sender)
{
  LabelArabic->Caption = RomanToArabic(EditRoman->Text);
  if (LabelArabic->Caption == "0")
    LabelArabic->Caption = "wrong roman number";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EditRomanKeyPress(TObject *Sender, System::WideChar &Key)
{
  String roman = "cCdDiIlLmMvVxX";
  bool state = 0;
  for (int i = 1; i <= roman.Length(); i++)
    if (Key == roman[i] || Key == VK_BACK)
    {
      state = 1;
      break;
    }
  if (!state)
    Key = 0;
}
//---------------------------------------------------------------------------
ехе прилагается.
Миниатюры
Перевести римские числа в арабские, и наоборот  
Вложения
Тип файла: zip arabic_roman.zip (1.37 Мб, 41 просмотров)
1
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,009
19.05.2016, 03:22
Можно было использовать другой ("стандартный") способ проверки "правильности" римского числа (http://mech.math.msu.su/~shvet... deas.xhtml, см. таблицу), но он мне кажется не таким интересным.
0
Модератор
 Аватар для D1973
9907 / 6444 / 2455
Регистрация: 21.01.2014
Сообщений: 27,353
Записей в блоге: 3
19.05.2016, 08:46
gunslinger, немного не догнал логику твоей таблицы переходов... Ну, да и пес с ней, не мне оно надо
Просто когда-то делал такой перевод (без проверок на правильность составления римского числа), сейчас вот нашел в своем старье и переиначил с Delphi...
C++
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
int RtoA(String s)
{
  int rez = 0, step = 1, L = s.Length();
  while(step <= L)
   {
     switch(s[step])
       {
         case 'M' :
          rez += 1000; break;
         case 'D' :
          rez += 500; break;
         case 'L' :
          rez += 50; break;
         case 'V' :
          rez += 5; break;
         case 'C' :
          if(step != L)
           {
             if(s[step + 1] == 'M')
              {
                rez += 900;
                step++;
                break;
              }
             if(s[step + 1] == 'D')
              {
                rez += 400;
                step++;
                break;
              }
           }
          rez += 100;
          break;
         case 'X' :
          if(step != L)
           {
             if(s[step + 1] == 'C')
              {
                rez += 90;
                step++;
                break;
              }
             if(s[step + 1] == 'L')
              {
                rez += 40;
                step++;
                break;
              }
           }
          rez += 10;
          break;
         case 'I' :
          if(step != L)
           {
             if(s[step + 1] == 'X')
              {
                rez += 9;
                step++;
                break;
              }
             if(s[step + 1] == 'V')
              {
                rez += 4;
                step++;
                break;
              }
           }
          rez += 1;
          break;
       }
      step++;
   }
  return rez;
}
1
place status here
 Аватар для gunslinger
3186 / 2220 / 640
Регистрация: 20.07.2013
Сообщений: 6,009
19.05.2016, 18:17
Я тоже поначалу (давно) пытался сделать схожим способом (скриншот №4 [левый нижний] из 9-го поста), но сейчас он кажется не сильно "оптимальным" в смысле его написания.

А принцип таблицы прост (последний скриншот из поста №9 - итоговая таблица). Проверка допустимых сочетаний римских цифр в числе. "Заголовки" столбцов - допустимые символы (от I до M).
Проверяем римское число с конца. Допустим, у нас есть число MCXIV.
V - смотрим второй столбец, первую строку. В ячейке 5. Значит, переходим в строку №5.
Далее I - пятая строка, первый столбец. Число 12, идем на строку №12. И т. д.
Если после прохождения всего римского числа по символам последнее значение в ячейке не 18 и не 0 (< 18 и > 0) - то у нас "правильное" римское число и можно его переводить в арабское.
Если 18 - то "неправильное". 0 - пустая строка (тоже неправильное число).
Раньше я делал еще с учетом варианта "вообще не римское число", но сейчас среда достаточно просто позволяет ограничить ввод "левых" символов.
Причем используемая таблица уже "нормализована" - убраны лишние и повторяющиеся строки, ибо изначально учет все сочетаний (групп) цифр выдавал таблицу строк на 60, если не больше.
Хороший был у нас преподаватель по информатике и смежным предметам в ВУЗе. По алгоритмам всяким натаскивал. Много чего интересного дал. Те же ханойские башни с решением в "три" строки (задолго до Википедии), причем рабочий код еще долго мне представлялся чем-то за гранью понимания.

P.S.: здесь https://ru.wikipedia.org/wiki/... 1%80%D1%8B (в конце) есть несколько реализованных способов перевода арабского числа в римское, но я сильно не вникал.

Добавлено через 19 минут
Небольшая поправка:
не "V - смотрим второй столбец, первую строку",
а "V - смотрим второй столбец, нулевую строку".
Слева на последнем скриншоте из поста №9 нумерация строк идет с нуля.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2016, 18:17
Помогаю со студенческими работами здесь

Нужно перевести римские цифры в арабские
Дан текст из заглавных латинских букв, за которым следует пробел. Определить, является ли этот текст правильной записью римскими цифрами...

Преобразовать арабские числа в римские
Ниже дан код, чтоб преобразовать арабские числа в римские! Не могли бы вы помочь и добавить сюда обратное преобразование? то есть если...

Оптимизация скрипта, преобразующего арабские числа в римские
Приветствую! Решил вот написать небольшой скрипт, преобразующий арабские числа в римские. Скрипт в принципе то работает, но у меня возник...

арабские в римские
вот я нашел код, но он немного не так работает как мне надо! Мне нужно чтоб я мог на экране написать ту цифру которую надо мне надо...

Арабские в римские
Нужно написать прогу которая будет переводить арабские числа в римские В ходе поисков по форуму нашёл такую информацию #include...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 05.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru