Форум программистов, компьютерный форум CyberForum.ru

Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома - C++

Восстановить пароль Регистрация
 
gaaalim
0 / 0 / 0
Регистрация: 27.04.2013
Сообщений: 9
25.05.2013, 05:22     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома #1
Доброе утро. Нам задали такое задание:написать шаблон класса полином и функции,высчитывающие производную и первообразную полинома.Вроде написал ,но компиллятор выдаёт ошибки. Скажите,пожалуйста, как исправить ошибки.
Poly.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
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
#ifndef POLY_H_INCLUDED
#define POLY_H_INCLUDED
#include <iostream>
#include <cmath>
 
using namespace std;
template<class T>
class poly
{
private:
    static unsigned int k;
    T pol[k];
public:
    poly <T> (int i,T iol[])
    {
        i=k;
        iol=pol;
    }
    poly <T> ()
    {
        cout << "vvedite stepen` polinoma" << endl;
        cin >> k;
        T kol [k];
        cout << "vvedite koefficienti" << endl;
        for(int u=0;u!=k;u++)
        {
            cout << "x^" << u << ":" << endl;
            cin >> pol [u];
        }
    }
    poly<T> (poly<T> & aPoly)
    {
        k=aPoly.k;
        pol=aPoly.pol;
    }
    ~poly<T> ()
    {
        for(int f=0;f!=k+1;f++)
        {
            delete & pol[f];
        }
        delete & k;
        cout<<"Многочлен удален";
    }
    poly<T> & operator = (poly<T> & it)
    {
        k=it.k;
        pol=it.pol;
        return *this;
    }
    poly<T>& operator + (poly<T> & it)
    {
        int i;
        for(i=0;i!=k;i++)
        {
            pol[i] += it.pol[i];
        }
        return *this;
    }
    poly<T>& operator * (poly<T> & it)
    {
        int j;
        j=k+it.k;
        T c[j];
        c[0]=0;
        for(j=0;j!=k+it.k;j++)
            {
                for(int z=0;z!=k+1;z++)
                    {
                        c[k]=c[k] + pol[z] * it.pol[k-z];
                    }
            }
        return poly(j,c);
    }
    T znach(T x)
    {
            T S = 0;
            T y;
            for(int z=0; z!= k; z++ )
                {
                    y = pol[z] * pow(x,z);
                    S += y ;
                }
            return S;
    }
    friend ostream& operator<< (ostream& out,const poly<T>& it)
    {
        unsigned int i;
        char xs[3];
        for(i=0;i<=k;i++)
            {
                if(i!=0)
                {
                    xs="x^";
                }
                else
                {
                    xs="";
                }
                if (it.pol!=0)
                {
                    out<< (it.pol[i] ? " - " : " + ") << it.pol[i] << xs << i ;
                }
            }
        return out;
    }
 
    friend poly<T>  diff(poly x)
    {
        int i;
        T dol[i+1];
        for(i=0;i!=x.k;i++)
        {
            dol[i]=x.pol[i+1] * i;
        }
        return poly(i,dol);
    }
    friend poly<T> integr(poly x)
    {
        int i;
        T dol[i+1];
        dol[0]=0;
        for(i=1;i+1!=x.k;i++)
        {
            dol[i]=x.pol[i-1] / i;
        }
        return poly(i,dol);
    }
};
#endif // POLY_H_INCLUDED
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Poly.h"
#include <fstream>
 
 
int main()
{
    poly <float> n();
    float x;
    ofstream fout;
    fout.open("cppstudio.txt");
    fout << x << "\t" << n.znach(x) ;
    fout << "\t" << diff(n) << endl;
    fout.close();
    cout << "zapisano" << endl;
    return 0;
}
Ошибки:
Код
6\main.cpp||In function `int main()':|
 6\main.cpp|11|error: request for member `znach' in `n', which is of non-class type `poly<float> ()()'|
 6\main.cpp|12|error: `diff' undeclared (first use this function)|
 6\main.cpp|12|error: (Each undeclared identifier is reported only once for each function it appears in.)|
||=== Build finished: 3 errors, 0 warnings ===|
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2013, 05:22     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома
Посмотрите здесь:

Написать шаблон функции для поиска среднего арифметического массива C++
Написать шаблон функции, и Создать класс. C++
C++ Какими способами можно использовать функции класса B, как параметры функции Sub класса А?
C++ Написать шаблон для класса "Рабочий"
Написать шаблон функции для поиска среднего арифметического значений массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
25.05.2013, 05:34     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома #2
Цитата Сообщение от gaaalim Посмотреть сообщение
poly <float> n();
это force declaration функции n, которая возвращает объект типа poly<float>

то что хочешь ты сделать это
C++
1
poly<float> n;
gaaalim
0 / 0 / 0
Регистрация: 27.04.2013
Сообщений: 9
25.05.2013, 14:35  [ТС]     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома #3
Подправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
    poly <float> n;
    float x;
    ofstream fout;
    fout.open("cppstudio.txt");
    fout << x << "\t" << n.znach(x) ;
    fout << "\t" << diff(n) << endl;
    fout.close();
    cout << "zapisano" << endl;
    return 0;
}
Теперь выдаёт такие ошибки:

Код
 6\main.cpp||In function `int main()':|
 6\main.cpp|12|error: no matching function for call to `poly<float>::poly(poly<float>)'|
 6\Poly.h|32|note: candidates are: poly<T>::poly(poly<T>&) [with T = float]|
 6\main.cpp|12|confused by earlier errors, bailing out|
||=== Build finished: 2 errors, 0 warnings ===|
функция diff неправильно вызвана кажется...Может нужно использовать пространство имён poly<float> ?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
25.05.2013, 15:36     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома #4
C++
1
2
3
4
5
class poly
{
private:
    static unsigned int k;
    T pol[k];
не должно работать

C++
1
2
3
template<class T>
        cin >> k;
        T kol [k];
это тоже уже не с++
эквивалентной стандартной заменой был бы std::vector

Цитата Сообщение от gaaalim Посмотреть сообщение
6\main.cpp|12|error: no matching function for call to `poly<float>:oly(poly<float>)'|
тут тебе нужен конструктор копирования

C++
1
2
3
4
    poly<T> (const poly& p)
    {
         // ...
    }
видимо для создания анонимного/темпового объекта после вызова
gaaalim
0 / 0 / 0
Регистрация: 27.04.2013
Сообщений: 9
26.05.2013, 18:36  [ТС]     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома #5
Спасибо...видимо,придётся всю прогу переделать.

Добавлено через 16 часов 12 минут
Посмотрите,пожалуйста. Оператор просит только один аргумент,а когда я убираю второй, то просит два) Что делать ?
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
#include <vector>
#include <iostream>
using namespace std;
template <class A> class Polinom
{
public:
  vector<A> Pol;
public:
  Polinom()
    {
        Pol.resize(1); Pol[0] = 0;
    }
    Polinom(A a)
    {
        Pol.resize(1);
        Pol[0] = a;
    }
    Polinom(int n, A *koef)
    {
        Pol.resize(n);
        for(int i = 0; i < n; i++)
            Pol[i] = koef[i];
    }
    Polinom(const Polinom& initPol)
    {
        Pol = initPol.Pol;
    }
    Polinom<A> operator - ();
    Polinom<A> operator + (Polinom<A>);
    Polinom<A> operator - (Polinom<A>);
    Polinom<A> operator * (Polinom<A>);
    Polinom<A> operator = (Polinom<A>);
    ostream& operator << (ostream & out,const Polinom<A> & it);
};
template <class A>::ostream&  operator << (ostream & out,const Polinom<A> & it)
    {
        unsigned int i;
        char xs[3];
        for(i=0;i<=it.Pol.size;i++)
            {
                if(i!=0)
                {
                    xs="x^";
                }
                else
                {
                    xs="";
                }
                if (it.Pol!=0)
                {
                    out<< (it.Pol[i] ? " - " : " + ") << it.Pol[i] << xs << i ;
                }
            }
        return out;
    }
 
template <class A> Polinom<A> Polinom<A> :: operator + (Polinom<A> add)
{
    Polinom<A> result;
    Polinom<A> * md;
    size_t maxdeg, mindeg;
    if(this->Pol.size() <= add.Pol.size())
        md = &add;
    else
        md = this;
    maxdeg = max(this->Pol.size(),add.Pol.size());
    mindeg = min(this->Pol.size(),add.Pol.size());
    result.Pol.resize(maxdeg);
    for(unsigned int i = 0; i < mindeg; i++)
        result.Pol[i] = this->Pol[i] + add.Pol[i];
    for(size_t i = mindeg; i < maxdeg; i++)
        result.Pol[i] = md->Pol[i];
    return result;
}
template <class A> Polinom<A> Polinom<A> :: operator - ()
{
    Polinom<A> result;
    for(int i = 0; i < this->Pol.size(); i++)
        result.Pol[i] = -this->Pol[i];
    return result;
}
template <class A> Polinom<A> Polinom<A> :: operator - (Polinom<A> sub)
{
    Polinom<A> result;
    result = *this + (-sub);
    return result;
}
template <class A> Polinom<A> Polinom<A> :: operator * (Polinom<A> mult)
{
    Polinom<A> result;
    result.Pol.resize(this->Pol.size() + mult.Pol.size() - 1);
    for(unsigned int i = 0; i < this->Pol.size(); i++)
        for(unsigned int j = 0; j < mult.Pol.size(); j++)
            result.Pol[i+j] += this->Pol[i]*mult.Pol[j];
    return result;
}
template <class A> Polinom<A> Polinom<A> :: operator = (Polinom<A> right)
{
    this->Pol = right.Pol;
    return *this;
}
Код
 

 6\Poly.h|33|error: `std::ostream& Polinom<A>::operator<<(std::ostream&, const Polinom<A>&)' must take exactly one argument|
||=== Build finished: 1 errors, 0 warnings ===|
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.05.2013, 20:16     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома #6
gaaalim, в с++ есть два типа операторов:
- определенные как члены класса (как в твоем случае)
- определенные глобально (как в твоем первом варианте)

то бишь

C++
1
2
3
4
5
6
7
8
9
class A 
{ 
public:
  A& operator << (const int value)
  {
     // ..
     return *this; 
  }
};
vs

C++
1
2
3
4
5
6
7
8
9
10
11
class A 
{ 
public:
  friend ostream& operator << (ostream&, const A&);
};
 
ostream& operator << (ostream& os, const A& a);
{
   //...
   return os;
}
проблема в том, что оператор-член класса, и глобальный оператор имеют различные аргументы
в случае << (применительно к операциям ввода-вывода) в бинарной операции A << B первым аргументом (А) должен быть поток, поэтому приходится использовать внеклассовые операторы
gaaalim
0 / 0 / 0
Регистрация: 27.04.2013
Сообщений: 9
26.05.2013, 20:41  [ТС]     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома #7
Так будет правильнее ?
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
#include <vector>
#include <iostream>
using namespace std;
template <class A> class Polinom
{
public:
    vector<A> Pol;
public:
    Polinom()
    {
        int k;
        cout << "vvedite stepen` polinoma" << endl;
        cin >> k;
        Pol.resize=k+1;
        cout << "vvedite koefficienti" << endl;
        for(int u=0;u!=k;u++)
        {
            cout << "x^" << u << ":" << endl;
            cin >> Pol[u];
        }
    }
    Polinom(A a)
    {
        Pol.resize(1);
        Pol[0] = a;
    }
    Polinom(int n, A *koef)
    {
        Pol.resize(n);
        for(int i = 0; i < n; i++)
            Pol[i] = koef[i];
    }
    ~Polinom()
    {
        for(int u=0;u!=Pol.size;u++)
            {
                delete & Pol[u];
            }
    }
    Polinom(const Polinom& initPol)
    {
        Pol = initPol.Pol;
    }
    A znach(A x)
    {
            A S = 0;
            A y;
            for(int z=0; z!= Pol.size; z++ )
                {
                    y = Pol[z] * pow(x,z);
                    S += y ;
                }
            return S;
    }
    Polinom<A> operator - ();
    Polinom<A> operator + (Polinom<A>);
    Polinom<A> operator - (Polinom<A>);
    Polinom<A> operator * (Polinom<A>);
    Polinom<A> operator = (Polinom<A>);
    friend ostream& operator << (ostream & out,const Polinom<A> & it)
    {
        unsigned int i;
        char xs[3];
        for(i=0;i<=it.Pol.size;i++)
            {
                if(i!=0)
                {
                    xs="x^";
                }
                else
                {
                    xs="";
                }
                if (it.Pol!=0)
                {
                    out<< (it.Pol[i] ? " - " : " + ") << it.Pol[i] << xs << i ;
                }
            }
        return out;
    }
    friend Polinom<A> integr(Polinom<A> x)
    {
        int i;
        vector<A> dol(i+1);
        dol[0] = 0;
        for(i=1;i+1!=x.Pol.size;i++)
        {
            dol[i]=x.Pol[i-1] / i;
        }
        return Polinom<A>(i,dol);
    }
    friend Polinom<A> diff(Polinom<A> x)
    {
        int i;
        vector<A> dol(i);
        for(i=0;i!=x.Pol.size;i++)
        {
            dol[i]=x.Pol[i+1] * i;
        }
        return Polinom<A>(i,dol);
    }
};
 
template <class A> Polinom<A> Polinom<A> :: operator + (Polinom<A> add)
{
    Polinom<A> result;
    Polinom<A> * md;
    size_t maxdeg, mindeg;
    if(this->Pol.size() <= add.Pol.size())
        md = &add;
    else
        md = this;
    maxdeg = max(this->Pol.size(),add.Pol.size());
    mindeg = min(this->Pol.size(),add.Pol.size());
    result.Pol.resize(maxdeg);
    for(unsigned int i = 0; i < mindeg; i++)
        result.Pol[i] = this->Pol[i] + add.Pol[i];
    for(size_t i = mindeg; i < maxdeg; i++)
        result.Pol[i] = md->Pol[i];
    return result;
}
template <class A> Polinom<A> Polinom<A> :: operator - ()
{
    Polinom<A> result;
    for(int i = 0; i < this->Pol.size(); i++)
        result.Pol[i] = -this->Pol[i];
    return result;
}
template <class A> Polinom<A> Polinom<A> :: operator - (Polinom<A> sub)
{
    Polinom<A> result;
    result = *this + (-sub);
    return result;
}
template <class A> Polinom<A> Polinom<A> :: operator * (Polinom<A> mult)
{
    Polinom<A> result;
    result.Pol.resize(this->Pol.size() + mult.Pol.size() - 1);
    for(unsigned int i = 0; i < this->Pol.size(); i++)
        for(unsigned int j = 0; j < mult.Pol.size(); j++)
            result.Pol[i+j] += this->Pol[i]*mult.Pol[j];
    return result;
}
template <class A> Polinom<A> Polinom<A> :: operator = (Polinom<A> right)
{
    this->Pol = right.Pol;
    return *this;
}
Так вроде ошибки не выдаёт компиллятор.

Добавлено через 3 минуты
Ещё вопрос)) написал main ,но там почему-то выдаёт компиллятор такие ошибки:

Код
 6\main.cpp||In function `int main()':|
 6\main.cpp|11|error: request for member `znach' in `n', which is of non-class type `Polinom<float> ()()'|
 6\main.cpp|12|error: `diff' undeclared (first use this function)|
 6\main.cpp|12|error: (Each undeclared identifier is reported only once for each function it appears in.)|
||=== Build finished: 3 errors, 0 warnings ===|
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "Poly.h"
#include <fstream>
 
int main()
{
    Polinom <float> n();
    float x;
    ofstream fout;
    fout.open("cppstudio.txt");
    fout << x << "\t";
    fout << n.znach(x);
    fout << "\t" << diff(n) << endl;
    fout.close();
    cout << "zapisano" << endl;
    return 0;
}
Как их можно исправить ? Компиллятор не видит эту функцию и метод класса(
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 20:48     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома
Еще ссылки по теме:

C++ Написать рекурсивную и не рекурсивную функции вычисления полинома Чебышева первого ряда:
C++ Написать шаблон функции для сортировки массивов действительных и целых чисел
C++ Написать шаблон класса очередь, и сделать к типу char спецификацию

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
26.05.2013, 20:48     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома #8
Цитата Сообщение от gaaalim Посмотреть сообщение
Pol.resize=k+1;
воу-воу, полегче
не на паскале же пишем http://www.cplusplus.com/reference/v...vector/resize/
думаю ты просто не инстанцировал шаблон, иначе бы он разразился ошибками
Цитата Сообщение от gaaalim Посмотреть сообщение
Pol.resize(1);
* * * * Pol[0] = a;
C++
1
Pol.push_back(a);
Цитата Сообщение от gaaalim Посмотреть сообщение
delete & Pol[u];
плохая идея, потому что я не вижу ни одного new у тебя в коде, соответственно откуда delete - неясно

с операторами похоже, только можно было бы реализацию вынести из хедера (иначе вызовет проблемы в дальнейшем)

Добавлено через 2 минуты
Цитата Сообщение от gaaalim Посмотреть сообщение
Polinom <float> n();
опять оно
Yandex
Объявления
26.05.2013, 20:48     Написать шаблон класса полином и функции, высчитывающие производную и первообразную полинома
Ответ Создать тему
Опции темы

Текущее время: 23:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru