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

задача на римскую систему счисления - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Вектор векторов http://www.cyberforum.ru/cpp-beginners/thread401670.html
Хочу создать вектор, содержащий векторы, которые содержат строки. Написал такой код: #include <iostream> #include <vector> using namespace std; typedef vector<string> vector_string; int main () {
C++ ошибка при компиляции перенес программу с другого компа и столкнулся со следующими ошибками(см. изображение). попробывал скачать библиотеку graphics.h для dev-cpp и чувствую что нужно что то еще.... Подскажите пожалуйста как исправить эти ошибки, какую библиотеку подключить? среда: Visual C++ 6.0 http://www.cyberforum.ru/cpp-beginners/thread401668.html
C++ Файлы: Определить команды, занявшие первые 3 места и 3 последние
Дан файл, содержащий результаты розыгрыша футбольного чемпионата. Определить команды занявшие первые 3 места и 3 последние.
C++ Помогите разобраться с задачей....
Дорогие программисты прошу вас помочь в следующем вопросе: мне нужно открыть в С++ файл формата BMP и получить значение его пикселей в виде матрицы для дальнейшей обработки.
C++ Компиляция (gcc) http://www.cyberforum.ru/cpp-beginners/thread401639.html
Добрый вечер! После компиляции текстовый файл становится вдруг двоичным, как следствие его невозможно открыть для исправлений. Почему? #include <stdio.h> struct klass { char fam; int mark; float nomer; }; int main (void)
C++ Скроллинг! Такой вопрос - После создания скроллинга как его можно связать с загруженным в ресурсы bitmap в с++ API!?!? Добавлено через 3 часа 5 минут Новый вопрос на туже тематику http://s2.ipicture.ru/uploads/20111208/DXaSvM4J.png Как можно этого избежать! Скроллинг вечно перерисовывается! подробнее

Показать сообщение отдельно
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
15.12.2011, 02:44     задача на римскую систему счисления
Цитата Сообщение от ПаЗитиФкА Посмотреть сообщение
не поняла эту строчку
C++
1
for (i = 0; (next = cin.get()) != '\n'; ++i)
здесь с каждой итерацией сначала получается сивол из входящего потока и записвается в переменную next. Затем если значение переменной next не равное концу строки то выполняется итерация цикла.


ПаЗитиФкА, я написал другу версию программы. основные функции остались те же. изменилась логика чтения римского числа из входного потока и проверка последовательности.
К сожалению старая версия программы работает не корректно. К примеру в старой версии ошибочное число XMMXMXX будет считаться правильным.
ТЕСТЫ

TRUE
4 IV 1
9 IX 1
40 XL 1
90 XC 1
400 CD 1
900 CM 1
2011 MMXI 1
2009 MMIX 1
99 XCIX 1
46 XLVI 1
31 XXXI 1
8 VIII 1
888 DCCCLXXXVIII 1
1668 MDCLXVIII 1
1989 MCMLXXXIX 1
3999 MMMCMXCIX 1
583 DLXXXIII 1
32 XXXII 1
2010 MMX 1
21 XXI 1
3 III 1

FALSE
XXXX 0
XXIXX 0
HLL 0
IIV 0
VVX 0
VXV 0
IVI 0
XLX 0
LCL 0
IVV 0
IXX 0
XLL 0
XCC 0
CDD 0
CMM 0
LXL 0
VIV 0
DCD 0
XXIXX 0
MDXCLXIVIL 0
MDCILXIVIIX 0
MDMMCLXIVICI 0

Я написал комментарии в непонятных на мой взгляд местах кода. посомтрите может этот вамриант вам больше понравится. Ну а если что непонятно то спрашивайте конечно.
КОД ПРОГРАММЫ

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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#include <cstdlib>   // тут std::system
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
int getArabNumber(const char &);
bool isCorrectLetter(const char &);
bool getRomanNumeral(char[], int &);
bool checkSequence(const char[], const int &);
int getSubtractingSequence(const char&, const char&);
int calculation(const char[], const int &);
 
int main() {
    const int size = 25;
    char romanNumeral[size];
    bool exit = false, isCorrectNumber;
    int actualSize;
 
    while (!exit) {
        actualSize = size;
        romanNumeral[0] = '\0';
        isCorrectNumber = false;
 
        cout << "Please enter Roman Numeral\n>";
        if (getRomanNumeral(romanNumeral, actualSize)) {
            if (checkSequence(romanNumeral, actualSize)) {
                isCorrectNumber = true;
            }
        }
        if (isCorrectNumber) {
            cout << calculation(romanNumeral, actualSize) << endl;
        } else {
            cout << "Provided Romam numeral is incorrect.\n";
        }
 
        cout << "\n1 :: Try once againe\n2 :: EXIT\n>";
        if (cin.get() == '2') {
            exit = true;
        }
        cin.clear();
        cin.ignore(1000, '\n');
        system("CLS");
    }
    return 0;
}
 
