Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
1

Помогите разобраться с кодом. Класс, описывающий длинное вещественное число.

04.04.2012, 01:25. Показов 1762. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#include <deque>
#include <string>
#include <algorithm>
#include <vector>
 
using namespace std;
 
// Класс, описывающий длинное вещественное число
class LongNumber
{
public:
    // Контейнер, содержащия цифры в десятичной записи числа
    deque<char> number;
    // Длина вещественной части числа
    int fraction;
    // Корректно ли число
    bool error;
    // Отрицательное ли число
    bool minus;
 
    // Конструктор класса
    LongNumber(string number)
    {
        // Устанавливаем длину вещественной части равной нулю
        fraction = 0;
        // Число корректно и не отрицательно
        error = minus = false;
        // Преобразуем число из строки во внутреннее представление
        for(int i = 0;i < number.size();++i)
            // Если символ '-'
            if(number[i] == '-')
                // Установить флаг
                minus = true;
            // Если встретился разделитель
            else if(number[i] == '.')
                // Установить длину вещественной части
                this->fraction = number.size() - i - 1;
            // Иначе
            else
                // Занести в цифру в контейнер
                this->number.push_back(number[i] - '0');
        // Удалить ведущие и конечные нули
        erase_zeros();
    }
 
    // Перегрузка оператора сравнения (без учета знака)
    int operator<=(const LongNumber &b)
    {
        // Если длина первого числа меньше второго
        if(number.size() - fraction < b.number.size() - b.fraction)
            // Вернуть единицу
            return 1;
        // Если длина первого числа больше второго
        if(number.size() - fraction > b.number.size() - b.fraction)
            // Вернуть ноль
            return 0;
        // Сравниваем посимвольно
        for(int i = 0;i < number.size() && i < b.number.size();++i)
            // Если текущие символы не равны
            if(number[i] != b.number[i])
                // Сравнить их и вернуть результат
                return number[i] <= b.number[i];
        // Вернуть единицу (цисла равны)
        return 1;
    }
 
    // Перегрузка оператора вычитания длинных чисел
    LongNumber operator-(LongNumber b)
    {
        // Создаем длинное число для результата вычитания
        LongNumber tmp("0");
        // Очищаем список цифр
        tmp.number.clear();
        // Выравниваем длину дробной части делимого
        while(fraction < b.fraction)
            number.push_back(0), fraction++;
        // Выравниваем длину дробной части делителя
        while(fraction > b.fraction)
            b.number.push_back(0), b.fraction++;
        // Задаем длину дробной части результата
        tmp.fraction = fraction;
        // Пока второе число короце первого
        while(number.size() != b.number.size())
            // Дополняем ведущими нулями второе число
            b.number.push_front(0);
        // Создаем переменную для хранения информации о заеме в старшем разряде
        int p = 0;
        // Выполняем посимвольное вычитание от младших разрядов к старшим
        for(int i = number.size() - 1;i >= 0;--i)
            // Если цифра в текущем разряде вычитаемого больше чем у уменьшаемого
            if(b.number[i] > number[i] - p)
            {
                // Производим вычитание
                tmp.number.push_front(number[i] + 10 - p - b.number[i]);
                // Указываем, что был заем в старшем разряде
                p = 1;
            }
            // Иначе
            else
            {
                // Производим вычитание
                tmp.number.push_front(number[i] - p - b.number[i]);
                // Указываем, что заем не производился
                p = 0;
            }
        // Возвращаем результат вычитания, предварительно удалив ведущие нули
        return tmp.erase_zeros();
    }
 
    // Функция, которая умножает число на 10 и прибавляет к младшему разряду цифру b
    LongNumber mult_and_add(int b)
    {
        // Помещаем цифру в конец числа
        number.push_back(b);
        // Возвращаем результат, предварительно удалив нули
        return this->erase_zeros();
    }
 
    // Удаление ведущих и конечных нулей
    LongNumber erase_zeros()
    {
        // Пока в конце числа есть ноль и длина вещественной части больше нуля
        while(number.back() == 0 && fraction > 0)
        {
            // Удаляем ноль с конца
            number.pop_back();
            // Уменьшаем длину вещественной части
            fraction--;
        }
        //  Пока в начале числа есть ноль и длина числа больше единицы
        while(number.front() == 0 && number.size() > 1)
            // Удаляем ноль с начала
            number.pop_front();
        // Если число меньше единицы, а ведущего нуля в записи нет
        if(number.size() == fraction)
            // Добавить ведущий ноль
            number.push_front(0);
        // Вернуть результат
        return *this;
    }
 
