C02-程序设计基础提高班(C++)第11周上机任务-运算符重载

第11周:阅读教材第10章(p314-346),掌握用运算符重载解决问题,完成第11周上机任务;

(回到C02-程序设计基础提高班(C++)学习安排)

【任务1】实现复数类中的运算符重载
定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。
(1)方案一:请用类的成员函数完成运算符的重载;

class Complex
{
public:
	Complex(){real=0;imag=0;}
	Complex(double r,double i){real=r;imag=i;}
	Complex operator+(Complex &c2);
	Complex operator-(Complex &c2);
	Complex operator*(Complex &c2);
	Complex operator/(Complex &c2);
	void display();
private:
	double real;
	double imag;
};
//下面定义成员函数

int main()
{
	Complex c1(3,4),c2(5,-10),c3;
	cout<<"c1=";
	c1.display();
	cout<<"c2=";
	c2.display();
	c3=c1+c2;
	cout<<"c1+c2=";
	c3.display();
	c3=c1-c2;
	cout<<"c1-c2=";
	c3.display();
	c3=c1*c2;
	cout<<"c1*c2=";
	c3.display();
	c3=c1/c2;
	cout<<"c1/c2=";
	c3.display();
	system("pause");
	return 0;
}

(2)方案二:请用类的友元函数,而不是成员函数,完成上面提及的运算符的重载;
(3)方案三:在方案二的基础上,扩展+、-、*、/运算符的功能,使之能与double型数据进行运算。设Complex c; double d; c?d和d?c的结果为“将d视为实部为d的复数同c运算”的结果(其中?为+、-、*、/之一)。另外,再定义一目运算符 -,-c相当于0-c。
[ 参考:复数类中运算符重载(成员函数实现)-http://blog.csdn.net/sxhelijian/article/details/7442939 ]

【任务1进阶】接任务1,定义Complex类中的<<和>>运算符的重载,实现输入和输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
[ 参考:Complex类中运算符的重载 - http://blog.csdn.net/sxhelijian/article/details/7467414 ]

【任务2】实现Time类中的运算符重载

#include <iostream>
using namespace std;
class CTime
{
private:
	unsigned short int hour;    // 时
	unsigned short int minute;  // 分
	unsigned short int second;  // 秒
public:
	CTime(int h=0,int m=0,int s=0);
	void setTime(int h,int m,int s);
	void display();
	//比较运算符(二目)的重载
	bool operator > (CTime &t);
	bool operator < (CTime &t);
	bool operator >= (CTime &t);
	bool operator <= (CTime &t);
	bool operator == (CTime &t);
	bool operator != (CTime &t);
	//二目运算符的重载
	CTime operator+(CTime &c);//返回c所规定的时、分、秒后的时间,例t1(8,20,25),t2(11,20,50),t1+t2为:41:15
	CTime operator-(CTime &c);//对照+理解
	CTime operator+(int s);//返回s秒后的时间
	CTime operator-(int s);//返回s秒前的时间
	//一目运算符的重载
	CTime operator++(int);//后置++,下一秒
	CTime operator++();//前置++,下一秒
	CTime operator--(int);//后置--,前一秒
	CTime operator--();//前置--,前一秒
	//赋值运算符的重载
	CTime operator+=(CTime &c);
	CTime operator-=(CTime &c);
	CTime operator+=(int s);//返回s秒后的时间
	CTime operator-=(int s);//返回s秒前的时间
};
//下面实现所有的运算符重载代码。
//为简化编程,请注意通过调用已有函数,利用好各函数之间的关系

void main()
{
	CTime t1(8,20,25),t2(11,20,50),t;
	cout<<"t1为:";
	t1.display();
	cout<<"t2为:";
	t2.display();
	cout<<"下面比较两个时间大小:\n";
	if (t1>t2) cout<<"t1>t2"<<endl;
	if (t1<t2) cout<<"t1<t2"<<endl;
	if (t1==t2) cout<<"t1=t2"<<endl;
	if (t1!=t2) cout<<"t1≠t2"<<endl;
	if (t1>=t2) cout<<"t1≥t2"<<endl;
	if (t1<=t2) cout<<"t1≤t2"<<endl;
	cout<<endl;
	//下面自行设计对其他运算符的重载的测试
    ……

}

[ 参考:实现Time类中的运算符重载 - http://blog.csdn.net/sxhelijian/article/details/7443145 ]

【任务2进阶】接任务2,定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。
[ 参考:Time类中运算符重载 - http://blog.csdn.net/sxhelijian/article/details/7467425 ]

【任务3】实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。

class CFraction
{
private:
	int nume;  // 分子
	int deno;  // 分母
 public:
	//构造函数及运算符重载的函数声明
};
//重载函数的实现及用于测试的main()函数

[ 参考:实现分数类中的运算符重载 - http://blog.csdn.net/sxhelijian/article/details/7443155 ]

【任务3进阶】接任务3,定义分数类中<<和>>运算符重载,实现分数的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然。

[ 参考:分数类中运算符重载 - http://blog.csdn.net/sxhelijian/article/details/7467433 ]

【任务4】在任务3的基础上拓展。分数类中的对象可以和整型数进行四则运算,且运算符合交换律。例如:CFraction a(1,3),b; int i=2; 可以完成b=a+i;。同样,可以完成i+a, 45+a, a*27, 5/a等各种运算。
[ 参考:实现分数类中的运算符重载(分数与整数运算)- http://blog.csdn.net/sxhelijian/article/details/7443174 ]

【任务5】在教材P324例10.4基础上,在String类中增加一个数据成员len表示字符串中字任个数,然后构造String类的相关运算。这些运算可以包括:s1 + s2用于两个字符串的连接;s1 - s2用于将s1的尾部空格和s2的前导空格去除后的连接;s1*n的结果为将s1中的字符重复n次;s1/s2表示在s1中删除所有与s2相同的子串。这些运算本身并无统一的规范,多想一些字符串上的操作,利用运算符的重载实现之。

【任务6】建立一个二维数组类Douary,使该类中有以下数据成员、成员函数及友员函数,完成矩阵的输入、输出、加、减、相等判断等操作。

#include <iostream>
using namespace std;
class Douary
{
public:
	Douary(int m, int n);//构造函数:用于建立动态数组存放m行n列的二维数组(矩阵)元素,并将该数组元素初始化为
	~Douary(); //析构函数:用于释放动态数组所占用的存储空间。
	   //此处增加一个复制构造函数
	friend istream &operator>>(istream &input, Douary &d);//重载运算符“>>”输入二维数组,其中d为Dousry类对象;
	friend ostream &operator<<(ostream &output, Douary &d);//重载运算符“<<”以m行n列矩阵的形式输出二维数组,其中d为Douary类对象。
	friend Douary operator+(const Douary &d1,const Douary &d2);//两个矩阵相加,规则:对应位置上的元素相加
	friend Douary operator-(const Douary &d1,const Douary &d2);//两个矩阵相减,规则:对应位置上的元素相减
	bool operator==(const Douary &d);//判断两个矩阵是否相等,即对应位置上的所有元素是否相等
private:
	int * Array;      //Array 为动态数组指针。
	int row;          //row  为二维数组的行数。
	int col;          //col   为二维数组的列数。
}
int main()
{
	Douary d1(2,3),d2(2,3)
	cout<<"输入d1:"<<endl;
	cin>>d1;
	cout<<"输入d2:"<<endl;
	cin>>d2;
	coutt<<"d1="<<endl;
	cout<<d1;
	coutt<<"d2="<<endl;
	cout<<d2;
	coutt<<"d1+d2="<<endl;
	cout<<(d1+d2);
	coutt<<"d1-d2="<<endl;
	cout<<(d1-d2);
	cout<<"d1"<<((d1==d2)?"==":"!=")<<"d2"<<endl;
	system("pause");
	return 0;
}

[ 参考:二维数组类 - http://blog.csdn.net/sxhelijian/article/details/7467443 ]

【任务7】设计一元一次方程类,求形如ax+b=0的方程的解。
例如:输入3x-8=0时,输出的方程的解为x=2.66667;
再如:输入5s+18=0时,输出的方程的解为s=-3.6; 

#include "iostream"
using namespace std;
class CEquation
{
private:
	double a;     // 未知数系数
	double b;     // 常数项
	char unknown; // 未知数的符号
public:
	CEquation(double aa=0,double bb=0);
	friend istream &operator >> (istream &in,CEquation &e);
	friend ostream &operator << (ostream &out,CEquation &e);
	double Solve();
	char getUnknown();
};

int main()
{
	CEquation e;
	cout<<"请输入一元一次方程(输入格式:3x-8=0):";
	cin>>e;   //在两次测试中,分别输入3x-8=0和5s+18=0
	cout<<"方程为:"<<e;
	cout<<"方程的解为:"<<e.getUnknown()<<"="<<e.Solve()<<endl; //两次测试,分别输出x=...和s=...
	e.Solve();
	system("pause");
	return 0;
}

[ 参考:一元一次方程类 - http://blog.csdn.net/sxhelijian/article/details/7467515 ]

时间: 2024-10-26 20:59:51

C02-程序设计基础提高班(C++)第11周上机任务-运算符重载的相关文章

C02-程序设计基础提高班(C++)第7周上机任务-指针

第7周:阅读教材第6章(p164-200),主要内容是指针,完成第7周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践内容: 1. (数组的排序) 按模板中的要求,用指向数组的指针变量作为形式参数编写函数,完成冒泡排序.重点体会:(1)冒泡排序算法:(2)用指向数组的指针变量作为形式参数,用数组名(即数组的地址)作为实际参数,函数中对于形参的改变实质上也就是对实参对应内存单元的改变:(3)形式参数中不指定数组大小,实际数组的大小也一并作为参数传递. #include <io

C02-程序设计基础提高班(C++)第9周上机任务-类和对象

第9周:阅读教材第8章(p231-262),主要内容是类和对象,学会定义类和对象解决问题,完成第9周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]阅读.运行下面的程序后,按要求编制新的成员函数,并增加类的功能 #include <iostream> using namespace std; class Time { public: void set_time( ); void show_time( ); private: bool is_time(in

C02-程序设计基础提高班(C++)第4周上机任务

第4周:下载并阅读 C++程序设计入门同步实践宝典(v0.5)中的1.2节及第3章的内容(下载积分不足的同学可以通过校园网到我的BB平台下载,账号2009helijian),在程序调试技术.解题方法方面加深理解 (回到C02-程序设计基础提高班(C++)学习安排) 1.分别用3种循环(while~.for(;;)~.do~while)计算下式 要求用单重循环完成,以强化关注效率的意识. 2.在下面的加法算式中,不同的符号代表不同的数字,相同的符号代表相同的数字.请设计程序求出"都.要.学.C&q

C02-程序设计基础提高班(C++)第10周上机任务-类和对象之二

第10周:阅读教材第9章(p263-313),主要内容是构造和析构函数.对象数组.对象指针.共用数据的保护等,完成第10周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]设计三角形类,通过增加构造函数,使对象在定义时能够进行初始化 #include<iostream> using namespace std; class Triangle {public: float perimeter(void);//计算三角形的周长 float area(void)

C02-程序设计基础提高班(C++)第8周上机任务-结构体

第8周:阅读教材第7章(p201-230),主要内容是结构体与自定义类型,同时也希望将同学们将第3-7章的内容整理一下,完成第8周上机任务,本周任务将增加一些对用结构化程序设计技术解决问题的综合性题目: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务(需要的数据文件score.txt在本文后,自行复制后,用记事本保存为score.txt): [任务1]结构体数据组 score.txt中是一些同学的学号.姓名.C++.高数.英语成绩,定义一个学生成绩的结构体数组,其中的成员包括学号

C02-程序设计基础提高班(C++)第6周上机任务-数组

第6周:阅读教材第5章(p134-163),主要内容是数组,完成第6周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 任务内容: 1. 创建一个长度为20的数组,其中存放斐波那契数列的前20项. 2. 筛法求素数.筛法求素数是一种快速的求素数的方法,其思路是以空间换时间,利用额外的数组作为中介,能够显著降低运行的时间.现在要求列出10000以内的素数. (筛法求素数的算法请上网查找) 3. 在数组score中将要存储某小组C++程序设计的成绩,请设计完成下面功能函数,并将它们组

C02-程序设计基础提高班(C++)第14周上机任务-文件操作

第14周:阅读教材第13章(p417-458),主要内容是输入输出,重点是文件的操作,完成第14周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) [任务1]涨工资从文件salary.txt中读入500名工人的工资,全部增加100元后进行排序,将排序后的结果在屏幕上输出,并保存到文件ordered_salary.txt中.[ 参考:涨工资了 - http://blog.csdn.net/sxhelijian/article/details/7632245 ] [任务2]学生成绩排

C02-程序设计基础提高班(C++)第5周上机任务

第5周:阅读教材第4章(p88-133),主要内容是函数 (回到C02-程序设计基础提高班(C++)学习安排) 1. 求满足条件n=a!+b!+c!的所有三位数n并输出,要求用自定义函数实现求阶乘. 参考程序: #include <iostream> using namespace std; long fac(int n); //函数的声明 //下面定义main()函数完成任务,其中求阶乘的工作调用fac()函数完成 //下面定义fac(),实现求阶乘的功能 2. 编制一个返回值为bool型的

C02-程序设计基础提高班(C++)第13周上机任务-多态与虚函数

第13周:阅读教材第12章(p395-416),主要内容是多态性,完成第13周上机任务 (回到C02-程序设计基础提高班(C++)学习安排) [任务1]下面给出了基类Animal和main()函数.(1)根据main()函数给出的注释提示,设计出相关的各个类.(2)显然,Animal设计为抽象类更合适,Animal不需要能够实例化,是专门作基类使用的.改造程序,使Animal设计为抽象类,这时main()函数中p = new Animal();将出错,将此行删除.(3)每一个Animal的派生类