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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gaaalim
0 / 0 / 0
Регистрация: 27.04.2013
Сообщений: 9
#1

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

25.05.2013, 05:22. Просмотров 902. Ответов 7
Метки нет (Все метки)

Доброе утро. Нам задали такое задание:написать шаблон класса полином и функции,высчитывающие производную и первообразную полинома.Вроде написал ,но компиллятор выдаёт ошибки. Скажите,пожалуйста, как исправить ошибки.
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++):

Получить полином Qm из полинома Pn - C++
Помогите написать программу.:) Дан полином Pn(x)=a0+a1*x+a2*x2+.....an*xn; n&lt;=8 (n-степень полинома) Получить полином...

Написать рекурсивную и нерекурсивную функции вычисления полинома (ошибка в цикле) - C++
Здравствуйте,Помогите найти ошибку в цикле. Задание: Написать рекурсивную и не рекурсивную функции вычисления полинома: ...

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

Как сделать шаблон функции другом шаблона класса? - C++
С обычной функцией понятно: template&lt;class T&gt; class A { friend void f(); } А вот если функция f шаблонная, то указать ее...

Написать шаблон функции, и Создать класс. - C++
Помогите ктота пожалуста ... Ето надо на С++ зделать. Спасибо за рание! 1. Написать шаблон функции вычисления произведения двух...

Написать рекурсивную и не рекурсивную функции вычисления полинома Чебышева первого ряда: - C++
Написать рекурсивную и не рекурсивную функции вычисления полинома Чебышева первого ряда: T0(x)=1;...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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;
}
Как их можно исправить ? Компиллятор не видит эту функцию и метод класса(
alex_x_x
бжни
2447 / 1652 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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();
опять оно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2013, 20:48
Привет! Вот еще темы с ответами:

Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон - C++
Есть у меня 3 структуры Трамвай , Троллейбус , Автобус. Для автобуса определены функции (работают) Троллейбус и Трамвай одинаковые поля...

Написать шаблон функции для поиска среднего арифметического массива - C++
Написать шаблон функции для поиска среднего арифметического значений массива

Написать шаблон функции maximum, возвращающий большее значение из переданных - C++
Напишите шаблон функции maximum. Эта функция принимает два значения одного типа и возвращает большее (или любое из них, если они равны). ...

Написать шаблон для класса "Рабочий" - C++
Всем доброго время суток! У меня возникла следующая проблема. Препод дал задание: написать шаблон для класса &quot;Рабочий&quot; с полями имени,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.05.2013, 20:48
Ответ Создать тему
Опции темы

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