    // Преобразование длинного числа в строку
    string to_str()
    {
        // Создаем переменную для хранения результата
        string res;
        // Если чесло отрицательное
        if(minus)
            // Поместить в строку знак '-'
            res += '-';
        // Для каждого числа из списка
        for(int i = 0;i < number.size();++i)
        {
            // Если оставшаяся длин равна длине вещественной части
            if(number.size() - i == fraction)
                // Добавить к строке символ разделителя
                res += ".";
            // Добавить к результату текущую цифру
            res += '0' + number[i];
        }
        // Вернуть полученную строку
        return res;
    }
};
 
// Функция для вычисления остатка от деления a на b
LongNumber mod(LongNumber a, LongNumber b)
{
    // Создаем длинное число для результата
    LongNumber res("0");
    // Если число b - ноль
    if(b.number.size() == 1 && b.number[0] == 0)
    {
        // Установить флаг ошибки
        res.error = true;
        // Вернуть результат
        return res;
    }
    // Находим на сколько можно уменьшить дробную часть
    int shift = min(a.fraction, b.fraction);
    // Запоминаем длину дробной часли делителя
    int len = b.fraction;
    // Уменьшаем дробную часть
    a.fraction -= shift;
    // Уменьшаем дробную часть
    b.fraction -= shift;
    // Пока дробная часть второго числа не равна нулю
    while(b.fraction > 0)
    {
        // Уменьшаем дробную часть
        b.fraction--;
        // Добавляем в конец первого числа ноль
        a.number.push_back(0);
    }
    // Идем по цифрам делимого
    for(int i = 0;i < a.number.size() - a.fraction;++i)
    {
        // Дописываем в конец результата текущую цифру 
        res.mult_and_add(a.number[i]);
        // Пока делитель меньше либо равен результату
        while(b <= res)
            // Вычитаем из результата делитель
            res = res - b;
    }
    // Идем по цифрам дробной части делимого
    for(int i = a.number.size() - a.fraction;i < a.number.size();++i)
        // Дописываем их к результату
        res.number.push_back(a.number[i]);
    // Устанавливаем длину дробной части результата
    res.fraction = a.fraction + len;
    // Если делимое и делитель отрицательны
    if(a.minus && b.minus)
        // Результат отрицательный
        res.minus = true;
    // Если делимое отрицательное
    else if(a.minus)
        // Результат равен разности делителя и текущего результата
        res = b - res;
    // Если делитель отрицательный
    else if(b.minus)
    {
        // Результат равен разности делителя и текущего результата
        res = b - res;
        // Со знаком минус
        res.minus = true;
    }
    // Вернуть результат, убрав ненужные нули
    return res.erase_zeros();
}
 
