Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20

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

04.01.2016, 12:22. Показов 813. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2016, 12:22
Ответы с готовыми решениями:

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

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

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

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

Цитата Сообщение от IDmikael Посмотреть сообщение
Тоесть считается все нормально, в результирующем векторе то, что нужно, а в мэйн не возвращает
Я скачал твой Гкод и запустил - твои функции не работают. И возвратило оно то что и посчитало!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.01.2016, 13:19
Помогаю со студенческими работами здесь

Найти причины и способы устранения ошибки error C2678: binary '>>' : no operator found
Пожалуйста, помогите найти причины и способы устранения этой ошибки: error C2678: binary '&gt;&gt;' : no operator found which takes a...

Нюансы использования исключений: объяснить причины и способы устранения ошибки
Есть такой кусочек кода. Я хочу просмотреть всё что хранится в операционной памяти. Ну и когда я пытаюсь посмотреть что у меня лежит по...

Объянить причины возникновения и способы устранения ошибки Linker Error: unresolved external MyArray
Посмотрите пожалуйста, что не так в программе? Заранее большое спасибо. #include &lt;iostream&gt; #include &quot;array.h&quot; ...

Найти причины и способы устранения ошибок в коде
Помогите исправить ошибку. unsigned long * A4B(unsigned long*a, unsigned long*b) { unsigned long *c; c = new...

Найти причины и способы устранения ошибок в коде
Прошу Вашей помощи. Я только начинаю изучать С++. Пытаюсь создать программу а он выдает ошибки 1&gt;------ Сборка начата: проект:...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru