第一题:
对如下多项式编写类定义:
+
+
+…+
a0+a1x+a2x2+…+anxn
其中,n为多项式的次数。完成如下功能:
- 可存储任意大的多项式(提示:用什么数据结构呢?)。
- 定义构造函数、析构函数、拷贝构造函数。
- 包含一个static成员存储定义的多项式的数量。
- 定义一个成员函数输出多项式。(可参照-x^4-6x^3+5格式输出)
- 定义一个成员函数计算多项式的值。
- 写main函数测试类的功能。
- 采用多文件实现。
考虑:哪些成员函数可以声明为const。
- 重载“+”运算符,实现两个多项式相加。
- 重载“-”运算符,实现两个多项式相减。
- 重载“*”运算符,实现两个多项式相乘。
- 重载“=”运算符,实现两个多项式的赋值运算。
考虑:把其中某个运算符重载为友元函数。
【注:解答全部为本人所写,仅供同学们学习时参考使用,请勿照搬抄袭!】
#pragma once
#include <iostream>
class d {
public:
d() { // 默认构造函数,初始化
a = 0;
for (int i = 0; i < 999; i++) {
b[i] = 0.0;
}
count++;
std::cout << count << "默认构造函数,初始化\n";
}
d(const double s[999]) { // 拷贝构造函数
a = 0;
while (a < 999 && s[a] != 0) {
b[a] = s[a];
a++;
}
for (int i = a; i < 999; i++) {
b[i] = 0.0;
}
count++;
std::cout << count << "拷贝构造函数\n";
}
// 析构函数
~d() {
count--;
std::cout << count << "析构函数\n";
}
// 输出多项式
void print() {
for (int i = 0; i <= a; i++) {
std::cout << b[i] << "*x^" << i << " + ";
}
std::cout << "0\n";
}
// 计算多项式的值
double evaluate(double x) {
double e = 0.0;
double xn = 1.0;
for (int i = 0; i <= a; i++) {
e += b[i] * xn;
xn *= x;
}
return e;
}
// 重载运算符 +
friend d operator+(const d& p1, const d& p2) {
int n1 = p1.a + 1;
int n2 = p2.a + 1;
int n;
if (n1 > n2) n = n1;
else n = n2;
double bb[999] = { 0 };
for (int i = 0; i <= n; i++) {
double x = (i <= p1.a) ? p1.b[i] : 0.0;
double y = (i <= p2.a) ? p2.b[i] : 0.0;
bb[i] = x + y;
}
return d(bb);
}
// 重载运算符 -
friend d operator-(const d& p1, const d& p2) {
int n1 = p1.a + 1;
int n2 = p2.a + 1;
int n;
if (n1 > n2) n = n1;
else n = n2;
double bb[999] = { 0 };
for (int i = 0; i <= n; i++) {
double x = (i <= p1.a) ? p1.b[i] : 0.0;
double y = (i <= p2.a) ? p2.b[i] : 0.0;
bb[i] = x - y;
}
return d(bb);
}
// 重载运算符 *
friend d operator*(const d& p1, const d& p2) {
int n1 = p1.a + 1;
int n2 = p2.a + 1;
int n = n1 + n2 - 1;
double bb[9999] = { 0 };
for (int i = 0; i < n1; i++) {
for (int j = 0; j < n2; j++) {
bb[i + j] += p1.b[i] * p2.b[j];
}
}
return d(bb);
}
// 重载运算符 =
d& operator=(const d& p1) {
a = p1.a;
for (int i = 0; i <= a; i++) {
b[i] = p1.b[i];
}
return *this;
}
static inline int count = 0;
private:
int a; // 多项式的次数
double b[999]; // 系数向量
};
int main() {
double a[999] = { 1, 2, 3 };
double b[999] = { 4, 5 };
d p1(a);
d p2(b);
d p3 = p1 + p2;
d p4 = p1 - p2;
d p5 = p1 * p2;
p3.print();
p4.print();
p5.print();
double x = 2.0;
std::cout << "p1(" << x << ") = " << p1.evaluate(x) << std::endl;
std::cout << "p2(" << x << ") = " << p2.evaluate(x) << std::endl;
return 0;
}