// Функция для нахождения остатков набора пар чисел
vector<LongNumber> calculate(vector<pair<LongNumber, LongNumber> > data)
{
    // Создаем контейнер для хранения результата
    vector<LongNumber> result;
    // Для каждой пары из набора
    for(int i = 0;i < data.size();++i)
        // Найти остаток и поместить его в результат
        result.push_back(mod(data[i].first, data[i].second));
    // Вернуть результат
    return result;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.04.2012, 01:25
Ответы с готовыми решениями:

Помогите разобраться с кодом.
Здравствуйте. Я написал код, который обрабатывает кнопки с пульта ДУ сэмулировал всё в Аврстудио...

Помогите с кодом разобраться
Всем привет. Подскажите, где ошибся? Код в контроллер заливается, но с предупреждением &quot;integer...

Помогите разобраться с кодом
Поймите меня правильно! Мне реально больше не у кого спросить и негде прочитать! Купил уже около 10...

Помогите Разобраться С Кодом
В общем я в этой сфере совсем недавно, так что я многого не знаю :D Мне нужно чтобы в wordе...

17
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
04.04.2012, 03:07 2
Ну наверное кроме кода надо и вопрос задать. Я пока вижу, что ты написал код, прокомментировал его и скорее всего и без нас в нём неплохо разбираешься
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 08:34  [ТС] 3
эта программа должна находить остаток от деления дробных чисел.Как реализуется деление столбиком на с++?как реализовано деление в данном коде?я не могу понять, они работают с массивами со строками?Если число очень большое, оно же не поместится не в один тип переменных, а а вот в этом коде это реализовано по другому...можете объяснить плиз.
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
04.04.2012, 08:43 4
Цитата Сообщение от rovel Посмотреть сообщение
Если число очень большое, оно же не поместится не в один тип переменных, а а вот в этом коде это реализовано по другому...можете объяснить плиз
класс видимо не вы писали, Класс, описывающий длинное вещественное число
C++
1
2
// Контейнер, содержащия цифры в десятичной записи числа
    deque<char> number;
вы хоть комментарии прочитали к коду? у вас там все написано
число хранится через дек
1
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 08:48  [ТС] 5
Каким образом они хранятся в дек?Под числа выделяется определенная память?или как?Дек как я понял, это контейнер, и он работает с памятью?
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
04.04.2012, 09:31 6
Цитата Сообщение от rovel Посмотреть сообщение
Каким образом они хранятся в дек?Под числа выделяется определенная память?или как?Дек как я понял, это контейнер, и он работает с памятью?
структура данных, в которой элементы можно добавлять и удалять как в начало, так и в конец
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
04.04.2012, 11:21 7
Цитата Сообщение от rovel Посмотреть сообщение
Каким образом они хранятся в дек?Под числа выделяется определенная память?или как?Дек как я понял, это контейнер, и он работает с памятью?
дек это двусторонняя очередь, тут используется std::deque, докуметацию читайте в интернете
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 20:13  [ТС] 8
можете объяснить, как в этой программе реализован алгоритм деления столбиком?
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
04.04.2012, 20:22 9
Цитата Сообщение от rovel Посмотреть сообщение
можете объяснить, как в этой программе реализован алгоритм деления столбиком?
тут остаток от деления, алгоритм у вас написан в комментариях, извольте прочитать
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 20:27  [ТС] 10
в этой программе используют векторы какие-то?Мы эти огромные числа где храним?
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
04.04.2012, 20:35 11
Цитата Сообщение от rovel Посмотреть сообщение
в этой программе используют векторы какие-то?Мы эти огромные числа где храним?
deque<char> number;
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 20:44  [ТС] 12
зачем вот это нужно , и что это значит "Перегрузка оператора сравнения (без учета знака)"," Перегрузка оператора вычитания длинных чисел"?я не слышал вообще про перегрузку
0
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
04.04.2012, 21:02 13
Цитата Сообщение от rovel Посмотреть сообщение
зачем вот это нужно , и что это значит "Перегрузка оператора сравнения (без учета знака)"," Перегрузка оператора вычитания длинных чисел"?я не слышал вообще про перегрузку
вы хотя бы книжку или руководство по языку с++ прочитайте, все вопросы отпадут, не ленитесь
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 21:07  [ТС] 14
просто понимаете у меня времени не много...мне надо разобраться в этом коде, до следующей недели!

Добавлено через 34 секунды
и поэтому мне нужна помощь ваша.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
04.04.2012, 21:10 15
Цитата Сообщение от rovel Посмотреть сообщение
просто понимаете у меня времени не много...мне надо разобраться в этом коде, до следующей недели!
Ну изучай Си++, чем тут ещё поможешь
В сутках 24 часа. До следующей недели 4.5 суток или 108 часов
Вполне реально изучить Си++ хотя бы перегрузку операторов.
Иначе, тебя любой нормальный экзаменатор завалит.
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 21:31  [ТС] 16
ну в какой книге про это подробно написано?чтобы я успел прочитать, и понять...

Добавлено через 11 минут
Ну скажите мне , что в данной программе значит перегрузка операторов?зачем это надо?А книгу я прочитаю...
0
347 / 292 / 37
Регистрация: 23.03.2012
Сообщений: 838
04.04.2012, 21:35 17
Цитата Сообщение от rovel Посмотреть сообщение
Ну скажите мне , что в данной программе значит перегрузка операторов?зачем это надо?
http://lmgtfy.com/?q=%D0%BF%D0... 1%81%2B%2B
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
04.04.2012, 21:39 18
Цитата Сообщение от rovel Посмотреть сообщение
ну в какой книге про это подробно написано?чтобы я успел прочитать, и понять...

Добавлено через 11 минут
Ну скажите мне , что в данной программе значит перегрузка операторов?зачем это надо?А книгу я прочитаю...
Ну хотя бы вот.
http://www.cyberguru.ru/progra... age51.html
От этого легче? Думаю прочитать одну главу из Страуструпа ты сможешь.
0
04.04.2012, 21:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.04.2012, 21:39
Помогаю со студенческими работами здесь

Помогите разобраться с кодом
Здраствуйте, уважаемие учасники форума! Не знаю в чем проблема, но задолбался я уже... Имееться...

Помогите разобраться с кодом
Есть прога: .model tiny ;буддем создавать com-файл .186 ;чтобы можно было было использовать...

Помогите разобраться с кодом
Народ!!! Помогите срочно!!! У меня скоро экзамен по инфе, а через 2 дня прогу надо показывать... ...

Помогите разобраться с кодом
Код - проверка ввода данных. Если вводиться &quot;x6x&quot;, то вызывается исключение, правильным вводом...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru