第6单元作业【2】- 在线编程(难度:中)

查看帮助

返回
 

温馨提示:

1.本次作业属于Online Judge题目,提交后由系统即时判分。

2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩。

在第5单元作业【4】以及本单元作业【1】的代码基础上,实现类间的继承关系

依照学术诚信条款,我保证此作业是本人独立完成的。

1
以MyShape作为基类,修改MyRectangle类和MyCircle类从MyShape派生(10分)

题目难度:中

 

题目内容:

基于本单元作业【1】的代码,以及第5单元作业【4】的MyRectangle类和MyCircle类进行修改

修改MyShape类

  1. 添加一个成员showShape(),将Draw()函数体中的所有代码都移动到showShape()函数中

  2. 修改Draw()函数的声明,使之成为纯虚函数

  3. 依据下面MyRectangle类以及MyCircle类的需要,修改MyShape的构造函数

修改MyRectangle类:

  1. 以公有方式继承 MyShape 类

  2. 将所有已经移动到MyShape类中的数据成员和函数成员都删除

  3. 修改所有的构造函数
    1)使之能够将基类中的私有成员type_的值设置为字符串“myrectangle”
    2)保留对矩形坐标初始化的代码
    3)必要的话,通过基类构造函数和基类成员函数对已经移动到基类中的数据成员进行初始化
    4)删除构造函数中的所有输出语句

  4. 修改MyRectangle类的Draw()函数,使之仅仅做如下动作:
    1)首先调用基类成员函数 showShape()
    2)然后输出矩形左上角顶点以及矩形宽和高并换行。此处保留原有的代码即可,输出格式同第五单元作业【4】

  5. 删除showScreen()函数

  6. 如有必要,则增加其他数据成员及函数成员

  7. 不要输出任何未要求输出的信息,不然会导致系统扣分。

修改MyCircle类:

  1. 以公有方式继承 MyShape 类

  2. 将所有已经移动到MyShape类中的数据成员和函数成员都删除

  3. 修改所有的构造函数
    1)使之能够将基类中的私有成员type_的值设置为字符串“mycircle”
    2)保留对圆心坐标及半径初始化的代码
    3)必要的话,通过基类构造函数和基类成员函数对已经移动到基类中的数据成员进行初始化
    4)删除构造函数中的所有输出语句

  4. 修改MyCircle类的Draw()函数,使之仅仅做如下动作:
    1)首先调用基类成员函数 showShape()
    2)然后输出圆心坐标、半径并换行。此处保留原有的代码即可,输出格式同第五单元作业【4】,保持不变

  5. 删除showScreen()函数

  6. 如有必要,则增加其他数据成员及函数成员

  7. 不要输出任何未要求输出的信息,不然会导致系统扣分。

main() 函数:

需使用如下main()函数及辅助类Helper(不得更改)

  1. template <typename T>
  2. struct Helper
  3. {
  4. typedef char SmallType;
  5. typedef int LargeType;
  6. template <typename U>
  7. static char Test(U(*)[1]);
  8. template <typename U>
  9. static int Test(...);
  10. const static bool Result = sizeof(Test<T>(NULL)) == sizeof(LargeType);
  11. };
  12. int main() {
  13. int width, height;
  14. cin >> width >> height;
  15. Screen *screen = Screen::getInstance(width, height);
  16. if (!Helper<MyShape>::Result) cout << endl;
  17. MyShape *s1, *s2;
  18. s1 = new MyRectangle();
  19. s1->setScreen(*screen);
  20. s1->setColor(0, 0, 0xff);
  21. s2 = new MyCircle(100,110,50, screen);
  22. s1->Draw();
  23. s2->Draw();
  24. delete s1, s2;
  25. screen->deleteInstance();
  26. #ifdef DEBUG
  27. std::cin.get();
  28. #endif
  29. return 0;
  30. }

输入格式:

空格分隔的整数,代表屏幕宽和高

输出格式:

字符串

输入样例:

600 400

输出样例:

enter screen

[600X400]myrectangle(0,0,255)

10 10 90 90

[600X400]mycircle(255,255,255)

100 110 50

leave screen

注意:输出样例共有7行,最后一行为空行

EGE绘图练习补充说明

当你做完本次作业,这一季的课程就要结束了,即将迎来期末考试。

不过,我希望你能继续将这次在线编程的代码在课后增加EGE的绘图函数,让这些图形真正在屏幕上绘制出来。

你一定会遇到各种困难。但是,成功只属于那些能够克服困难的人。

时间限制:500ms内存限制:32000kb
 
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. class Screen
  7. {
  8. public:
  9. int getWidth();
  10. int getHeight();
  11. public:
  12. ~Screen();//1.为Screen类添加析构函数
  13. static Screen* getInstance(int width, int height);//3.在Screen类中,增加一个静态公有的 getInstance(int width, int height) 函数,该函数返回instance的值。两个参数均带有默认值,分别为 640 和 480
  14. void deleteInstance();//2.在Screen类中,添加一个deleteInstance()函数
  15. private:
  16. int width_;//屏幕的宽
  17. int height_;//屏幕的高
  18. std::string enter;//1.在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”(每个字符串中只有一个空格分隔两个单词)
  19. std::string leave;//1.在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”(每个字符串中只有一个空格分隔两个单词)
  20. static Screen* instance;//2.在Screen类中,增加一个 Screen* 类型的静态的私有数据成员 instance;
  21. private:
  22. Screen(int width, int height);//将Screen类中的所有构造函数都变成 private 成员
  23. void exitWhenInvalidScreen(int width, int height);//检测屏幕的宽与高是否 符合逻辑
  24. };
  25.  
  26. int Screen::getWidth()
  27. {
  28. return width_;
  29. }
  30.  
  31. int Screen::getHeight()
  32. {
  33. return height_;
  34. }
  35.  
  36. Screen::~Screen()//1.为Screen类添加析构函数
  37. {
  38. std::cout << leave << std::endl;//析构函数应首先输出数据成员leave的内容并换行(使用std::endl)
  39. }
  40.  
  41. Screen* Screen::getInstance(int width = 640, int height = 480)//3.在Screen类中,增加一个静态公有的 getInstance(int width, int height) 函数,该函数返回instance的值。两个参数均带有默认值,分别为 640 和 480
  42. {
  43. //4.在getInstance函数中,判断instance的值
  44. // 1) 若instance值为0(即“instance是一个空指针”)
  45. // a.以width和height作为构造函数的参数,使用new运算符创建一个Screen对象
  46. // b.将新的Screen对象的地址保存在instance中;
  47. // 2) 若instance的值不为0(即instance指向一个Screen对象),则返回instance的值
  48. if (!instance)
  49. {
  50. instance = new Screen(width, height);
  51.  
  52. }
  53.  
  54. return instance;
  55. }
  56.  
  57. void Screen::deleteInstance()//2.在Screen类中,添加一个deleteInstance()函数
  58. {
  59. delete instance;//功能:将getInstance()函数中申请的内存归还给操作系统。
  60. instance = 0;//将数据成员instance设置为空指针
  61. }
  62.  
  63. Screen::Screen(int width, int height)//将Screen类中的所有构造函数都变成 private 成员
  64. {
  65. //修改Screen类的构造函数
  66. // 1) 删除Screen类的默认构造函数,只保留带参构造函数,并修改之使其能初始化数据成员
  67. // 2) 删除第4单元作业的Screen类的所有构造函数中的【cout << "screen" << endl; 】语句
  68. // 3) Screen类的所有构造函数【均应输出】数据成员enter中的字符串内容并换行(使用std::endl),但是【不再输出其它信息】
  69. // 4) Screen类的构造函数仍然使用第四单元作业中所要求的exitWhenInvalidScreen函数检查屏幕宽和高的有效性。(可以直接复用第四单元作业的相关代码);该部分代码必须放在输出数据成员enter的代码之后
  70. width_ = width;
  71. height_ = height;
  72. enter = "enter screen";//1.在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”(每个字符串中只有一个空格分隔两个单词)
  73. leave = "leave screen";//1.在Screen类中,添加两个 string 类型的数据成员 enter 和 leave,并在构造函数中将他们分别初始化为字符串“enter screen”和“leave screen”(每个字符串中只有一个空格分隔两个单词)
  74.  
  75. std::cout << enter << std::endl;
  76.  
  77. exitWhenInvalidScreen(width, height);//检测屏幕的宽与高是否 符合逻辑
  78. }
  79.  
  80. void Screen::exitWhenInvalidScreen(int width, int height)//检测屏幕的宽与高是否 符合逻辑
  81. {
  82. if (width <= 0 || height <= 0)//宽度和高度必须大于0像素(不能等于0像素)
  83. {
  84. std::cout << "invalid screen size";//如果宽或者高不满足上述任一条件,则整个程序仅仅输出字符串"invalid screen size",然后退出程序
  85. exit(0);
  86. }
  87.  
  88. if (width > 1000 || height > 1000)//宽度和高度均不得大于1000像素(可以等于1000像素)
  89. {
  90. std::cout << "invalid screen size";
  91. exit(0);
  92. }
  93. }
  94.  
  95. class MyShape
  96. {
  97. public:
  98. //3.MyShape类构造函数:
  99. // 1)根据需要,添加必要的构造函数
  100. // 2)所有构造函数均应将颜色初始化为白色,也就是RGB三个颜色分量的值均为255
  101. MyShape(Screen *screen);
  102. MyShape(std::string string1);
  103. MyShape(std::string string1, Screen *screen);
  104. MyShape();
  105. //1.颜色处理
  106. // 1)将MyRectangle与MyCircle类中表示颜色的数据域成员挪到MyShape类的private区域
  107. // 2)将setColor(int R, int G, int B)函数挪到MyShape类中;
  108. // 3)将颜色数据成员的getter函数挪到MyShape类中;如果原MyRectangle和MyCircle中没有这些getter函数,则在MyShape类中添加。
  109. void setColor(int R, int G, int B);
  110. //2.屏幕处理
  111. // 1)将MyRectangle与MyCircle类中的Screen*类型的成员挪到MyShape类中
  112. // 2)将setScreen函数也挪到MyShape类中
  113. void setScreen(Screen& screen);
  114. //5.在MyShape类中添加函数 Draw(),在Draw()函数中仅仅实现(不要画蛇添足):
  115. // 1) 首先输出屏幕的宽和高,中间以大写的字母“X”连接,并且放置在一对方括号中,形如:[640X480]
  116. // 2) 紧随之后输出数据成员type_的值;
  117. // 3) 紧随之后再输出使用【半角逗号】分隔的三个颜色。这三个颜色放到一对【半角小括号】中,形如:(255, 155, 55),其中不包含任何空格
  118. // 3) 最后使用 std::endl 换行。
  119. virtual void Draw() = 0;//修改MyShape类2.修改Draw()函数的声明,使之成为纯虚函数
  120. void showShape();//修改MyShape类1.添加一个成员showShape(),将Draw()函数体中的所有代码都移动到showShape()函数中
  121. private:
  122. int R_, G_, B_;
  123. Screen* screen_;
  124. //4.添加一个 string 类型的【私有】数据成员 type_
  125. // 1)在 MyShape 的构造函数初始化列表中将其初始化为字符串 "myshape"
  126. // 2)由你自行决定 type_的访问控制属性,只要它不是public访问属性即可
  127. std::string type_;
  128. };
  129.  
  130. MyShape::MyShape(Screen *screen) :R_(255), G_(255), B_(255), type_("myshape")
  131. {
  132. screen_ = screen;
  133. }
  134.  
  135. MyShape::MyShape(std::string string1) : R_(255), G_(255), B_(255), type_(string1)
  136. {
  137.  
  138. }
  139.  
  140. MyShape::MyShape(std::string string1, Screen *screen) : R_(255), G_(255), B_(255), type_(string1)
  141. {
  142. screen_ = screen;
  143. }
  144.  
  145. MyShape::MyShape() :R_(255), G_(255), B_(255), type_("myshape")
  146. {
  147.  
  148. }
  149.  
  150. void MyShape::setColor(int R, int G, int B)
  151. {
  152. R_ = R; G_ = G, B_ = B;
  153. }
  154.  
  155. void MyShape::setScreen(Screen& screen)
  156. {
  157. screen_ = &screen;
  158. }
  159.  
  160. void MyShape::showShape()//修改MyShape类1.添加一个成员showShape(),将Draw()函数体中的所有代码都移动到showShape()函数中
  161. {
  162. std::cout << "[" << screen_->getWidth() << "X" << screen_->getHeight() << "]" << type_ << "(" << R_ << "," << G_ << "," << B_ << ")" << std::endl;
  163. }
  164.  
  165. class MyRectangle :public MyShape {//修改MyRectangle类:1.以公有方式继承 MyShape 类
  166. private:
  167. int x1_, y1_, x2_, y2_;
  168.  
  169. int getWidth() {
  170. return x2_ - x1_;
  171. }
  172.  
  173. int getHeight() {
  174. return y2_ - y1_;
  175. }
  176.  
  177. public:
  178. MyRectangle() :MyShape("myrectangle") {
  179. //修改MyRectangle类:3.修改所有的构造函数
  180. // 1)使之能够将基类中的私有成员type_的值设置为字符串“myrectangle”
  181. // 2)保留对矩形坐标初始化的代码
  182. // 3)必要的话,通过基类构造函数和基类成员函数对已经移动到基类中的数据成员进行初始化
  183. // 4)删除构造函数中的所有输出语句
  184. x1_ = y1_ = 10;
  185. x2_ = y2_ = 100;
  186. }
  187.  
  188. void setCoordinations(int x1, int y1, int x2, int y2) {
  189. x1_ = x1;
  190. y1_ = y1;
  191. x2_ = x2;
  192. y2_ = y2;
  193. }
  194.  
  195. void Draw() {
  196. //修改MyRectangle类:4.修改MyRectangle类的Draw()函数,使之仅仅做如下动作:
  197. // 1)首先调用基类成员函数 showShape()
  198. // 2)然后输出矩形左上角顶点以及矩形宽和高并换行。此处保留原有的代码即可,输出格式同第五单元作业【4】
  199. showShape();
  200. cout << x1_ << " " << y1_ << " " <<
  201. this->getWidth() << " " <<
  202. this->getHeight() << endl;
  203. }
  204. };
  205.  
  206. class MyCircle :public MyShape {//修改MyCircle类:1.以公有方式继承 MyShape 类
  207. private:
  208. int x_, y_, radius_;
  209.  
  210. public:
  211. MyCircle(int x, int y, int radius, Screen* screen) :MyShape("mycircle", screen) {
  212. //修改MyCircle类:3.修改所有的构造函数
  213. // 1)使之能够将基类中的私有成员type_的值设置为字符串“mycircle”
  214. // 2)保留对圆心坐标及半径初始化的代码
  215. // 3)必要的话,通过基类构造函数和基类成员函数对已经移动到基类中的数据成员进行初始化
  216. // 4)删除构造函数中的所有输出语句
  217. x_ = x;
  218. y_ = y;
  219. radius_ = radius;
  220. }
  221.  
  222. void setCenter(int x, int y) {
  223. x_ = x;
  224. y_ = y;
  225. }
  226.  
  227. void setRadius(int radius) {
  228. radius_ = radius;
  229. }
  230.  
  231. void Draw() {
  232. //修改MyCircle类:4.修改MyCircle类的Draw()函数,使之仅仅做如下动作:
  233. // 1)首先调用基类成员函数 showShape()
  234. // 2)然后输出圆心坐标、半径并换行。此处保留原有的代码即可,输出格式同第五单元作业【4】,保持不变
  235. showShape();
  236. cout << x_ << " " << y_ << " " << radius_ << endl;
  237. }
  238. };
  239.  
  240. Screen* Screen::instance;//8.不要忘记在类外对Screen类的所有静态成员进行初始化,否则编译器会报告链接出错。
  241.  
  242. template <typename T>
  243. struct Helper
  244. {
  245. typedef char SmallType;
  246. typedef int LargeType;
  247.  
  248. template <typename U>
  249. static char Test(U(*)[1]);
  250. template <typename U>
  251. static int Test(...);
  252.  
  253. const static bool Result = sizeof(Test<T>(NULL)) == sizeof(LargeType);
  254. };
  255.  
  256. int main() {
  257. int width, height;
  258. cin >> width >> height;
  259.  
  260. Screen *screen = Screen::getInstance(width, height);
  261.  
  262. if (!Helper<MyShape>::Result) cout << endl;
  263. MyShape *s1, *s2;
  264.  
  265. s1 = new MyRectangle();
  266. s1->setScreen(*screen);
  267. s1->setColor(0, 0, 0xff);
  268.  
  269. s2 = new MyCircle(100, 110, 50, screen);
  270.  
  271. s1->Draw();
  272. s2->Draw();
  273.  
  274. delete s1, s2;
  275. screen->deleteInstance();
  276.  
  277. #ifdef DEBUG
  278. std::cin.get();
  279. #endif
  280. return 0;
  281. }

网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)的更多相关文章

  1. 网易云课堂_C++程序设计入门(上)_第5单元:万类霜天竞自由 – 对象和类的更多内容_第5单元作业【4】 - 在线编程(难度:难)

    第5单元作业[4] - 在线编程(难度:难) 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系 ...

  2. 网易云课堂_C++程序设计入门(上)_第1单元:C++概览_第1单元作业 - 写代码 - 互评 (难度:易)

    第1单元作业 - 写代码 - 互评 (难度:易) 查看帮助 返回   提交作业(截止时间已过) 完成并提交作业     作业批改 互评训练   互评作业   自评作业     成绩公布 查看成绩 温 ...

  3. 网易云课堂_C++程序设计入门(上)_第4单元:物以类聚 – 对象和类_第4单元作业【3】- 在线编程(难度:难)

    1 在本单元作业[1]和作业[2]的基础上,创建一个MyRectangle类,并在main函数中创建类的实例.(10分) 题目难度: 难 题目内容: Screen类: 与作业[2]要求完全相同. 如果 ...

  4. 网易云课堂_C++程序设计入门(上)_第2单元:丹青画松石– EGE图形库

    第2节:一个简单的EGE程序 #ifndef _GRAPHICS_H_ #define _GRAPHICS_H_ #ifndef __cplusplus #error You must use C++ ...

  5. 网易云课堂_C++程序设计入门(上)_第3单元:更上一层楼 – 超越C的语法_第3单元作业【3】-在线编程(难度:中;10分)

    1 本题要求实现两个重载的swap函数,每个swap函数都可交换3个整数a,b,c的值.将a的值存入b,b的值存入c,c的值存入a, 并且返回三个整数中最大的数的值.例如a,b,c的值为1,2,3,则 ...

  6. 网易云课堂_C++程序设计入门(下)_期末考试_期末考试在线编程题目

    期末考试在线编程题目 返回考试   本次考试题目一共两个,在考试期间可以不限制次数地提交 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间 ...

  7. 网易云课堂_C++程序设计入门(下)_第7单元:出入虽同趣,所向各有宜 – 文件输入和输出_第7单元 - 作业2:编程互评

    第7单元 - 作业2:编程互评 查看帮助 返回   提交作业(剩余10天) 完成并提交作业     作业批改 互评训练   互评作业   自评作业     成绩公布 查看成绩   由于在线编程不支持 ...

  8. 网易云课堂_C++程序设计入门(下)_第11单元:工欲善其事必先利其器 - STL简介_第11单元 - 单元作业2:OJ编程 - list 与 deque

    第11单元 - 单元作业2:OJ编程 - list 与 deque 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之 ...

  9. 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

    第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

随机推荐

  1. C语言的本质(37)——makefile之隐含规则和模式规则

    Makefile有很多灵活的写法,可以写得更简洁,同时减少出错的可能.本节我们来看看这样一个例子还有哪些改进的余地. 一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写,例如: main.o ...

  2. poj1724

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10804   Accepted: 3976 Descriptio ...

  3. BarTender打印出来的条码与设计的不同如何处理

    今日有用户在使用BarTender设计打印条码时发现自己设计出来的条码与打印显示的条码有不一样的地方,也就是BarTender模板上的条码有显示警戒栏,但打印的条码警戒栏却没了,这一问题要如何解决呢? ...

  4. JQuery中阻止事件冒泡方式及其区别

    JQuery 提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation();         $("#div1").mousedown(function( ...

  5. 巧用DISPLAY_AWR函数与dba_hist_sqlstat结合查询SQL语句在指定节点指定时间范围内的历史执行计划

    1.问题        通过调用dbms_xplan包中DISPLAY_AWR函数(DBMS_XPLAN.DISPLAY_AWR)可以从AWR数据中查看到SQL语句的历史执行计划,但是,DISPLAY ...

  6. AC自动机跟随Kuangbing学习笔记

    http://www.cnblogs.com/kuangbin/p/3164106.html kuangbin的博客 第一段代码基本是COPY kuangbin的.. 1.HDU 2222 Keywo ...

  7. 动态根据checkbox 增加Dom

    <%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage.master" ...

  8. SQL Server 2008 修改表名

     有一张表  修改起 if exists (select * from sys.objects where object_id = object_id(N'Table_1') and type in ...

  9. Android使用NumberPicker控件实现选择城市,生日

    本人菜鸟一枚,第一次写技术博客,有点小紧张,加上代码很乱,求不喷. 先放效果图: 界面就这么简单. 然后放上代码: package com.example.dialog; import java.ut ...

  10. Spring 入门 AOP

    通过一个小例子演视怎么使用 Spring 现实面向切面编程. 导入 Spring 所需要的包 spring-framework-2.5.6 版需要导入以下包: 1.----- spring.jar 2 ...