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

Класс "Длинных чисел"(найти причины и способы устранения ошибки) - C++

04.01.2016, 12:22. Просмотров 259. Ответов 3

Всем привет) вот такая проблема: не возвращаются значения операций умножение и деление. Тоесть считается все нормально, в результирующем векторе то, что нужно, а в мэйн не возвращает. И еще, пытаюсь записать это дело в файл, как это делать не знаю, нашел прототип, но пишет "выражение должно иметь тип класса". помогите, пожалуйста, заранее спасибо!

Кликните здесь для просмотра всего текста
хедер
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 &);
    void outputvf(deque <int> vector, ofstream &f);
private:
    deque <int> vector;
    char znak;
    int A, B, C = 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
#include "ClassLong.h"
#include <fstream>
#include <deque>
 
using namespace std;
Longnum::Longnum()
{
//дефолтный конструктор
}
 
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 = '-';
    for (int i = 0; i<proisv.vector.size(); i++)
    {
        cout << proisv.vector.at(i);
    }
    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 = '-';
    for (int i = 0; i<chastnoe.vector.size(); i++)
    {
        cout << chastnoe.vector.at(i);
    }
    return chastnoe;
 
}
Longnum Longnum::operator+(Longnum &other)
{
//перегруженный плюс работает нормально
}
Longnum Longnum::operator-(Longnum &other)
{
//перегруженный минус работает нормально
}
Longnum &Longnum::operator=(Longnum &other)
{
    for (int i = 0; i < vector.size(); i++)
    {
        vector.at(i) = other.vector.at(i);
    }
    return *this;
}
void Longnum::outputvf(deque <int> vector, ofstream &f)
{
    ofstream file("vector.txt");
    int i;
    for (i = 0; i<vector.size(); i++)
    {
        file << vector.at(i).toString() << endl;
    }
    file.close();
    }


Кликните здесь для просмотра всего текста
мэйн
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
#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 << "7 – выйти из программы\n";
        cout << "->";
        cin >> x;
        switch (x)
        {
        case 1:
        {
//тут все хорошо        }
        case 2:
        {
//тут все хорошо
        }
        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:
        {
//новые числа
        }
 
        case 6:
        {
                  cout << "запись в файл:" << endl;
        }
        case 7:
        {
            bool flag = false;
            break;
        }
        default:
        {
                   cout << "\nОшибка ввода, повторите процедуру!";
        }
        }
    }
 
    system("pause");
}


в перегруженных + и - результат тоже не возвращается, но я их в самой функции через сиаут вывел, поэтому работает
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2016, 12:22
Ответы с готовыми решениями:

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

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

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

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

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

3
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
04.01.2016, 12:54 2
снова ты....
все оно возвращает, просто ты не знаешь чего хочешь, и объяснить не можешь.
0
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
04.01.2016, 12:56  [ТС] 3
Цитата Сообщение от _Valera_ Посмотреть сообщение
все оно возвращает, просто ты не знаешь чего хочешь, и объяснить не можешь.
если оно возвращает, почему тогда у меня 0 в векторе получается?
нет, чтоб нормально ответить, надо поиздеваться еще
0
_Valera_
490 / 372 / 136
Регистрация: 27.01.2015
Сообщений: 1,588
04.01.2016, 13:19 4
Цитата Сообщение от IDmikael Посмотреть сообщение
Longnum(long1, "0123456789");
я такого еще не видел, и работает....

Цитата Сообщение от IDmikael Посмотреть сообщение
Тоесть считается все нормально, в результирующем векторе то, что нужно, а в мэйн не возвращает
Я скачал твой Гкод и запустил - твои функции не работают. И возвратило оно то что и посчитало!
0
04.01.2016, 13:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2016, 13:19

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

Найти причины и способы исправления ошибки 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...


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

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

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