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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.88
rovel
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 25
04.04.2012, 01:25     Помогите разобраться с кодом. Класс, описывающий длинное вещественное число. #1
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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2012, 01:25     Помогите разобраться с кодом. Класс, описывающий длинное вещественное число.
Посмотрите здесь:

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

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

Добавлено через 11 минут
Ну скажите мне , что в данной программе значит перегрузка операторов?зачем это надо?А книгу я прочитаю...
Nekto
342 / 287 / 10
Регистрация: 23.03.2012
Сообщений: 838
04.04.2012, 21:35     Помогите разобраться с кодом. Класс, описывающий длинное вещественное число. #17
Цитата Сообщение от rovel Посмотреть сообщение
Ну скажите мне , что в данной программе значит перегрузка операторов?зачем это надо?
http://lmgtfy.com/?q=%D0%BF%D0%B5%D1...2+%D1%81%2B%2B
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2012, 21:39     Помогите разобраться с кодом. Класс, описывающий длинное вещественное число.
Еще ссылки по теме:

Создать классы, описывающий прямоугольники и класс-наследник, описывающий прямоугольные параллепипеды C++
C++ Класс: Вещественное число, записанное с точкой
Помогите разобраться с кодом (что делает программа?) C++

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
04.04.2012, 21:39     Помогите разобраться с кодом. Класс, описывающий длинное вещественное число. #18
Цитата Сообщение от rovel Посмотреть сообщение
ну в какой книге про это подробно написано?чтобы я успел прочитать, и понять...

Добавлено через 11 минут
Ну скажите мне , что в данной программе значит перегрузка операторов?зачем это надо?А книгу я прочитаю...
Ну хотя бы вот.
http://www.cyberguru.ru/programming/...p3-page51.html
От этого легче? Думаю прочитать одну главу из Страуструпа ты сможешь.
Yandex
Объявления
04.04.2012, 21:39     Помогите разобраться с кодом. Класс, описывающий длинное вещественное число.
Ответ Создать тему
Опции темы

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