Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
1

Класс "Длинных чисел", основные арифметические операции (найти причины и способы устранения ошибки)

03.01.2016, 01:35. Просмотров 364. Ответов 16

Всем привет помогите пожалуйста решить проблему: делаю класс длинных чисел, обязательно нужно использовать конструкторы(по умолчанию, с параметрами и копирования), а так же осуществить основные арифметические операции с этими числами. Все операции прописал, но что-то пошло не так и не возвращается их результат.
Уже часа 3 сижу, не могу понять ошибку. Вот код:
Кликните здесь для просмотра всего текста
Файл ClassLong.h
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
#include <iostream>
#include <deque>
#include <string>
using namespace std;
 
 
class Longnum
{
public:
    void vector_print(Longnum&);
    int sravnenie(Longnum&, Longnum&);
    Longnum();
    Longnum(Longnum&, string);
    Longnum(Longnum&);
    //~Longnum();
    Longnum dell_null(Longnum&);
    Longnum proisvedenie(Longnum&, Longnum&);
    Longnum delenie(Longnum, Longnum);
    Longnum operator+ (Longnum&);
    Longnum operator- (Longnum&);
    Longnum &operator= (Longnum &);
private:
    deque <int> vector;
    char znak;
    int A, B, C = 0;
    int size;
};

Кликните здесь для просмотра всего текста
ClassLong.cpp
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
243
244
245
246
247
248
249
250
251
#include "ClassLong.h"
#include <deque>
 
using namespace std;
Longnum::Longnum()
{
    cout << "Default constructor" << endl;
}
 
Longnum::Longnum(Longnum &big, string temp)
{
    string minus= "-";
    string str;
    cin >> str;
    if (str.at(0) == minus.at(0)) big.znak = '-';
    for (int i = 0; i<(int)str.length(); i++)
    for (int j = 0; j < 10; j++)
    if (str.at(i) == temp.at(j)) 
        big.vector.push_back(j);
}
void Longnum::vector_print(Longnum &big)
{
    big = dell_null(big);
    if (big.vector.size() == 1 && big.vector.at(0) == ' ') { big.znak = ' '; cout << big.znak; }
    if (big.znak == '-')
        cout << big.znak;
    for (int i = 0; i < big.vector.size(); i++)
        cout << (int)big.vector.at(i);
}
Longnum::Longnum(Longnum& big)
{
    vector.clear();
    for (int i = 0; i < big.vector.size(); i++)
        vector.push_back(big.vector[i]);
}
int Longnum::sravnenie(Longnum &big1, Longnum &big2)
{
    if (big1.vector.size() > big2.vector.size()) return 1; // 1, еслипервоечисло > второго
    if (big1.vector.size() < big2.vector.size()) return -1; // -1, еслипервоечисло < второго
    if (big1.vector.size() == big2.vector.size())
    {
        for (int i = 0; i < (int)big1.vector.size(); i++)
        {
            if (big1.vector.at(i) > big2.vector.at(i)) return 1;
            if (big1.vector.at(i) < big2.vector.at(i)) return -1;
        }
        return 0; // 0, если числа равны
    }
}
Longnum Longnum::dell_null(Longnum &big)
{
    while (big.vector.size()>1)
    {
        if (big.vector.at(0) != 0) break;
        else (big.vector.pop_front());
    }
    return big;
}
Longnum Longnum::proisvedenie(Longnum &big1, Longnum &big2)
{
    Longnum proisv;
    proisv.vector.push_back(0);
    Longnum reserv;
    Longnum reserv2;
    for (int i = big1.vector.size() - 1, count = 0; i >= 0; i--, count++)
    {
        if (big1.vector.at(i) == 0) {} // умножениена 0
        else
        if (big1.vector.at(i) == 1) // умножение на 1, просто прибавляем число с «добитыми» нулями
        {
            reserv2.vector = big2.vector;
            for (int k = 0; k < count; k++) // добиваем нулями в зависимости от разряда умножения
                reserv2.vector.push_back(0);
            proisv = reserv2 + proisv;
        }
        else
        {
            int temp = 0;
            for (int k = 0; k < count; k++) // добиваемнулями
                reserv.vector.push_front(0);
            for (int j = big2.vector.size() - 1; j >= 0; j--) // умножаемпервоечислона«цифру» изразрядаучитывая temp
            {
                reserv.vector.push_front((big1.vector.at(i)*big2.vector.at(j) + temp) % 10);
                if ((big1.vector.at(i)*big2.vector.at(j) + temp) >= 10) temp = (big1.vector.at(i)*big2.vector.at(j) + temp) / 10; else temp = 0;
            }
            if (temp != 0) reserv.vector.push_front(temp); // приувеличенииразрядовчисла
            proisv = reserv + proisv; // складываем предыдущие результаты
            reserv.vector.clear();
        }
    }
    if (big1.znak != big2.znak)
        proisv.znak = '-';
    return proisv;
 
}
Longnum Longnum::delenie(Longnum delimoe, Longnum delitel)
{
    znak = ' ';
    Longnum chastnoe;
    Longnum ostatok;
    Longnum reserv2;
    Longnum reserv3;
    reserv2.vector = delitel.vector;
    for (int i = 0; i < (int)delimoe.vector.size(); i++)
    {
        ostatok = dell_null(ostatok);
        ostatok.vector.push_back(delimoe.vector.at(i)); // промежуточныйостаток
        if (sravnenie(ostatok, delitel) == -1) { chastnoe.vector.push_back(0); } // покапромежуточныйостатокбольшеделителяпишемвчастное 0
        else
        {
            for (int j = 0; j < 10; j++) // цикл, формирующий цифры частного
            {
                if (sravnenie(ostatok, reserv2) == -1) // промежуточный остаток меньше делителя*j
                {
                    chastnoe.vector.push_back(j);
                    ostatok = ostatok - reserv3;
                    reserv2.vector = delitel.vector;
                    break;
                }
                if (sravnenie(ostatok, reserv2) == 0) // промежуточныйостатоккратныйделителю
                {
                    chastnoe.vector.push_back(j + 1);
                    ostatok.vector.clear();
                    reserv2.vector = delitel.vector;
                    break;
                }
                reserv3 = reserv2;
                reserv2 = reserv2 + delitel; // прибавляем сам делитель, пока не станет больше остатка
            }
        }
    } // цифры делимого заканчиваются и остаток меньше делимого, цикл завершается
    if (delimoe.znak != delitel.znak) chastnoe.znak = '-';
    return chastnoe;
 
}
Longnum Longnum::operator+(Longnum &other)
{
    Longnum result;
    int temp = 0; // 1 для добавления к старшему разряду
    int metka = 0; // для вычисления позиции, с которой остаются разряды только одного числа
    if (vector.size() >= other.vector.size())
    {
        for (int i = vector.size() - 1, j = other.vector.size() - 1; j >= 0; i--, j--)
        {
            result.vector.push_front((vector.at(i) + other.vector.at(j) + temp) % 10);
            if ((vector.at(i) + other.vector.at(j) + temp) > 10) temp = 1; else temp = 0;
            metka = i;
        }
        for (int i = metka - 1; i >= 0; i--)
        {
            result.vector.push_front((vector.at(i) + temp) % 10);
            if ((vector.at(i) + temp)>10) temp = 1; else temp = 0;
        }
        if (temp == 1) result.vector.push_front(1);
    }
    else //на слуйчай, если первое число меньше по размеру, чем второе, то ставим его на второе место;
    {
        for (int i = other.vector.size() - 1, j = vector.size() - 1; j >= 0; i--, j--)
        {
            result.vector.push_front((other.vector.at(i) + vector.at(j) + temp) % 10);
            if ((other.vector.at(i) + vector.at(j) + temp) > 10) temp = 1; else temp = 0;
            metka = i;
        }
        for (int i = metka - 1; i >= 0; i--)
        {
            result.vector.push_front((other.vector.at(i) + temp) % 10);
            if ((other.vector.at(i) + temp)>10) temp = 1; else temp = 0;
        }
        if (temp == 1) result.vector.push_front(1);
    }
    return result;
}
Longnum Longnum::operator-(Longnum &other)
{
    if (vector.size() > other.vector.size()) { A = 1; }
    if (vector.size() < other.vector.size()) { B = 1; }
    if (vector.size() == other.vector.size())
    {
        for (int i = (int)vector.size() - 1; i <= 0; --i)
        {
            if (vector.at(i)>other.vector.at(i)){ A = 1; }
            if (vector.at(i) < other.vector.at(i)){ B = 1; }
            if (vector.at(i) == other.vector.at(i)){ C = 1; }
        }
    }
    if (vector.at(0) == '-') { znak = ' '; cout << znak; }
    else znak = '-'; cout << znak;
    int temp = 0;
    int metka = 0;
    Longnum result;
    if (A == 1)
    {
        for (int i = vector.size() - 1, j = other.vector.size() - 1; j >= 0; i--, j--)
        {
            if ((vector.at(i) - other.vector.at(j) + temp) >= 0)
            {
                result.vector.push_front((vector.at(i) - other.vector.at(j) + temp));
                temp = 0;
            }
            else
            {
 
                result.vector.push_front(vector.at(i) - other.vector.at(j) + temp + 10);
                temp = -1;
            }
            metka = i;
        }
        for (int i = metka - 1; i >= 0; i--)
        {
            result.vector.push_front(abs((vector.at(i) + temp + 10) % 10));
            if ((temp == -1) && (vector.at(i) + temp < 0)) temp = -1; else temp = 0;
        }
        vector = result.vector;
        return result;
    }
    else
    {
 
        for (int i = other.vector.size() - 1, j = vector.size() - 1; j >= 0; i--, j--)
        {
            if ((other.vector.at(i) - vector.at(j) + temp) >= 0)
            {
                result.vector.push_front((other.vector.at(i) - vector.at(j) + temp));
                temp = 0;
            }
            else
            {
 
                result.vector.push_front(other.vector.at(i) - vector.at(j) + temp + 10);
                temp = -1;
            }
            metka = i;
        }
        for (int i = metka - 1; i >= 0; i--)
        {
            result.vector.push_front(abs((other.vector.at(i) + temp + 10) % 10));
            if ((temp == -1) && (other.vector.at(i) + temp < 0)) temp = -1; else temp = 0;
        }
        other.vector = result.vector;
        return result;
    }
 
}
Longnum &Longnum::operator=(Longnum &other)
{
    for (int i = 0; i < vector.size(); i++)
    {
        vector.at(i) = other.vector.at(i);
    }
    return *this;
}


