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

Класс полином. Сумма полиномов

04.02.2019, 22:03. Просмотров 1248. Ответов 6
Метки нет (Все метки)

В чем моя ошибка, не работает код? Не очень понятно с конструкторами, правильно или нет?
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
class Polynomial {
private:
    int size;
    double* polyn;
public:
    Polynomial() {
        size = 1;
        polyn = new double[size];
 
        for (int i = 0; i < size; i++)
            polyn[i] = 1;
    }
    Polynomial(int sz) {
        size = sz;
        polyn = new double[sz];
        for (int i = 0; i < size; i++)
            polyn[i] = 1;
    }
    Polynomial(int sz, double val) {
        size = sz;
        polyn = new double[size];
 
        for (int i = 0; i < size; i++)
            polyn[i] = val;
    }
    ~Polynomial() {
        delete[] polyn;
    }
    Polynomial(const Polynomial& P)
    {
        polyn = new double[P.size];
        for (int i = 0; i < P.size; i++)
        {
            polyn[i] = P.polyn[i];
        }
    }
 
    void GetInfo(double arr[], int sz);
    void SetP();
    void ShowP();
 
 
    Polynomial GetSum(Polynomial);
};
 
void Polynomial::GetInfo(double* arr, int sz)
{
    for (int i = 0; i < sz; i++)
        polyn[i] = arr[i];
}
void Polynomial::SetP()
{
    double p;
    cout << "Введите размер полинома\n";
    cin >> size;
    cout << "Введите значения коэффициентах при переменных\n";
    
    for (int i = 0; i < size; i++)
    {
        cin >> p;
        polyn[i] = p;
    }
}
 
void Polynomial::ShowP()
{
    for (int i = 0; i < size; i++)
    {
        cout << polyn[i] << "*";
        if (i + 1 != size)
        {
            cout << "a" << i + 1 << "^" << i;
            if (polyn[i + 1] > 0)
                cout << " +  ";
 
        } else 
            cout << "a" << i + 1 << "^" << i;
        
    }
}
Polynomial Polynomial::GetSum(Polynomial p1)
{
    if (size < p1.size)
    {
        for (int i = 0; i < size; i++)
        {
            p1.polyn[i] += polyn[i];
        }
    }
    else {
        for (int i = 0; i < p1.size; i++)
        {
            p1.polyn[i] += polyn[i];
        }
          }
 
    return p1;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Polynomial p1(3);
    Polynomial p2(3);
 
    cout << endl;
    p1.ShowP();
    cout << endl << endl;
 
    p2 = p1.GetSum(p2);
    cout << "№3 "; p2.ShowP();
    cout << endl;
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2019, 22:03
Ответы с готовыми решениями:

Переумножение полиномов, где полином оформлен в класс
Проблема решения задачи состоит в том, что когда я все сделала функциями, все работало, но...

Класс полиномов
Здравствуйте. Помогите, пожалуйста, понять, почему не работает код. Есть класс полиномов,...

Простой класс полиномов
Есть методы для умножения, сложения и производной #include &lt;iostream&gt; #include &lt;cstdlib&gt; using...

Move семантика (класс полиномов)
Доброго времени суток. Пишу простенький класс полиномов, в котором есть единственное приватное поле...

класс полиномов как переделать в динамический
Подскажите как из этого класса полиномов сделать динамический класс? //класс Polynom class...

6
L0M
904 / 467 / 237
Регистрация: 01.10.2018
Сообщений: 1,043
Завершенные тесты: 1
05.02.2019, 05:07 2
Лучший ответ Сообщение было отмечено Jagario как решение

Решение

Напутали маленько. Я там поправил.
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
#include <iostream>
#include <algorithm>
#include <cmath>
 
using namespace std;
 
class Polynomial {
private:
    int size;
    double* polyn;
public:
    Polynomial() : size(1), polyn(nullptr) {
        polyn = new double[size];
 
        for (int i = 0; i < size; i++)
            polyn[i] = 1;
    }
    Polynomial(int sz) : size(sz), polyn(nullptr) {
        polyn = new double[sz];
        for (int i = 0; i < size; i++)
            polyn[i] = 1;
    }
    Polynomial(int sz, double val) : size(sz), polyn(nullptr) {
        polyn = new double[size];
 
        for (int i = 0; i < size; i++)
            polyn[i] = val;
    }
    ~Polynomial() {
        delete[] polyn;
    }
    Polynomial(const Polynomial& P) : size(P.size), polyn(nullptr) {
        polyn = new double[P.size];
        for (int i = 0; i < P.size; i++) {
            polyn[i] = P.polyn[i];
        }
    }
 
    Polynomial & operator=(const Polynomial & rp) {
        delete[] polyn;
        size = rp.size;
        polyn = new double[size];
        for (int i = 0; i < size; ++i)
            polyn[i] = rp.polyn[i];
        return *this;
    }
 
    void GetInfo(double* arr, int sz);
    void SetP();
    void ShowP();
 
 
    friend Polynomial operator+(const Polynomial & lp, const Polynomial & rp);
};
 
void Polynomial::GetInfo(double* arr, int sz) {
    for (int i = 0; i < sz; i++)
        polyn[i] = arr[i];
}
void Polynomial::SetP() {
    double p;
    cout << "Введите размер полинома\n";
    cin >> size;
    cout << "Введите значения коэффициентах при переменных\n";
 
    for (int i = 0; i < size; i++) {
        cin >> p;
        polyn[i] = p;
    }
}
 
void Polynomial::ShowP() {
    for (int i = 0; i < size; i++) {
        cout << polyn[i] << "*";
        if (i + 1 != size) {
            cout << "a" << i + 1 << "^" << i;
            if (polyn[i + 1] > 0)
                cout << " +  ";
 
        }
        else
            cout << "a" << i + 1 << "^" << i;
 
    }
}
 
Polynomial operator+(const Polynomial & lp, const Polynomial & rp) {
    int res_size = max(lp.size, rp.size);
    Polynomial res(res_size);
    for (int i = 0; i < res_size; ++i)
        res.polyn[i] = lp.polyn[i] + rp.polyn[i];
    return res;
}
 
int main() {
    setlocale(LC_ALL, "Russian");
    Polynomial p1(3);
    Polynomial p2(3);
 
    cout << endl;
    p1.ShowP();
    cout << endl << endl;
 
    p2 = p1 + p2;
    cout << "№3 ";
    p2.ShowP();
    cout << endl;
 
    //system("pause");
    return 0;
}
Если это С++11 или выше, то ещё неплохо было бы написать конструктор копирования и оператор присваивания с перемещением. Пример можно посмотреть здесь.
1
Jagario
1 / 1 / 0
Регистрация: 08.07.2017
Сообщений: 50
05.02.2019, 19:47  [ТС] 3
а можно ли как-то это реализовать без перегрузки операторов? просто в задаче не предусмотрено это

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
    Polynomial(const Polynomial& P)
    {
        polyn = new double[P.size];
        for (int i = 0; i < P.size; i++)
        {
            polyn[i] = P.polyn[i];
        }
    }
А разве это не конструктор копирования?
0
L0M
904 / 467 / 237
Регистрация: 01.10.2018
Сообщений: 1,043
Завершенные тесты: 1
06.02.2019, 01:19 4
Цитата Сообщение от Jagario Посмотреть сообщение
А разве это не конструктор копирования?
Это обычный. Кстати у вас он с ошибкой.
Цитата Сообщение от L0M Посмотреть сообщение
Если это С++11 или выше, то ещё неплохо было бы написать конструктор копирования и оператор присваивания с перемещением.
Это
C++
1
2
    Polynomial(Polynomial && p) noexcept;
    Polynomial & operator=(const Polynomial && rp) noexcept;
Пример по ссылке было лениво посмотреть?
Цитата Сообщение от Jagario Посмотреть сообщение
а можно ли как-то это реализовать без перегрузки операторов? просто в задаче не предусмотрено это
Что, так прямо и написано: "не использовать перегрузку операторов!"?

Не нравится перегрузка оператора +? тогда сделайте дружественную функцию:
C++
1
2
3
Polynomial poly_plus(const Polynomial & lp, const Polynomial & rp) { ... }
// ...
p2 = poly_plus(p1, p2);
Но оператор = по любому придётся перегрузить при вашей реализации класса Polynomial с использованием динамического выделения памяти под массив коэффициентов.

А вот если отказаться от динамического массива в пользу std::vector, тогда вообще всё проще:
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
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
 
using namespace std;
 
class Polynomial {
private:
    vector<double> polyn;
public:
    Polynomial() {}
    Polynomial(int sz) {
        polyn.resize(sz, 1.0);
    }
    Polynomial(int sz, double val) {
        polyn.resize(sz, val);
    }
    Polynomial(const Polynomial& p)  {
        polyn = p.polyn;
    }
    void GetInfo(double* arr, int sz);
    void SetP();
    void ShowP();
 
    friend Polynomial poly_plus(const Polynomial & lp, const Polynomial & rp);
};
 
void Polynomial::GetInfo(double* arr, int sz) {
    polyn.resize(sz);
    for (int i = 0; i < sz; i++)
        polyn[i] = arr[i];
}
void Polynomial::SetP() {
    double p;
    size_t size;
    cout << "Введите размер полинома\n";
    cin >> size;
    polyn.resize(size);
    cout << "Введите значения коэффициентах при переменных\n";
 
    for (int i = 0; i < size; i++) {
        cin >> p;
        polyn[i] = p;
    }
}
 
void Polynomial::ShowP() {
    for (int i = 0; i < polyn.size(); i++) {
        cout << polyn[i] << "*";
        if (i + 1 != polyn.size()) {
            cout << "a" << i + 1 << "^" << i;
            if (polyn[i + 1] > 0)
                cout << " +  ";
        }
        else
            cout << "a" << i + 1 << "^" << i;
 
    }
}
 
Polynomial poly_plus(const Polynomial & lp, const Polynomial & rp) {
    size_t res_size = max(lp.polyn.size(), rp.polyn.size());
    Polynomial res(res_size);
    for (size_t i = 0; i < res_size; ++i)
        res.polyn[i] = lp.polyn[i] + rp.polyn[i];
    return res;
}
 
int main() {
    setlocale(LC_ALL, "Russian");
    Polynomial p1(3);
    Polynomial p2(3);
 
    cout << endl;
    p1.ShowP();
    cout << endl << endl;
 
    p2 = poly_plus(p1, p2);
    cout << "№3 ";
    p2.ShowP();
    cout << endl;
 
    //system("pause");
    return 0;
}
PS. Некоторые ваши решения мне не нравятся, но править не стал.
0
Jagario
1 / 1 / 0
Регистрация: 08.07.2017
Сообщений: 50
06.02.2019, 19:39  [ТС] 5
Цитата Сообщение от L0M Посмотреть сообщение
Это обычный. Кстати у вас он с ошибкой.
Этот пример конструктора копирования почти на каждой ссылке в интернете. Почему с ошибкой?
Цитата Сообщение от L0M Посмотреть сообщение
Polynomial(Polynomial && p) noexcept;
Добавлено через 1 минуту
Цитата Сообщение от L0M Посмотреть сообщение
Некоторые ваши решения мне не нравятся
Какие именно?

Добавлено через 32 минуты
Можете объяснить примером как должен выглядеть конструктор копирования в моей программе с выделением дин. памяти,так как ваши примеры в ссылке не работают, либо я не понимаю как правильно надо
0
L0M
904 / 467 / 237
Регистрация: 01.10.2018
Сообщений: 1,043
Завершенные тесты: 1
07.02.2019, 01:28 6
Цитата Сообщение от Jagario Посмотреть сообщение
Этот пример конструктора копирования почти на каждой ссылке в интернете. Почему с ошибкой?
Потому что вы член класса size не инициализируете. Можно было бы и посмотреть по исправленному мной варианту.

Цитата Сообщение от Jagario Посмотреть сообщение
Можете объяснить примером как должен выглядеть конструктор копирования в моей программе с выделением дин. памяти
Я вам поправил ошибки в посте #2. Вы внимательно смотрели код? Там конструктор копирования тоже поправлен.

Цитата Сообщение от Jagario Посмотреть сообщение
так как ваши примеры в ссылке не работают, либо я не понимаю как правильно надо
Пример по ссылке рабочий. Почитайте тему в которой был тот пост.
Видимо дело в вас.

Цитата Сообщение от Jagario Посмотреть сообщение
Сообщение от L0M
Некоторые ваши решения мне не нравятся
Какие именно?
По вашему исходному коду, не касаясь явных ошибок:
  1. Член size должен быть типа size_t. С вытекающими отсюда последствиями.
  2. Конструктор без параметров. Почему размер 1? Логичнее было бы 0. И polyn = nullptr.
  3. Polynomial(int sz). Почему коэффициенты многочлена инициализируются 1? Логичнее инициализировать 0.
  4. Polynomial::GetInfo(). Во-первых, не Get, а set, и не Info, а Coef. Имена сущностей в программе должны быть информативными. А во-вторых, здесь потроха класса ни как не связаны с передаваемым массивом. Т.е. может быть выход за границы массива polyn, если arr длиннее, или мусор в polyn, если arr короче. Можно получить всё, что угодно, от неправильных результатов при вычислениях, до вылета программы в произвольный момент её работы. Здесь надо уничтожать текущий polyn, создавать новый, размером sz (параметр), сохранять sz в size, и только после этого можно безопасно копировать коэффициенты из внешнего массива во внутренний.
  5. Polynomial::SetP(). Во-первых, текущий фактический размер массива polyn может не совпадать с размером, введённым пользователем. Далее см. "во-вторых" в предыдущем пункте. Во-вторых, лучше взаимодействие с пользователем не включать в методы такого класса, как Polynomial, а делать свободной функцией. Поскольку зоны ответственности надо разделять.
  6. Polynomial Polynomial::GetSum(Polynomial p1). Если уж делать именно такой метод получения суммы полиномов, то, во-первых, делать как void Polynomial::sum(const Polynomial & p1). Т.е. прибавлять внешний полином к текущему, а не наоборот. При этом опять-таки надо создать новый вспомогательный динамический массив, размер которого равен большему размеру (size), произвести суммирование, потом удалить текущий polyn, присвоитьт polyn адрес начала вспомогательного массива и скорректировать поле size. Либо, второй вариант: делать Polynomial Polynomial::GetSum(const Polynomial & p1) const. Тогда надо возвращать объект Polynomial сформированный из вспомогательного массива и его размера.
0
Jagario
1 / 1 / 0
Регистрация: 08.07.2017
Сообщений: 50
07.02.2019, 16:42  [ТС] 7
Половину из ваших замечаний уже было исправлено мной прежде, но все равно спасибо. Хотя вы до этого сказали
Цитата Сообщение от L0M Посмотреть сообщение
Это обычный. Кстати у вас он с ошибкой.
что это конструктор "обычный".
Цитата Сообщение от L0M Посмотреть сообщение
Я вам поправил ошибки в посте #2. Вы внимательно смотрели код? Там конструктор копирования тоже поправлен.
0
07.02.2019, 16:42
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2019, 16:42

Деление многочленов(полиномов). доделать класс
Суть задания - сделать класс-полином со основными арифметическими операциями между многочленами....

C++, Полином, создать класс
Класс – полином a_n x^n+a_(n-1) x^(n-1)+⋯+a_1 x+a_0 (a_n≠0). Параметры (поля класса): n и массив...

Класс полином с односвязным списком
Помогите,пожалуйста, Написал класс Полином с односвязным списком,нужно создать...


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

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

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