2023吉林大学C++面向对象程序编程上机实验第一题

本文展示了一个实现多项式类的代码示例,类中包含了存储和计算任意次多项式的能力。类定义包括构造函数、析构函数和拷贝构造函数,以及用于输出多项式和计算其值的成员函数。此外,还重载了加法、减法、乘法和赋值运算符,其中乘法和部分加减运算符作为友元函数实现。
摘要由CSDN通过智能技术生成

第一题:

对如下多项式编写类定义:

 + + +…+ 

a0+a1x+a2x2+…+anxn

其中,n为多项式的次数。完成如下功能:

  1. 可存储任意大的多项式(提示:用什么数据结构呢?)。
  2. 定义构造函数、析构函数、拷贝构造函数。
  3. 包含一个static成员存储定义的多项式的数量。
  4. 定义一个成员函数输出多项式。(可参照-x^4-6x^3+5格式输出)
  5. 定义一个成员函数计算多项式的值。
  6. 写main函数测试类的功能。
  7. 采用多文件实现。

考虑:哪些成员函数可以声明为const。

  1. 重载“+”运算符,实现两个多项式相加。
  2. 重载“-”运算符,实现两个多项式相减。
  3. 重载“*”运算符,实现两个多项式相乘。
  4. 重载“=”运算符,实现两个多项式的赋值运算。

考虑:把其中某个运算符重载为友元函数。

【注:解答全部为本人所写,仅供同学们学习时参考使用,请勿照搬抄袭!】

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值