Кликните здесь для просмотра всего текста
Main.cpp
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
#include <clocale>
#include <iostream>
#include "ClassLong.h"
 
using namespace std;
 
void main()
{
    setlocale(LC_ALL, "Russian");
    
    int x;
    bool flag = true;
    Longnum long1, long2, summa, razn, proiz, chastn;
    cout << "Введите 1 число" << endl;
    Longnum(long1, "0123456789");
    cout << "Введите 1 число" << endl;
    Longnum(long2, "0123456789");
    cout << "Ваши числа:" << endl;
    cout << endl;
    cout << "Число №1:";
    long1.vector_print(long1);
    cout << endl; 
    cout << "Число №2:";
    long2.vector_print(long2);
    while (flag == true)
    {
        cout << "\n\nВведите номер операции : \n";
        cout << "1 – сложение чисел \n";
        cout << "2 – разность чисел \n";
        cout << "3 – умножение чисел \n";
        cout << "4 – деление чисел \n";
        cout << "5 – ввести новые числа\n";
        cout << "6 – выйти из программы\n";
        cout << "->";
        cin >> x;
        switch (x)
        {
        case 1:
        {
                  cout << "\nСумма чисел:";
                  long1 + long2 = summa;
                  summa.vector_print(summa);
                  break;
        }
        case 2:
        {
                  cout << "\nРазность чисел:";
                  razn = long1 - long2;
                  razn.vector_print(razn);
                  break;
        }
        case 3:
        {
                  cout << "\nПроизведение чисел:";
                  proiz = proiz.proisvedenie(long1, long2);
                  proiz.vector_print(proiz);
                  break;
        }
        case 4:
        {
                  cout << "\nДеление чисел:";
                  chastn = chastn.delenie(long1, long2);
                  chastn.vector_print(chastn);
                  break;
        }
        case 5:
        {
                  long1 = Longnum();
                  cout << "Введите 1 число" << endl;
                  Longnum(long1, "0123456789");
                  long1.vector_print(long1);
                  long2 = Longnum();
                  cout << "Введите 2 число" << endl;
                  Longnum(long2, "0123456789");
                  long2.vector_print(long1);
        }
        case 6:
        {
                  bool flag = false;
                  break;
        }
        default:
        {
                   cout << "\nОшибка ввода, повторите процедуру!";
        }
        }
    }
 
    system("pause");
}


Не ругайтесь, пожалуйста, если увидите там недочеты, типа знак неправильно выводит и т.п., ибо в силу абсолютно непредвиденных обстоятельств делаю эту лабу 2 день
заранее большое спасибо!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2016, 01:35
Ответы с готовыми решениями:

Класс "Длинных чисел"(найти причины и способы устранения ошибки) - C++
Всем привет) вот такая проблема: не возвращаются значения операций умножение и деление. Тоесть...

Реализовать класс "Длинных чисел" (найти причины и способы устранения ошибки)
Всем привет:) помогите пожалуйста решить проблему: делаю класс длинных чисел, обязательно нужно...

Найти причины и способы устранения ошибки
Во время откладки указатель на число выдает мусор типо -81791524 #include &lt;stdlib.h&gt; #include...

Найти причины и способы исправления ошибки "Segmentation fault" в заданном коде
Здравствуйте. С языком c++ и программировании в целом только знакомлюсь. Получил задание написать...

Найти причины и способы исправления ошибки "error C2065: необъявленный идентификатор"
имеется f1.h typedef struct { int some; } tStruct; f2.h

16
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
03.01.2016, 02:53 2
Цитата Сообщение от IDmikael Посмотреть сообщение
делаю эту лабу
хорошее задание для лабы!

какая операция не возвращает? Код большой искать лень..
0
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
03.01.2016, 03:03  [ТС] 3
да, помимо этого, нужно еще это сделать с наследованием, перегрузкой операторов [], ->, желательно с дружественными функциями, псевдо переменными, вводом/выводом в/из файла, создать файл библиотеки(.либ).

Цитата Сообщение от _Valera_ Посмотреть сообщение
какая операция не возвращает?
все, но, думаю, проблема одна, если ее решить, то и все остальное заработает. просто я такое сложное еще не делал, мне трудновато в таком для меня огромном количестве всего ее найти
кстати, я все операции проверил, все считает правильно(в результирующий вектор записывается то, что надо), а вот, когда доходит дело до его вывода в мэйне он почему-то обнуляется и мне выскакивает только дефолтный конструктор...
0
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
03.01.2016, 03:08 4
Цитата Сообщение от IDmikael Посмотреть сообщение
все,
как ты понял что оно не возвращает?
0
03.01.2016, 03:08
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
03.01.2016, 03:10  [ТС] 5
Цитата Сообщение от _Valera_ Посмотреть сообщение
как ты понял что оно не возвращает?
ну, я его через ф10 все поклацал, смотрю - считает все хорошо, записывает в результат все хорошо, а когда доходит до мэйна - в векторе 0...
я не знаю, мб он все возвращает, но или не туда, или что-то не то
0
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
03.01.2016, 03:13 6
Цитата Сообщение от IDmikael Посмотреть сообщение
ну, я его через ф10 все поклацал, смотрю - считает все хорошо, записывает в результат все хорошо, а когда доходит до мэйна - в векторе 0...
я не знаю, мб он все возвращает, но или не туда, или что-то не то


