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

Перевод арабских чисел в римские - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Pro_Kesha
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 6
20.02.2014, 08:01     Перевод арабских чисел в римские #1
Всем привет. Не получается решить задачу в С++ Кто может помогите если не сложно;.

Для записи римскими цифрами используются символы I, V, X, L, C, D, M, обозначающие соответственно числа 1, 5, 10, 50, 100, 500, 1000. Составить программу, которая запись любого данного числа n ( n ≤ 3999 ) арабскими цифрами переводила бы в запись римскими цифрами.

Всем спасибо заранее!
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
20.02.2014, 09:34     Перевод арабских чисел в римские #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вроде как работает:
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<string>
using std::string;
string func(int num, string, string, string);
int main(int argc, char argv[]) {
    system("chcp 1251>0");
    std::cout << "Введите число не большее 3999: ";
 
    int arabien_num;
 
    if (!(std::cin >> arabien_num) || (arabien_num > 3999)) {
        std::cerr << "Невозможно инициализировать число!" << std::endl;
        exit(1);
    }
 
    std::string rome_num;
 
    rome_num += func(arabien_num / 1000, "", "", "M");
    arabien_num %= 1000;
    rome_num += func(arabien_num / 100, "M", "D", "C");
    arabien_num %= 100;
    rome_num += func(arabien_num / 10,  "C", "L", "X");
    arabien_num %= 10;
    rome_num += func(arabien_num ,   "X", "V", "I");
    std::cout << rome_num << std::endl;
    return 0;
}
string func(int num, string hi, string re, string lo)
{
    switch(num)
    {
        case 9:
            return lo + hi;
        case 8:
            return re + lo + lo + lo;
        case 7:
            return re + lo + lo;
        case 6:
            return re + lo;
        case 5:
            return re;
        case 4:
            return lo + re;
        case 3:
            return lo + lo + lo;
        case 2:
            return lo + lo;
        case 1:
            return lo;
        case 0:
            return "";
    }
}
Pro_Kesha
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 6
21.02.2014, 11:41  [ТС]     Перевод арабских чисел в римские #3
а по проще сделать можно как нибудь? я там половину тегов не знаю. мы их не проходили ещё. Преподаватель поймет что я не сам сделал. ч/з массивы
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
21.02.2014, 11:53     Перевод арабских чисел в римские #4
Ilot, а наоборот можете?
Ilot
Модератор
Эксперт С++
1767 / 1142 / 223
Регистрация: 16.05.2013
Сообщений: 3,020
Записей в блоге: 5
Завершенные тесты: 1
21.02.2014, 16:10     Перевод арабских чисел в римские #5
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ilot, а наоборот можете?
Да как два пальца
Кликните здесь для просмотра всего текста
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
#include<iostream>
#include<string>
#include<algorithm>
using std::string;
 
/**
*       Parser - функция для анализа строки символов
*/
 
    int Parser(string&);
 
/**
*       func - функция возвращает величину соответствующую символу в римской системе
*/
 
    int func(char);
 
int main(int argc, char argv[]) {
    system("chcp 1251>0");
    std::cout << "Введите число в римской системе: ";
 
    string word;
    string metrics("MDCLXVI");
 
    std::cin >> word;
 
    if(word.end() == std::find_first_of(word.begin(), word.end(), metrics.begin(), metrics.end(), std::not_equal_to<char>())) {
        std::cerr << "Невозможно построить выражение для анализа!" << std::endl;
        exit(1);
    }
 
    std::cout << Parser(word) << std::endl;
 
    return 0;
}
int Parser(string& word)
{
    int result = 0;
    string::reverse_iterator iter = word.rbegin();
    int msg, current_msg = func(*iter);
    while(iter != word.rend()) {
        msg = func(*iter);
        /*  В этом месте необходима проверка на корректность положения символа в числе */
        result += (msg < current_msg)? - func(*iter): func(*iter);
        std::cout << result <<std::endl;    //Отладка
        if(msg > current_msg)
            current_msg = msg;
        ++iter;
    }
    return result;
}
int func(char msg)
{
    switch(msg)
    {
        case 'I':
            return 1;
        case 'V':
            return 5;
        case 'X':
            return 10;
        case 'L':
            return 50;
        case 'C':
            return 100;
        case 'D':
            return 500;
        case 'M':
            return 1000;
    }
}

Однако здесь отсутствует проверка на корректность порядка символов в римском числе.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
21.02.2014, 21:04     Перевод арабских чисел в римские #6
Цитата Сообщение от Ilot Посмотреть сообщение
отсутствует проверка на корректность порядка символов в римском числе
Но если он генерирует последовательность правильно, то и шут с ней, master_Ilot. Х)
Yandex
Объявления
21.02.2014, 21:04     Перевод арабских чисел в римские
Ответ Создать тему
Опции темы

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