//вычесление результата
int calculation(const char array[], const int &count) {
    int res = 0;
    int prev = 0, next;
    for (int i = count; i >= 0; --i) {
        next = getArabNumber(array[i]);
        if (prev > next) {
            res = (res - prev) + (prev - next);
        } else {
            res += next;
        }
        prev = next;
 
    }
    return res;
}
 
bool checkSequence(const char romanNumeral[], const int &actualSize) {
    int substrResult = 0;
 
    for (int i = actualSize - 1; i >= 0; --i) {
        if (i > 1) {
            /*исключаем последовательности типа:  VXV, IVI, XLX, LCL, LXL, VIV, DCD */
            if (romanNumeral[i] == romanNumeral[i - 2] && romanNumeral[i] != romanNumeral[i - 1]) {
                if (getArabNumber(romanNumeral[i - 1]) % getArabNumber(romanNumeral[i]) == 0
                        || getArabNumber(romanNumeral[i]) / getArabNumber(romanNumeral[i - 1]) == 5) {
                    return false;
                }
                /*исключаем последовательности типа:  IVV, IXX, XLL, XCC, CDD, CMM */
            } else if (romanNumeral[i] == romanNumeral[i - 1]) {
                if (getArabNumber(romanNumeral[i - 2]) < getArabNumber(romanNumeral[i - 1])) {
                    return false;
                }
            }
        }
        if (substrResult > 0 && getArabNumber(romanNumeral[i]) <= substrResult) {
            //cout << "3" << endl;
            return false; //цифра следующая слева от пары требующей вычитания должна быть
                          //больше разности
        } else {
            //cout << "4" << endl;
            if (i > 0) { //двишаемся далее по массиву для обработки следующей пары (если такая есть)
                //cout << "5" << endl;
                --i;
                //cout << romanNumeral[i] << " " <<  romanNumeral[i + 1] << endl;
                if (getArabNumber(romanNumeral[i]) < getArabNumber(romanNumeral[i + 1])) {
                    substrResult = getSubtractingSequence(romanNumeral[i], romanNumeral[i + 1]);
                    if (substrResult == -1) {
                        return false;
                    }
                }
            }
        }
    }
    return true;
}
 
/*При вычитании допустимы только следующие
 * последовательности
 * IV (4), IX(9), XL(40), XC(90), CD(400), CM(900)
 */
int getSubtractingSequence(const char&left, const char&right) {
    int result;
    //cout << "getsub "<< left << " " <<  right << endl;
    result = getArabNumber(right) - getArabNumber(left);
    if (result == 900 || result == 400 || result == 90 || result == 40 || result == 9 || result == 4) {
        return result;
    }
    return -1;
}
 
/* Читаем строку. Проверяем на наличие цифры повторящейся
 * более трех раз подряд и корректность символа
 * Если все прошло успешно то функция заполняет массив и
 * возвращает true
 * !!! эта функция меняет значение размера массива
 */
bool getRomanNumeral(char romanNumeral[], int &maxSize) {
char ch;
int recurrenc = 1;
 
for (int i = 0; i < maxSize; ++i) { //идем по строке пока позволяет размер массива
    ch = cin.get();
    if (isCorrectLetter(ch) || ch == '\n') { //корректен ли символ
        if (i > 0) {
            if (romanNumeral[i - 1] == ch) { //если предыдущий символ равен текущему
                recurrenc++;
                if (recurrenc == 4) { //достигнут недопустимый предел повторений
                //cout << "UPS!";
                    cin.clear();
                    cin.ignore(1000, '\n');
                    return false;
                }
            } else {
                recurrenc = 1;
            }
        }
        if (ch == '\n') { //если достигнут конец строки
            romanNumeral[i] = '\0'; //то закрываем массмв char
            maxSize = i; //и выходим из цикла
        } else {
            romanNumeral[i] = ch;
        }
    } else {
        //cout << "UPS!";
        cin.clear();
        cin.ignore(1000, '\n');
        return false;
    }
    }
return true;
}
 
//return roman digit arabic equivalent
int getArabNumber(const char &rimNumber) {
 switch (rimNumber) {
 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;
 }
 return 0;
}
 
//check if provided roman digit is correct
bool isCorrectLetter(const char &letter) {
 const int size = 7;
 char mySymbols[size] = { 'I', 'V', 'X', 'L', 'C', 'D', 'M' };
 for (int i = 0; i < size; ++i) {
    if (letter == mySymbols[i]) {
        return true;
    }
 }
 return false;
}
 
Текущее время: 09:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru