第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/3void 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 pmvoid 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,切换是否前导0private: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:05int 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;
}

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

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

    第9周:阅读教材第8章(p231-262),主要内容是类和对象,学会定义类和对象解决问题,完成第9周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践任务: [任务1]阅读.运行下 ...

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

    第7周:阅读教材第6章(p164-200),主要内容是指针,完成第7周上机任务: (回到C02-程序设计基础提高班(C++)学习安排) 实践内容: 1. (数组的排序) 按模板中的要求,用指向数组的指 ...

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

    第8周:阅读教材第7章(p201-230),主要内容是结构体与自定义类型,同时也希望将同学们将第3-7章的内容整理一下,完成第8周上机任务,本周任务将增加一些对用结构化程序设计技术解决问题的综合性题目 ...

  4. 怎么找到项目中所有同名的类_26岁转行程序员的成长历程--Day03从内存层面理解类和对象...

    今天学习了类.对象及相关知识,试着从内存角度分析三者关系,如果有不对的地方请指正 首先得先介绍java中的三个内存区域: 栈区 用于存放该线程执行方法的信息(实际参数.局部变量等).栈属于线程私有,不 ...

  5. 小程序高级电商前端第1周走进Web全栈工程师<二>

    业务对象的重要性: 在上一次小程序高级电商前端第1周走进Web全栈工程师<一>----小程序注册.开发工具推荐.<风袖>首页布局详尽分析.Webstorm开发小程序必配配置.m ...

  6. PTA程序设计基础6 7-2 字符串合成 (10 分) C语言解法

    用户输入一个字符串,将下标为偶数的字符串提出来合并成一个新的字符串A,再将下标为奇数的字符串提出来合并成一个新的字符串B,再将字符串A和B连接起来输出. 输入格式: 输入一行字符串,如:abcdefg ...

  7. 【Python基础入门系列】第10天:Python 类与对象

    首先,我已经假定你是个萌新或已经看了无数遍的垃圾文章,然后依然搞不懂类和对象,但是呢起码知道有类和对象这么两个玩意儿,我觉得有必要找一篇生动形象的示例来讲解. 由于你可能没有编程经验, 所以无法从学过 ...

  8. C语言程序设计基础OJ练习题(实验十结构体与共用体)

    一.英文金曲大赛 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 我们在"渊 ...

  9. Java语言程序设计基础篇-第10版-第一部分-程序设计基础)

    Java程序语言设计(基础篇)-第10版 第一部分 程序设计基础 第1章 计算机.程序和Java概述 1.1 引言 程序设计就是创建(或者开发)软件,软件也称为程序. 简言之,软件包含了指令,告诉计算 ...

最新文章

  1. 「机器学习速成」过拟合的风险和泛化
  2. Vue - class与style绑定
  3. 【助教】关于代码提交相关注意事项
  4. 网卡驱动:stmmac DMA发送流程
  5. vue 中的动态传参和query传参
  6. 采访拍摄镜头技巧_采访开放文化公司的6个技巧
  7. 在quartusii如何设计出一个 3 位的十进制加法计数器的原理以及它的设计电_从算盘到计算机,从十进制到二进制,人类计算能力的提升...
  8. iOS 简单引导界面
  9. php烟花效果,用p5.js制作烟花特效的示例代码
  10. jquery $(document).ready() 与window.onload的区别(转)
  11. 一个不错的Fortran教程
  12. 第三章 平稳时间序列模型
  13. 腾讯云API弹性公网IP踩坑
  14. 在威联通NAS上实现硬盘独立休眠
  15. 时间管理 |《小强升职记》学习笔记 | Part1
  16. EMI滤波器的matlab仿真,开关电源EMI滤波器的仿真设计
  17. oracle ebs 查询物料现有量sql,Oracle EBS OPM 查询现有量
  18. 数学奥赛VS信息学奥赛(2022.07.19)
  19. 【移动安全】专栏文章汇总
  20. Oracle学习之基础

热门文章

  1. 药物与生物大分子的相互关系(分子与药物以及人体关系)
  2. 【GAL中的标注弹窗功能——Renpy系列1】
  3. GIS中的坐标系问题
  4. Ceph部署(一)集群搭建
  5. 192.168.49.1登录_192.168.1.1登陆页面
  6. 桌面级与企业级硬盘的区别
  7. 【图片流转成图片】vue处理后端传来的图片流信息并转换成图片显示在前端页面上【详细解释】
  8. 微信小程序毕业设计 基于微信茶叶小程序商城系统前后功能和界面参考
  9. 微信小程序获取当前位置及地图选点功能
  10. 爬虫练习--爬取股票数据