Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Считать строки из файла, найти строки на определённую букву http://www.cyberforum.ru/cpp-beginners/thread1631293.html
По заданию нужно вывести данные студентов, чьи фамилии начинаются на А и математику сдали на 8 или 9. Проблема в поиске фамилии на А, сначала показывает, что стек переполнен, потом -...
C++ LNK2019 шаблон классов
Доброго времени суток. Пишу шаблон классов: akima.h // файл объявления #ifndef AKIMA_H #define AKIMA_H template<class T>
проверить правильность кода C++
#include <iostream> #include <map> using namespace std; int main() { map <string,int> myMap = {{ "Beta", 2 }, ///явная инициализация map { "Alpha", 1 }, ...
C++ Реализовать обработку линейных списков в едином адресном пространстве с последовательным распределением памяти Здравствуйте, форумчане! Решаю задачку по с++ и не уверен, что понимаю до конца условие. Прошу помощи. Условие: Разработать и отладить программу, выполняющую обработку нескольких линейных... http://www.cyberforum.ru/cpp-beginners/thread1631241.html
C++ Вывод из вектора самого короткого и самого длинного string значения http://www.cyberforum.ru/cpp-beginners/thread1631210.html
Вывод из вектора самого короткого и самого длинного string значения Подскажите как таковое сделать, если кому не трудно сможете ли вы написать код основываясь на только знаниях из учебника Эндрю...
Парсер/счётчик строки на основе stack/deque C++
Дан фрагмент последовательности скобок, состоящей из символов (){}. Требуется определить, возможно ли продолжить фрагмент в обе стороны, получив корректную последовательность. Если возможно -...
Загвоздка с реализацией метода простых итераций C++
Народ. Нашел тут реализацию метода простых итераций для решения уравнения. Проверил. Все отлично работает. Только не могу понять одного: зачем нужна переменная L ? Да, я понимаю, что на нее...
C++ Компиляция простейшего кода на C++ под GNU/Linux Проблема в компиляции простейшего кода на c++ под Linux: void hello(){ rintf("Hello!\n"); return 0; } Вот такая вот ошибка в терминале: http://www.cyberforum.ru/cpp-beginners/thread1631173.html
C++ Хранение и инициализация объектов классов в текстовом файле http://www.cyberforum.ru/cpp-beginners/thread1631171.html
Нужно сделать сохранение параметров объектов классов Rectangle, Rhomb и Circle с последующим восстановлением в vector<Shape*> shapes. Выведены только параметры: class Shape { protected: int...
C++ Перевод (конвертация, переписывания и т.д.) с С# на С++ Доброе время суток! Ребят столкнулся с такой проблемой, имеем искохник на C#, программа хорошая (играет музыку с vk с очень хорошим дизайном) но так как я сижу под мак, и проект с открытым кодом,... http://www.cyberforum.ru/cpp-beginners/thread1631126.html
IDmikael
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 20
0

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

04.01.2016, 12:22. Просмотров 267. Ответов 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");
}


в перегруженных + и - результат тоже не возвращается, но я их в самой функции через сиаут вывел, поэтому работает

Вернуться к обсуждению:
Класс "Длинных чисел"(найти причины и способы устранения ошибки) - C++
0
QA
Эксперт
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
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru