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

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

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

Арабские в римские - C++

18.11.2009, 09:51. Просмотров 1301. Ответов 7
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
main()
{
    int number;
    char * romNum[] = {"I","II","III","IV","V","VI","VII","IIX","IX","X"};
 
    printf("Enter Latin number: ");
    scanf("%d", &number);
 
    printf("\nRoman number: %s\n", romNum[number-1]);
затем
количество знаков в числе вычисляется по формуле
log(ЧИСЛА) / log(10) + 1;

а также чтобы узнать количество единиц десятков и сотен
C++
1
2
3
4
5
6
7
8
int cufr[10];
        i = 0;
        while (chislo > 0)
        {
                cufr[i] = chislo%10;
                chislo /= 10;
                ++i;
        }
Число Римское обозначение
1 I
5 V
10 X
50 L
100 C
500 D
1000 M

сам не могу совместить всю эту информацию в программу. мне нужно сделать чтобы она работала с числами < 3889 и обязательно чтоб были использованы стринги. Очень прошу помочь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2009, 09:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Арабские в римские (C++):

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

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

Перевод римские цифры в арабские и обратно - C++
Помогите решить задачу на C++ перевод римские цифры в арабские и обратно. PLEASE.

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

Из римских чисел в арабские в файле - C++
Здравствуйте. Дана задача - в данном тексте заменить все римские числа на арабские. Вот я и не могу понять, каким образом в файловом потоке...

Перевод римских цифр в арабские - C++
Нужно написать программу перевода римских чисел в арабские. Есть эта программа на c#, но нужна на c++. Помогите пожалуйста, горю! Вот эта...

7
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
18.11.2009, 16:55  [ТС] #3
не помогло
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,812
19.11.2009, 10:12 #4
artem0n2, делал для кого-то тут обратную задачу - из римских в арабские... Может пригодится?
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
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
 
/* Строка в верхнем регистре */
char *strToUpper(char *str){
        char *p;
        for ( p = str; *p; p++ )
                *p = toupper(*p);
        return str;
}
 
/* Удаление пробельных символов */
char *cutSpaces(char *str){
        char *head;
        char *tail;
 
        for ( head = str; isspace(*head); head++ )
                ;
        for ( tail = str + strlen(str) - 1; (tail >= head) && (isspace(*tail)); tail-- )
                ;
        *++tail = 0;
        
        return head;
}
 
/* проверка отсутствия недопустимых символов */
int validRomeNumber(char *s){
        char *rome_digits = "IVXLCDM";
        for ( ; *s; s++ )
                if ( !strchr(rome_digits, *s) )
                        return 0;
        return 1;
}
 
/* перевод в число */
int romeToInt(char *rome){
        int num_digits, result, i;
        int *arabian = NULL;
        
        /* массив из "понятных" чисел */
        num_digits = strlen(rome);
        if ( (arabian = (int*)calloc(num_digits, sizeof(int))) == NULL ){
                fprintf(stderr, "Not enough memory!\n");
                exit(1);
        }
        /* заполнение массива */
        for ( i = 0; i < num_digits; i++ ){
                switch(rome[i]){
                        case 'I' :
                                arabian[i] = 1;
                                break;
                        case 'V' :
                                arabian[i] = 5;
                                break;
                        case 'X' :
                                arabian[i] = 10;
                                break;
                        case 'L' :
                                arabian[i] = 50;
                                break;
                        case 'C' :
                                arabian[i] = 100;
                                break;
                        case 'D' :
                                arabian[i] = 500;
                                break;
                        case 'M' :
                                arabian[i] = 1000;
                                break;
                        default :
                                free(arabian);
                                arabian = NULL;
                                return -1;
                }
        }
        /* генерация числа */
        result = 0;
        i = 0;
        while ( i < num_digits ){
                if ( (i < (num_digits - 1)) && (arabian[i] < arabian[i+1]) ){
                        result += arabian[i+1] - arabian[i];
                        i += 2;
                }
                else {
                        result += arabian[i];
                        i += 1;
                }
        }
        /* освобождение массива, возвращение результата */
        free(arabian);
        arabian = NULL;
        return result;
}
        
 
int main( void ){
        char buf[BUFSIZ];
        char *num;
        
        while ( 1 ){
                printf("Enter some Rome number or 0 for exit: ");
                fgets(buf, sizeof(buf), stdin);
                if ( *buf == '0' )
                        break;
                num = strToUpper(cutSpaces(buf));
                if ( !validRomeNumber(num) )
                        printf("%s is not valid Rome number!\n", num);
                else
                        printf("%s = %d\n", num, romeToInt(num));
        }
        
        return 0;
}
0
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
19.11.2009, 10:35  [ТС] #5
спасибо постараюсь переделать как мне надо
0
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
19.11.2009, 20:39  [ТС] #6
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 <stdio.h>
#include <stdlib.h>
#include <string.h> 
 
#define    NUMS    13
 
char* to_roman( unsigned int num, char* buff )
{
    int p = NUMS;
    unsigned int a_num[NUMS] = {1,4,5,9,10,40,50,90,100,400,500,900,1000};
    char* r_str[NUMS] = {"I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M"};
 
    *buff = '\0';
    while (p--)
    while (num >= a_num[p])
    {
        num -= a_num[p];
        strcat( buff, r_str[p] );
    }
 
    return buff;
}
 
int main( void )
{
    char* roman;
    unsigned int arabian = 3451;
 
    roman = (char*)malloc(256);
    printf( "%i: %s\n", arabian, to_roman( arabian, roman ));
    free( roman );
 
    return 0;
}
вот это должно работать, но не работает как надо

Добавлено через 41 минуту
всё сделал как надо можно закрывать тему
C++
1
2
3
4
5
6
7
printf("Vvedite chislo: \n");
    scanf("%d", &arabian);
    if(arabian > 1 || arabian < 3889);
    { 
    roman = (char*)malloc(256);
    printf( "%i: %s\n", arabian, to_roman( arabian, roman ));
    }
это то, что нужно было вписать.
0
artem0n2
0 / 0 / 0
Регистрация: 28.10.2009
Сообщений: 67
20.11.2009, 12:04  [ТС] #7
программа работает не совсем правильно помогите исправить плз
0
soulofdarkness
1 / 1 / 0
Регистрация: 20.11.2009
Сообщений: 21
20.11.2009, 12:18 #8
Он уже сообразил, тему можно закрывать =)

- Его сосед по парте
1
20.11.2009, 12:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2009, 12:18
Привет! Вот еще темы с ответами:

Перевод римских чисел в арабские и наоборот - C++
Я в Си программирую недавно, помогите пожалуйста решить.... Разработать программу для перевода чисел, записанных римскими цифрами в...

В произвольном тексте заменить арабские цифры символом # - C++
Задается произвольный текст, содержащий не более 10 строк, в каждой строке не более 80 символов. Требуется заменить арабские цифры...

Римские числа - C++
Нужна программа, проверающая на правильность введенное римское число В римских числах не силен. Гуглил, толком понял лишь что: ...

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


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

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

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