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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти сумму и количество положительных элементов, расположенных между минимальным и максимальным элементами массива. http://www.cyberforum.ru/cpp-beginners/thread1117179.html
Дан массив А(30). Найти сумму и количество положительных элементов, расположенных между минимальным и максимальным элементами массива. С++
C++ Не работает \n Не работает стандартная конструкция s!='\n'. Если же представить s как int она работает только на выходе получается нулевой вектор. Что делать, подскажите. Функция: vector<char> get_message(){ ... http://www.cyberforum.ru/cpp-beginners/thread1117178.html
C++ Как в консоли на C++ писать на русском
Здравствуйте, с выводом текста разобрался, русские буквы выводит нормально, а вот с вводом проблемма, вводится абракадабра. kol=0; while (fgetc(fout)!=EOF) kol++; fseek(fout,0,SEEK_SET);...
В заданной матрице найти номера всех столбцов с минимальной суммой элементов C++
В заданной матрице найти номера всех столбцов с минимальной суммой элементов. Вывести подматрицу из этиц столбцов в файл. Как написать эту программу? Добавлено через 3 минуты Срочно надо(
C++ Класс "Складская книга", содержащая названия товара, цену и количество на складе http://www.cyberforum.ru/cpp-beginners/thread1117120.html
Написать программу, обеспечивающую простейшие манипуляции с классом, определяющим: запись в скадской книге, содержащую названия товара, цену и количество на складе (обеспечить вывод на экран названий...
C++ Напишите программу определения суммы всех нечетных чисел, кратных 3 в диапазоне от 1 до 99 включительно 1. Нужно создать программу по вычислению этого 2.Напишите программу определения суммы всех нечетных чисел, кратных 3 в диапазоне от 1 до 99 включительно. Подсобите а то я вообще не представляю... подробнее

Показать сообщение отдельно
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
12.03.2014, 15:40
Вариант с большим количеством ада.
Кликните здесь для просмотра всего текста
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;
}
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru