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

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

Восстановить пароль Регистрация
 
Никитааааа
0 / 0 / 0
Регистрация: 26.02.2014
Сообщений: 18
12.03.2014, 14:07     Программа перевод чисел из арабской систеиы счисления в римскую #1
Перевести заданное целое число в систему римского счисления (1 - I, 5 - V, 10 - X, 50 - L, 100 - C, 500 - D, 1000 - M)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2014, 14:07     Программа перевод чисел из арабской систеиы счисления в римскую
Посмотрите здесь:

C++ перевод чисел из систем счисления
C++ задача на римскую систему счисления
C++ Перевод с арабской на римскую сс и наоборот
C++ Перевод с арабской на римскую сисстему счисления
Перевод с арабской на римскую сс и наоборот C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 14:15     Программа перевод чисел из арабской систеиы счисления в римскую #2
Перевод арабских чисел в римские
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
12.03.2014, 15:40     Программа перевод чисел из арабской систеиы счисления в римскую #3
Вариант с большим количеством ада.
Кликните здесь для просмотра всего текста
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
Перевести заданное целое число в систему римского счисления
(1 - I, 5 - V, 10 - X, 50 - L, 100 - C, 500 - D, 1000 - M)
*/
 
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <ctime>
#include <string>
#include <vector>
#include <functional>
 
template <class T, class U>
class get_member_ref
{
public:
    typedef const U & result_type;
    typedef const T & argument_type;
    get_member_ref(const U T::*const PMem) : _pMem(PMem) {}
    result_type operator()(argument_type Obj) const { return Obj.*_pMem; }
private:
    const U T::*const _pMem;
};
 
template <class T, class U>
get_member_ref<T, U> get_mem_ref(const U T::*const PMem)
{
    return get_member_ref<T, U>(PMem);
}
 
template <class Func1, class Func2>
class unary_compose: public std::unary_function<typename Func2::argument_type, typename Func1::result_type>
{
public:
    unary_compose(const Func1 & F1, const Func2 & F2) : _f1(F1), _f2(F2) {}
    result_type operator()(argument_type Obj) const
    {
        return _f1(_f2(Obj));
    }
private:
    Func1 _f1;
    Func2 _f2;
};
 
template <class Func1, class Func2>
unary_compose<Func1, Func2> compose1(const Func1 & F1, const Func2 & F2)
{
    return unary_compose<Func1, Func2>(F1, F2);
}
 
struct Arab2RomeNode
{
    unsigned int arab;
    char rome;
};
 
Arab2RomeNode nodes[] = {
    { 1, 'I' },
    { 10, 'X' },
    { 100, 'C' },
    { 1000, 'M' },
    { 5, 'V' },
    { 50, 'L' },
    { 500, 'D' }
};
 
bool operator<(Arab2RomeNode N1, Arab2RomeNode N2) { return (N1.arab < N2.arab); }
Arab2RomeNode * nodes_begin(void) { return nodes; }
Arab2RomeNode * nodes_end(void) { return nodes + sizeof(nodes)/sizeof(nodes[0]); }
 
char rome_next_exponent(char symbol)
{
    Arab2RomeNode * node = std::find_if(nodes_begin(), nodes_end(),
        compose1(std::bind2nd(std::equal_to<char>(), symbol), get_mem_ref(&Arab2RomeNode::rome)));
    if (node == nodes_end())
    {
        std::cout << "Ошибка алгоритма\n";
        return '?';
    }
    return (*(node + 2)).rome;
}
 
void raise_exponent(std::string & rome_digit)
{
    std::transform(rome_digit.begin(), rome_digit.end(), rome_digit.begin(), rome_next_exponent);
}
 
std::string arab2rome(unsigned int arab)
{
    std::string rome;
    if (arab > 9)
    {
        std::cout << "Ошибка алгоритма\n";
        return rome;
    }
    if (arab == 0)
        return rome;
 
    Arab2RomeNode * node = (arab < (nodes_begin() + 1)->arab) ? nodes_begin() : nodes_begin() + 1;
    if (arab == (*(node + 1)).arab - 1)
    {
        rome.push_back(nodes_begin()->rome);
        rome.push_back((node + 1)->rome);
    } else
    {
        rome.push_back(node->rome);
        arab -= node->arab;
        while (arab > 0)
        {
            rome.push_back(nodes_begin()->rome);
            --arab;
        }
    }
    return rome;
}
 
class Arab2Rome
{
public:
    Arab2Rome(std::vector<std::string> & rd) : m_rome_digits(rd) {}
    void operator()(unsigned int arab_digit)
    {
        std::for_each(m_rome_digits.begin(), m_rome_digits.end(), raise_exponent);
        m_rome_digits.push_back(arab2rome(arab_digit));
    }
private:
    std::vector<std::string> & m_rome_digits;
};
 
int main(void)
{
    setlocale(0, "rus");
    srand(static_cast<unsigned int>(time(NULL)));
 
    std::sort(nodes_begin(), nodes_end());
 
    unsigned int arab = rand() % 5000;
    std::vector<unsigned int> digits;
    unsigned int arab_copy = arab;
    while (arab_copy > 0)
    {
        digits.push_back(arab_copy % 10);
        arab_copy = arab_copy / 10;
    }
    std::reverse(digits.begin(), digits.end());
 
    std::vector<std::string> rome_digits;
    std::for_each(digits.begin(), digits.end(), Arab2Rome(rome_digits));
 
    std::cout << "Число: " << arab << '\n';
    std::cout << "Римское число: ";
    std::copy(rome_digits.begin(), rome_digits.end(), std::ostream_iterator<std::string>(std::cout, ""));
    std::cout << std::endl;
    system("pause");
    return 0;
}
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 15:58     Программа перевод чисел из арабской систеиы счисления в римскую #4
В объявлении класса unary_compose забыли:
C++
1
2
    typedef typename Func1::result_type result_type;
typedef typename Func2::argument_type argument_type;
А также заголовочник:
C++
1
#include <iterator>
А чему равно число 4500 в римской системе?
И реализация конечно кошмар
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
12.03.2014, 16:03     Программа перевод чисел из арабской систеиы счисления в римскую #5
Цитата Сообщение от Ilot Посмотреть сообщение
В объявлении класса unary_compose забыли:
C++
1
2
typedef typename Func1::result_type result_type;
typedef typename Func2::argument_type argument_type;
Не забыли. Они наследуются от std::unary_function.

Цитата Сообщение от Ilot Посмотреть сообщение
А также заголовочник:
C++
1
#include <iterator>
Ага. Но 2008я студия не ругается, а я всё время забываю его.
Цитата Сообщение от Ilot Посмотреть сообщение
А чему равно число 4500 в римской системе?
Будет ММММD. Хотя конечно не правильно это. Надо до 4000 делать.
Цитата Сообщение от Ilot Посмотреть сообщение
И реализация конечно кошмар
Да лан. Что тут кошмарного? Всё прозрачно.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 16:07     Программа перевод чисел из арабской систеиы счисления в римскую #6
Цитата Сообщение от John Prick Посмотреть сообщение
Да лан. Что тут кошмарного? Всё прозрачно.
Просто для сравнения посмотрите на эту реализацию
Цитата Сообщение от John Prick Посмотреть сообщение
Не забыли. Они наследуются от std::unary_function.
Хм... возможно, однако ваш вариант у меня не компилится, так как стандарт запрещает использование определенного внутри другого класса типа без спецификатора typename. Т.е. здесь можно сделать так:
C++
1
2
3
4
    typename Func1::result_type operator()(typename Func2::argument_type Obj) const
    {
        return _f1(_f2(Obj));
    }
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
12.03.2014, 16:09     Программа перевод чисел из арабской систеиы счисления в римскую #7
Ilot, да я ради шутки этот код выложил. Не парьтесь.
Цитата Сообщение от Ilot Посмотреть сообщение
ваш вариант у меня не компилится
Какой у вас компилятор?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 16:12     Программа перевод чисел из арабской систеиы счисления в римскую #8
Цитата Сообщение от John Prick Посмотреть сообщение
Какой у вас компилятор?
GCC
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
12.03.2014, 16:39     Программа перевод чисел из арабской систеиы счисления в римскую #9
Сейчас под рукой его нет. Дома проверю и исправлю.

Добавлено через 22 минуты
Проверил. Ну да, требует чтобы эти типы были вложены в unary_compose. Правда, я так и не нашёл реализацию unary_function в инклудах для DevC++, хотя по стандарту оно должно быть в <functional>.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
12.03.2014, 16:45     Программа перевод чисел из арабской систеиы счисления в римскую #10
Цитата Сообщение от John Prick Посмотреть сообщение
Правда, я так и не нашёл реализацию unary_function в инклудах для DevC++, хотя по стандарту оно должно быть в <functional>
<stl_function>
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.03.2014, 16:48     Программа перевод чисел из арабской систеиы счисления в римскую
Еще ссылки по теме:

Написать программу, какая переводит числа с арабской системы в римскую C++
Перевод чисел из 10 в 15 систему счисления C++
C++ Перевод чисел из файла в римскую систему счисления

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

Или воспользуйтесь поиском по форуму:
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
12.03.2014, 16:48     Программа перевод чисел из арабской систеиы счисления в римскую #11
Цитата Сообщение от Ilot Посмотреть сообщение
<stl_function>
C++
1
2
3
4
5
6
7
8
9
  template<typename _Arg, typename _Result>
    struct unary_function
    {
      /// @c argument_type is the type of the argument
      typedef _Arg  argument_type;   
 
      /// @c result_type is the return type
      typedef _Result   result_type;  
    };
И что же тогда? Почему не компилирует? Ведь, по сути, этот класс (unary_function) только для этих тайпдефов и нужен.
Yandex
Объявления
12.03.2014, 16:48     Программа перевод чисел из арабской систеиы счисления в римскую
Ответ Создать тему
Опции темы

Текущее время: 20:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru