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);//计算并返回三角形的面积
	void showMessage();
private:
	float a,b,c; //三边为私有成员数据
};

void Triangle:: showMessage()
{
	cout<<”三角形的三边长分别为:”<<a<<'\t'<<<<b<<<<'\t'<<<<c<<endl;
	cout<<"该三角形的周长为:"<< perimeter()<<'\t'<<"面积为:"<< area()<<endl<<endl;
}

void main(void)
{
	Triangle Tri1;	//定义三角形类的一个实例(对象)
	Tri1.showMessage();
	Triangle Tri2(7,8,9);	//定义三角形类的一个实例(对象)
	Tri2.showMessage();
}

特别要求:为全面体会构造函数的各种写法,本任务要求提交多个版本的程序,体现出你已经掌握下列知识点:(1)使用带参数构造函数,即Triangle(float x, float y, float z),三边长在调用时由实参直接给出;(2)设计默认构造函数,即不指定参数时,默认各边长为1;(3)使用默认参数的构造函数,不给定实参时,默认边长为1;(4)在构造函数中使用参数初始化表对数据成员初始化。
[ 参考:三角形类中的构造函数 -http://blog.csdn.net/sxhelijian/article/details/7366083 ]

任务1拓展:请自行设计一个矩形类,可以计算长方形的面积、周长、对象线,判断是否是正方形。请用上构造函数。

【任务2】C++中提供了多种基本的数据类型。实际上,这些远不能满足我们的需求,如复数(第10章的例子大多是处理虚数的),再如分数。本任务将设计一个简单的分数类,完成对分数的几个运算。一则巩固基于对象编程的方法,二则也为第10章做运算符重载等积累些感性认识。
任务要求:完成下面类的设计,并在main()函数中自行定义对象,调用各成员函数,完成基本的测试。

class CFraction
{private:
	int nume;  // 分子
	int deno;  // 分母
 public:
	CFraction(int nu=0,int de=1);   //构造函数,初始化用
	void Set(int nu=0,int de=1);    //置值,改变值时用
	void input();				//按照"nu/de"的格式,如"5/2"的形式输入
	void Simplify();				//化简(使分子分母没有公因子)
	void amplify(int n);			//放大n倍,如2/3放大5倍为10/3
	void output(int style=0);		//输出:以8/6为例,style为0时,输出8/6;
								//style为1时,输出4/3;
								//style为2时,输出1(1/3),表示一又三分之一;
								//不给出参数和非1、2,认为是方式0
};

任务2拓展1:上面output(int style=0)中的输出方式style的类型最适合使用自定义的枚举类(见第7章)了,试着改造一下。

[ 参考:分数类(拓展1) -http://blog.csdn.net/sxhelijian/article/details/7366441 ]

任务2拓展2:这个思考题吊一下大家的胃口:设定义了两个分数类的对象,如CFraction c1, c2。如果定义了int i,我们能用cin>>i;在键盘上输入i的值,是否期望用cin>>c1>>c2;输入分数呢?同理,用cout<<c1<<c2;进行输出,可以吗?进一步,用c1+c2得到新的一个分数,用c1/c2实现两个分数的除法,以及其他加、减、比较、求倒数等也是理所当然的。实际上,要自定义分数类,这些直观的基本运算应该要实现,这叫运算符的重载。本任务中用amplify()给出了“放大”运算的一种实现方案,更多内容值得期待地。

【任务3】编写基于对象的程序,求5个长方柱的体积和表面积。长方柱类的数据成员包括长(length)、宽(width)、高(heigth)等。另外:
(1)需要定义长方柱类,5个长方柱采用一个对象数组表示;
(2)前4个长方柱(即数组的前4个元素)要在定义数组时初始化,其中前3个直接给出参数初始化,第4个用默认构造函数初始化;第5个长方柱定义时不初始化,而是由键盘输入长、宽、高赋值;
(3)输出这5个长方柱的体积和表面积;
[ 参考:长方柱类数组 -http://blog.csdn.net/sxhelijian/article/details/7371175 ]

【任务4】设计一个学生类,包括学号(num)和成绩(score)。建立一个对象数组,内放5个学生的数据,要求:
(1)用指针指向数组首元素,输出第1、3、5个学生的信息;
(2)设计一个函数max,用指向对象的指针作函数参数,在max函数中找出5个学生中成绩最高者,并输出其学号。
[ 参考:学生类数组 - http://blog.csdn.net/sxhelijian/article/details/7371223 ]

【任务5】设计平面坐标点类,计算两点之间距离、到原点距离、关于坐标轴和原点的对称点等

enum SymmetricStyle { axisx,axisy,point};//分别表示按x轴, y轴, 原点对称
class CPoint
{private:
	double x;  // 横坐标
	double y;  // 纵坐标
public:
	CPoint(double xx=0,double yy=0);
	double Distance(CPoint p) const;   // 两点之间的距离(一点是当前点,另一点为参数p)
	double Distance0() const;          // 到原点的距离
	CPoint SymmetricAxis(SymmetricStyle style) const;   // 返回对称点
	void input();  //以x,y 形式输入坐标点
	void output(); //以(x,y) 形式输出坐标点
};

[ 参考:设计平面坐标点类 - http://blog.csdn.net/sxhelijian/article/details/7397313 ]

【任务6】设计一个三角形类,能够输入三角形的三个顶点,求出其面积、周长,并判断其是否为直角三角形和等腰三角形。
提示:(1)这个问题需要用到两个类,顶点类参照任务3中的CPoint类;(2)三角形类参考下面CTriangle类的声明;(3)充分利用CPoint类中已有的代码实现;(4)关于三条边的处理,可以增加三个私有属性,在初始化时求出来备用,也可以在需要时计算得到。

class CTriangle
{
public:
	CTriangle(CPoint &X,CPoint &Y,CPoint &Z):A(X),B(Y),C(Z){} //给出三点的构造函数
	void setTriangle(CPoint &X,CPoint &Y,CPoint &Z);//
	float perimeter(void);//计算三角形的周长
	float area(void);//计算并返回三角形的面积
	bool isRightTriangle(); //是否为直角三角形
	bool isIsoscelesTriangle(); //是否为等腰三角形
private:
	CPoint A,B,C; //三顶点
};

[ 参考:用点类作成员的三角形类 - http://blog.csdn.net/sxhelijian/article/details/7397317]

【任务7】将任务6的解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。体会这样安排的优点。
[ 参考:多文件组织三角形类 - http://blog.csdn.net/sxhelijian/article/details/7397334 ]

【任务8】含有静态数据成员和成员函数的Time类:类中所有的对象共有的数据

class Time
{
public:
	Time(int=0,int=0,int=0);
	void show_time( ); //根据is_24和from0,输出适合形式-20:23:5/8:23:5 pm/08:23:05 pm
	void add_seconds(int); //增加n秒钟
	void add_minutes(int); //增加n分钟
	void add_hours(int); //增加n小时
	static void change24();  //改变静态成员is_24,在12和24时制之间转换
	static void changefrom0();   //改变静态成员from0,切换是否前导0
 private:
	static bool is_24; //为true时,24小时制,如20:23:5;为flase,12小时制,显示为8:23:5 pm
	static bool from0; //为true时,前导0,8:23:5显示为08:23:05
	int hour;
	int minute;
	int sec;
};
//下面写出静态成员的初始化及各成员函数的定义
……
int main( ) //运行结果如下图所示
{  }


[ 参考:静态数据成员和静态成员函数 - http://blog.csdn.net/sxhelijian/article/details/7422511 ]

【任务9】阅读下面的程序,仔细阅读注释。然后模仿完成求点类中距离的任务。

//例:使用成员函数、友元函数和一般函数的区别
#include <iostream>
using namespace std;
class Time
{
public:
	Time(int h,int m,int s):hour(h),minute(m),sec(s){}
	void display1(); //成员函数声明
	friend void display2(Time &);  //友元函数声明
	int getHour(){return hour;}
	int getMinute(){return minute;}
	int getSec(){return sec;}
 private:
	int hour;
	int minute;
	int sec;
};
void display3(Time &);  //一般函数声明

void Time::display1()  //成员函数的实现,dispaly1前加Time::
{
	//以hour形式直接访问私有数据成员,实质是this->hour形式
	cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
void display2(Time &t)  //友元函数的实现,dispaly2前不加Time::,并不是类的成员函数
{
	//不是类的成员函数,却可以t.hour的形式直接访问私有数据成员——友元
	cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;
}
void display3(Time &t)  //一般函数的实现,dispaly1前加Time::
{
	//只能用公共接口t.getHour()形式访问私有数据成员
	cout<<t.getHour()<<":"<<t.getMinute()<<":"<<t.getSec()<<endl;
}
int main()
{
	Time t1(10,13,56);
	t1.display1();  //成员函数这样调用
	display2(t1);   //友员函数调用和一般函数无异
	display3(t1);   //一般函数的调用
	system("pause");
	return 0;
}
你需要完成的任务是,利用成员函数、友元函数和一般函数,实现三个版本的求两点间距离的函数,并设计main()函数完成测试。此任务和上例的区别在于“距离是一个点和另外一个点的距离”,参数个数上有体现。下面是点类的部分代码。
class CPoint
{
private:
    double x;  // 横坐标
    double y;  // 纵坐标
 public:
    CPoint(double xx=0,double yy=0):x(xx),y(yy){}
    ……//请继续写需要的代码
};

[ 参考:使用成员函数、友元函数和一般函数-http://blog.csdn.net/sxhelijian/article/details/7422541]

【任务10】阅读P314的例10.1(代码见附)。该例实现了一个复数类,但是美中不足的是,复数类的实部和虚部都固定只能是double型的。可以通过模板类的技术手段,设计Complex,使实部和虚部的类型为定义对象时用的实际类型。
(1)要求类成员函数在类外定义。
(2)在此基础上,再实现减法、乘法和除法
你可以使用的main()函数如下。

int main( )
{
	Complex<int> c1(3,4),c2(5,-10),c3;
	c3=c1.complex_add(c2);
	cout<<"c1+c2=";
	c3.display( );
	Complex<double> c4(3.1,4.4),c5(5.34,-10.21),c6;
	c6=c4.complex_add(c5);
	cout<<"c4+c5=";
	c6.display( );
	system("pause");
	return 0;
}

[ 参考:复数模板类 - http://blog.csdn.net/sxhelijian/article/details/7422933 ]

附:例10.1代码

#include <iostream>
using namespace std;
class Complex
{
public:
	Complex( ){real=0;imag=0;}
	Complex(double r,double i){real=r;imag=i;}
	Complex complex_add(Complex &c2);
	void display( );
private:
	double real;
	double imag;
};
Complex Complex::complex_add(Complex &c2)
{
	Complex c;
	c.real=real+c2.real;
	c.imag=imag+c2.imag;
	return c;
}
void Complex::display( )
{
	cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
int main( )
{
	Complex c1(3,4),c2(5,-10),c3;
	c3=c1.complex_add(c2);
	cout<<"c1="; c1.display( );
	cout<<"c2="; c2.display( );
	cout<<"c1+c2="; c3.display( );
	return 0;
}
时间: 2024-10-02 08:39:50

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

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++)第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;} Comple

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

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

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

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

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++)第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的派生类