Цитата Сообщение от IDmikael Посмотреть сообщение
long1 + long2 = summa;
действительно.... удали это пока никто не видел
0
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
03.01.2016, 03:16  [ТС] 7
Цитата Сообщение от _Valera_ Посмотреть сообщение
действительно.... удали это пока никто не видел
это я экспериментировал)
0
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
03.01.2016, 03:17 8
Цитата Сообщение от IDmikael Посмотреть сообщение
это я экспериментировал)
заработало?
0
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
03.01.2016, 03:19  [ТС] 9
Цитата Сообщение от _Valera_ Посмотреть сообщение
заработало?
как видишь, нет, так бы я не просил помощи
0
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
03.01.2016, 03:20 10
Цитата Сообщение от IDmikael Посмотреть сообщение
как видишь, нет, так бы я не просил помощи
сделай сиауты и покажи что оно выводит на экран
1
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
03.01.2016, 03:24  [ТС] 11
как то так...
0
Миниатюры
Класс "Длинных чисел", основные арифметические операции (найти причины и способы устранения ошибки)  
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
03.01.2016, 03:26 12
Цитата Сообщение от IDmikael Посмотреть сообщение
как то так..
ну 444 вывело что еще надо?
0
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
03.01.2016, 03:32  [ТС] 13

как бы да, но просто я сделал специальную функцию
Цитата Сообщение от IDmikael Посмотреть сообщение
void Longnum::vector_print(Longnum &big)
, через которую хотелось бы выводить это все дело... в мэйне..
та и в чем ошибка тоже интересно, я до того, как все по человечески сделать, и объявление и реализацию закинул в хедер, так вот там оно все возвращает почему-то
0
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
03.01.2016, 03:34 14
Цитата Сообщение от IDmikael Посмотреть сообщение
как бы да, но просто я сделал специальную функцию
Ты сам не знаешь чего хочешь....
0
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
03.01.2016, 03:40  [ТС] 15
Цитата Сообщение от _Valera_ Посмотреть сообщение
Ты сам не знаешь чего хочешь....
знаю, я хочу, чтобы у меня в summa возвращалось значение из result
но все равно огромное тебе спасибо! все гениальное просто
а ты случайно не подскажешь, как бы сюда еще и наследование впихнуть
0
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
03.01.2016, 03:45  [ТС] 16
Да, вот таким образом оно мне все действия выводит, а мне нужно только результат...
поэтому ж я и сделал отэту вот функцию
0
Миниатюры
Класс "Длинных чисел", основные арифметические операции (найти причины и способы устранения ошибки)  
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
03.01.2016, 03:48 17
Цитата Сообщение от IDmikael Посмотреть сообщение
Да, вот таким образом оно мне все действия выводит, а мне нужно только результат...
поэтому ж я и сделал отэту вот функцию
Цитата Сообщение от _Valera_ Посмотреть сообщение
Ты сам не знаешь чего хочешь....
и я не знаю
0
03.01.2016, 03:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2016, 03:48

Найти причины и способы исправления ошибки "Функция не является членом класса"
Хай. Вижла сошла сума, то ли я уже переработал. #pragma once #ifndef CMATRIXH # define CMATRIXH...

Найти причины и способы исправления ошибки C4700: "использована неинициализированная локальная переменная"
#include&lt;iostream&gt; #include&lt;iomanip&gt; #include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;stdlib.h&gt;...

Найти причины и способы исправления ошибок в коде (класс "Person")
Возникла проблема при изучении классов #pragma once class person { private: int age; char...


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

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

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