Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
DoctorDMC
9 / 9 / 1
Регистрация: 16.01.2011
Сообщений: 29
#1

Из арабских чисел в римские Visual C++ - C++

04.04.2012, 19:27. Просмотров 1269. Ответов 9
Метки нет (Все метки)

Здравствуйте! =) Знаю, что тема заезжена до дыр, но ничего стоящего на с++ я не нашел. В основном все написано либо на паскале с делфи, либо на шарпе. Т.к. с этими языками я не особо знаком, понять принцип перевода из арабских чисел в римские я так и не понял =( Если есть возможность, то объясните пожалуйста как работают такие программы, или просто киньте код (естественно) на с++, я попытаюсь его разобрать. Спасибо
П.С. Прога будет работать на .NET , но это не суть
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2012, 19:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Из арабских чисел в римские Visual C++ (C++):

Из арабских чисел в римские - C++
Функция для перевода из арабских чисел в римские. Как можно заменить устаревший sprintf? string _func_arab_to_roman(int arab){ ...

Перевод арабских чисел в римские - C++
Всем привет. Не получается решить задачу в С++ Кто может помогите если не сложно;. Для записи римскими цифрами используются...

Преобразование арабских чисел в римские - C++
2. Программа для преобразования числа, введённого арабскими цифрами в римское число, и наоборот.

Перевод арабских чисел в римские - C++
вообщем задание такое: написать код который из простых чисел преобразовал бы в римские, и потом можно было бы с ними делать простые...

Программа перевода арабских чисел в римские - C++
Написать программу, которая переводит положительное число введено в десятичном виде в римские числа и наоборот. Объясните пожалуйста как...

Перевод чисел из арабских в римские. Пределы int - C++
Есть программа: #include <stdio.h>; #include <conio.h>; int roman(int,int,char); main() { int a,z; clrscr(); while (z!=1){ ...

9
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
04.04.2012, 21:32 #2
А в каких пределах числа должны быть?
Если хотите, можете скинуть код на паскале/дельфи, я вам на C++ перепишу.
0
DoctorDMC
9 / 9 / 1
Регистрация: 16.01.2011
Сообщений: 29
04.04.2012, 21:37  [ТС] #3
пределов нет.
а вот код функции по переводу на Pascal:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function Arab2Roman(arab:integer):string;
var
  i:integer;
  d:integer;
  arab_str:string;
  arab_len:integer;
begin
  Result := '';
  arab_str := IntToStr(arab);
  arab_len := Length(arab_str);
  for i := 0 to arab_len-1 do begin
    d := StrToInt(String(arab_str[arab_len-i]));
    if (d+1) mod 5 = 0 then
      Result := Copy('IXCM', 1+i, 1) + Copy('VXLCDM', i*2 + (d+1) div 5, 1) + Result
    else
      Result := Copy('VLD', 1+i, d div 5) + Copy('IIIXXXCCCMMM', 1+i*3, d mod 5) + Result;
  end;
end;
И спасибо за помощь =)
0
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
04.04.2012, 22:09 #4
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
string copy(string s, int first, int k)
{
    string res;
    for (int i = first; i < first + k; i++)
    {
        if (i == s.size())
        {
            return res;
        }
        res += s[i];
    }
    return res;
}
 
string Arab2Roman(int arab)
{
    string arab_str;
    string res;
    char arr[100];
    int d;
 
    sprintf(arr, "%d", arab);
    arab_str = arr;
 
    int arab_len = arab_str.size();
    for (int i = 0; i < arab_len; i++)
    {
        d = arab_str[arab_len - i - 1] - 48;
        if ((d + 1) % 5 == 0)
        {
            res = copy("IXCM", i, 1) + copy("VXLCDM", i * 2 + (d + 1) / 5 - 1, 1) + res;
        }
        else
        {
            res = copy("VLD", i, d / 5) + copy("IIIXXXCCCMMM", i * 3, d % 5) + res;
        }
    }
 
    return res;
}
у меня вот так получилось. старался переписывать дословно, но функцию аналогичную copy() не помню, пришлось свою писать)
1
DoctorDMC
9 / 9 / 1
Регистрация: 16.01.2011
Сообщений: 29
05.04.2012, 15:01  [ТС] #5
спасибо за перевод кода, попробую разобрать как он работает, а можно чем-нибудь заменить sprintf, просто мне нельзя его использовать, такие условия задания
0
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
05.04.2012, 15:17 #6
Вообще, смысл строк
C++
1
2
sprintf(arr, "%d", arab);
arab_str = arr;
в том, чтобы перевести int в string. Напрямую я функции не знаю, но есть окольные пути с помощью готовых функций, как например sprintf(), а можно написать для этого функцию самому.
Например вот так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string inttostr(int k)
{
    string str;
    while (k)
    {
        str += (k % 10) + 48;
        k /= 10;
    }
    string res;
    for (int i = str.size() - 1; i >= 0; i--)
    {
        res += str[i];
    }
    return res;
}
и тогда строки
C++
1
2
sprintf(arr, "%d", arab);
arab_str = arr;
просто меняем на
C++
1
arab_str = inttostr(arab);
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
05.04.2012, 15:25 #7
Цитата Сообщение от stanis-morozov Посмотреть сообщение
в том, чтобы перевести int в string
Не в string, а в char*
0
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
05.04.2012, 15:33 #8
Сама функция sprintf() - да, чтобы перевести в char*, а я говорил про 2 строчки, а эти 2 строчки как раз переводят в string
0
DoctorDMC
9 / 9 / 1
Регистрация: 16.01.2011
Сообщений: 29
05.04.2012, 15:44  [ТС] #9
Еще раз спасибо, передалал под .NET
Если кому надо будет вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                 int len = textBox1->Text->Length;
                 int chi =Convert::ToInt32(textBox1->Text);
                 string res;
                 char arr[100];
                 int d;
                 String^ arab_str = Convert::ToString(chi);
                 for (int i = 0; i <len; i++)
                 {
                     d = arab_str[len - i - 1] - 48;
                     if ((d + 1) % 5 == 0)
                     {
                         res = copy("IXCM", i, 1) + copy("VXLCDM", i * 2 + (d + 1) / 5 - 1, 1) + res;
                     }
                     else
                     {
                         res = copy("VLD", i, d / 5) + copy("IIIXXXCCCMMM", i * 3, d % 5) + res;
                     }
                 }
                 String^ s1 = gcnew String(res.c_str());
                 textBox2->Text=s1; 
                }
Если что в форме есть кнопка и два элемента textBox, по нажатию кнопки число из 1-го textBox переводится в римское число и выводится во 2-ой textBox
я вот только не пойму зачем в коде "-48"?
0
stanis-morozov
15 / 15 / 1
Регистрация: 18.03.2012
Сообщений: 91
05.04.2012, 16:03 #10
Мы преобразуем int в string так:
берем последнюю цифру числа, прибавляем ее к нашей строке, а потом это число на 10 делим, то есть последнюю цифру удаляем. Но к string можно прибавлять только string, char и char*. А нам нужно прибавить цифру, являющуюся числом. Тогда нам нужно эту цифру преобразовать к сhar.
Ну а если посмотреть на таблицу ASCII, то можно увидеть, что код символа '0' равен 48, '1' - 49, '2' - 50...'9' - 57. Тогда, чтобы получить char с нужной цифрой, нам нужно к цифре прибавить 48. И уже к str мы прибавляем ASCII код нужного нам символа.

Добавлено через 1 минуту
А "-48" аналогично: мы преобразуем символ цифры к цифре, как к числу.
0
05.04.2012, 16:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2012, 16:03
Привет! Вот еще темы с ответами:

Составить программы для перевода арабских чисел в римские и для обратной операции - C++
Составить программы для перевода арабских чисел в римские и для обратной операции. Например, 255 = CCLV = сто + сто + пятьдесят + пять...

Перевод арабских цифр в римские с++ - C++
Подскажите как перевести арабские цифры в римские... Например 12345 -&gt; I II III IV V Заранее спасибо

Составить программу для перевода арабских чисел в римские и для зворотньох операции. Например 255 = ССЛВ = СТО + СТО + Пятьдесят + Пять - C++
Составить программу для перевода арабских чисел в римские и для зворотньох операции. Например 255 = ССЛВ = СТО + СТО + Пятьдесят + Пять ...

Рекурсивно определить количество арабских цифр в строке - C++
Описать рекурсивную подпрограмму, определяющую количество арабских цифр в данной строке.


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

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

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