实验3 :类和对象
实验结果:
Part1 验证性内容:以多文件结构组织的项目文件示例:在画布上可以上下左右移动的小球
动态图截取如下,和我的预想差距有点大,www。想弄的好看一些,无奈我是个菜鸡,而且时间紧迫。。
/*选做部分*/
/*更改为自我设置画布前景色与背景色
1 #include "pch.h" 2 #include <iostream> 3 #include "canvas.h" 4 #include "Ball.h" 5 int main() { 6 Canvas canvas; //创建默认画布,黑底绿色 7 Ball ball1(10, 10); 8 string s1,s2; 9 system("pause"); 10 ball1.left(5); 11 system("pause"); 12 ball1.up(20); 13 system("pause"); 14 std::cout << "0 = 黑色 8 = 灰色;1 = 蓝色 9 = 淡蓝色;2 = 绿色 A = 淡绿色;3 = 浅绿色 B = 淡浅绿色;4 = 红色 C = 淡红色;5 = 紫色 D = 淡紫色;6 = 黄色 E = 淡黄色;7 = 白色 F = 亮白色" << std::endl << "请更新设置画布前景色" << std::endl; 15 std::cin >> s1; 16 canvas.changeCanvasFg(s1); // 更新画布前景色 17 system("pause"); 18 std::cout << "请更新设置画布背景色" << std::endl; 19 std::cin >> s2; 20 canvas.changeCanvasBg(s2); // 更新画布背景色 21 system("pause"); 22 system("pause"); 23 return 0; 24 }
/*优化小球移动部分的代码,用了switch选择语句
1 #include"pch.h" 2 #include "ball.h" 3 #include <iostream> 4 #include <cstdlib> // 因为使用了system("cls"); 所以需要包含这个头文件 5 using std::cout; 6 using std::endl; 7 const int SIZE_X = 50; // 小球x轴移动范围0~SIZE_X 8 const int SIZE_Y = 50; // 小球y轴移动范围0~SIZE_Y 9 Ball::Ball(int x0, int y0) :x(x0), y(y0) { // 打印y0-1行空行 10 for(int line=1; line <= y0-1; line++) 11 cout << endl;// 打印x0-1个空格 12 for(int col=1; col <= x0-1; col++) 13 cout << " ";// 打印小球 14 cout << "O" << endl; 15 } 16 17 void Ball::moving(char s, int step){ 18 while (s != '0') { 19 switch (s) 20 { 21 case 'w':{ 22 y = y - step; 23 if (y <= 0) 24 y = 0;// 清屏 25 } 26 case 'a': { 27 x = x - step; 28 if (x <= 0) 29 x = 0;// 清屏 30 } 31 case 's':{ 32 y = y + step; 33 if (y >= SIZE_Y) 34 y = SIZE_Y;// 清屏 35 } 36 case 'd':{ 37 x = x + step; 38 if (x >= SIZE_X) 39 x = SIZE_X;// 清屏 40 } 41 default: 42 break; 43 } 44 system("cls");// 打印y-1行空行 45 for (int line = 1; line <= y - 1; line++) 46 cout << endl;// 打印x-1个空格 47 for (int col = 1; col <= x - 1; col++) 48 cout << " ";// 打印小球 49 cout << "O" << endl; 50 } 51 }
Part2 基于已有信息,补足并扩充程序。
在graph文件夹里提供有三个文件: graph.h (类Graph的声明) graph.cpp (类Graph的实现) main.cpp (类Graph的测试: 定义Graph类对象,调用绘图接口绘制图形)
基本代码如下:
1 #pragma once 2 #ifndef GRAPH_H 3 #define GRAPH_H 4 // 类Graph的声明 5 class Graph { 6 public: 7 Graph(char ch, int n);// 带有参数的构造函数 8 void draw(); // 绘制图形 9 Graph(int x0 = 0, int y0 = 0); // 在坐标(x,y)处构造一个符号 10 private: 11 char symbol; 12 int size; 13 int x, y; 14 }; 15 #endif
1 #include"pch.h" 2 // 类graph的实现 3 #include "graph.h" 4 #include <iostream> 5 #include<cstdlib> 6 using namespace std; 7 // 带参数的构造函数的实现 8 Graph::Graph(char ch, int n) : symbol(ch), size(n) { 9 } 10 // 成员函数draw()的实现 11 // 功能:绘制size行,显示字符为symbol的指定图形样式 12 void Graph::draw() { 13 for (int i = 1; i <= size; i++) { 14 15 for (int x = 1; x <= size - i; x++){ 16 if (size-i> 0) 17 cout << " "; 18 }//循环1,用于输出左边空格 19 20 for (int j = 1; j <= 2 * i - 1; j++) { 21 cout << symbol; 22 }//循环2,用于输出符号 23 24 for (int x = 1; x <= size - i; x++) { 25 if (size-i> 0) 26 cout << " "; 27 }//循环3,用于输出左边空格 28 cout << endl; 29 } 30 }
1 // 简单graph.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 // 3 4 #include "pch.h" 5 #include <iostream> 6 #include "graph.h" 7 #include"canvas.h" 8 using namespace std; 9 int main() { 10 char s; 11 int size0; 12 Canvas canvas; 13 Graph graph1('*', 5); 14 system("pause"); 15 Graph graph2('$', 7); 16 graph2.draw(); 17 system("pause"); 18 cout <<endl<< "请您设置新的符号及大小" << endl; 19 cin >> s >> size0; 20 Graph graph3(s, size0);//重新设置符号和大小 21 graph3.draw(); 22 system("pause"); 23 canvas.changeCanvasFg("A"); // 更新画布前景色 24 system("pause"); 25 canvas.changeCanvasBg("E"); // 更新画布背景色 26 system("pause"); 27 return 0; 28 }
/*部分选做如下*/
/*main.cpp中,添加代码,可以自由设置符号及大小*/
/*结合part1,改变画布的前景色与背景色*/
ps:本来还想通过使用二维数组来实现symbol阵整体移动,然后想了想,发现实现的话应该没有什么问题,加上时间比较紧张,就偷个懒没有写,嘻嘻嘻。
1 #pragma once 2 #ifndef CANVAS_H 3 #define CANVAS 4 #include <string> 5 using std::string; 6 class Canvas { 7 public: 8 Canvas(string bg0 = "0", string fg0 = "A"); 9 void changeCanvasBg(string bg0); 10 void changeCanvasFg(string fg0); 11 void changeCanvasColor(string bg0, string fg0); 12 private: 13 string bg; // background color 14 string fg; // foreground color 15 }; 16 #endif
1 #include"pch.h" 2 #include "canvas.h" 3 #include <cstdlib> 4 Canvas::Canvas(string bg0, string fg0) :bg(bg0), fg(fg0) { 5 string color = "color "; 6 color += bg0; 7 color += fg0; 8 system(color.c_str()); 9 } 10 void Canvas::changeCanvasBg(string bg0) { 11 bg = bg0; // 更新画布背景色 12 string color = "color "; 13 color += bg; 14 color += fg; 15 system(color.c_str()); 16 } 17 void Canvas::changeCanvasFg(string fg0) { 18 fg = fg0; // 更新画布前景色 19 string color = "color "; 20 color += bg; 21 color += fg; 22 system(color.c_str()); 23 } 24 void Canvas::changeCanvasColor(string bg0, string fg0) { 25 bg = bg0; // 更新画布背景色 26 fg = fg0; // 更新画布前景色 27 }
/*运行效果截图如下*/
Part3 基于需求描述设计、定义并实现分数类Fraction,并编写代码完成测试。 具体要求如下: 设计一个分数类 Fraction描述分数(两个整数的比值)
基本代码如下:
1 #pragma once 2 #ifndef FRACYION_H 3 #define FRACTION_H 4 5 class Fraction { 6 public: 7 class Fraction(int top0 = 0, int bottom0 = 1) { 8 top = top0; 9 bottom = bottom0; 10 } 11 void print();//第三个参数是分数整数部分,输出前判断是否为0,规范负号位置。 12 friend Fraction calculation(Fraction &F1, Fraction &F2,char operators0);//返回计算出的分数值,未化简。 13 friend Fraction compare(Fraction &F1, Fraction &F2);//返回分子作差比较后的结果,>,=,<的各种判断 14 friend double change(Fraction F1);//实现分数和小数的互相转换 15 private: 16 int top; 17 int bottom; 18 }; 19 20 #endif // !FRACYION_H
1 #include"pch.h" 2 #include"Fraction.h" 3 #include<iostream> 4 using namespace std; 5 6 Fraction calculation(Fraction &F1, Fraction &F2, char operators0) { 7 int r,gcd; 8 int x = F1.bottom, y = F2.bottom; 9 Fraction F3; 10 do { 11 r = x % y; 12 x = y; 13 y = r; 14 } while (r != 0);//r为最大公因数 15 gcd = F1.bottom *F2.bottom / x;//gcd为通分后的分母 16 if (operators0 == '+') { 17 F3.top = F1.top * (gcd / F1.bottom) + F2.top * (gcd / F2.bottom); 18 F3.bottom = gcd; 19 } 20 21 else if (operators0 == '-') { 22 F3.top= F1.top * (gcd / F1.bottom) - F2.top * (gcd / F2.bottom); 23 F3.bottom = gcd; 24 } 25 else if (operators0 == '*') { 26 F3.top = F1.top * F2.top; 27 F3.bottom = F1.bottom * F2.bottom; 28 } 29 else { 30 F3.top = F1.top*F2.bottom; 31 F3.bottom = F1.bottom*F2.top; 32 } 33 return F3; 34 }//返回计算出的分数值,未化简。 35 36 Fraction compare(Fraction &F1, Fraction &F2) { 37 int r,gcd; 38 int x = F1.bottom, y = F2.bottom; 39 do { 40 r = x % y; 41 x = y; 42 y = r; 43 } while (r != 0);//r为最大公因数 44 gcd = F1.bottom*F2.bottom / x; 45 if (F1.top*(gcd / F1.bottom) - F2.top*(gcd / F2.bottom) >= 0) 46 return F1; 47 else 48 return F2; 49 }//比较输出较大的分数。 50 51 void Fraction::print() { 52 if (top == 0) { 53 cout << 0 << endl; 54 } 55 else if (bottom == 0 ) 56 cout << "数据错误,分母不能为0" << endl; 57 else if (bottom < 0) { 58 top *= -1; 59 } 60 else if (bottom == 1) { 61 cout << top << endl; 62 63 } 64 else { 65 int rr, a = top, b = bottom; 66 do { 67 rr = a % b; 68 a = b; 69 b = rr; 70 } while (rr != 0); 71 cout << top / a << "/" << bottom / a << endl; 72 } 73 }//输出最简分数。 74 75 double change(Fraction F1) { 76 double temp; 77 temp = (double)F1.top /(double) F1.bottom; 78 return temp; 79 }//返回分数对应的小数。
1 // 简单Fraction的实现.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 2 // 3 4 #include "pch.h" 5 #include"Fraction.h" 6 #include <iostream> 7 using namespace std; 8 9 int main() { 10 Fraction f; 11 f.print(); 12 char s='+',s1,s2; 13 int top1, top2, bottom1, bottom2; 14 cout << "请分别输入两个分数" << endl; 15 cin >> top1 >> s1 >> bottom1 >> top2 >> s2 >> bottom2; 16 Fraction F1(top1, bottom1), F2(top2, bottom2), F3; 17 cout << "请输入运算符+-*/,按Q退出计算" << endl; 18 while (s!= 'Q') { 19 cin >> s; 20 calculation(F1, F2, s).print(); 21 }//输出两个分数加减乘除后计算的结果。 22 cout << "输出较大的分数"; 23 compare(F1, F2).print();//输出F1,F2中较大的分数。 24 cout << "分数转为小数"; 25 cout << change(F1);//分数转化为小数 26 return 0; 27 }
运行截图如下:
/*程序基本解释*/
设置了用户自己输入分数,并且用户自己输入运算符。
/*选做部分*/
进行了分数最简化;进行了负号统一到分母;进行了分数转换为小数。
/*存在未修改的问题*/
1、在输入Q表示运算结束时会再次输出一个分数,时间紧迫,没能回去检查了。
2、其实最开始自己设计的算法过程非常友好,但是编写过程中出现了一个小问题,就是在求公因数时无意的把0置于分母,结果程序一直不出结果,然后我就疯狂地找bug,结果把很好的框架改乱掉了。预期的框架是类似于用户自己在计算器上对于分数进行运算,每一组出一次结果,直到用户自己终止计算。emmm,现在写成这样,只能算是一个半成品,我准备在最近各种期中考试的浪潮过了之后重新改一改,争取达到预期。
实验感悟:
这次完全由自己设计了一个分数运算的类,虽然有未达预期的地方,但是感觉很不错,计划在这段时间忙完之后再次修改,并且尝试加入更多的数据形式来写一个更加像计算的计算程序。
/*点评地址*/
1、https://www.cnblogs.com/changtingzao/p/10645725.html
2、https://www.cnblogs.com/fifi1224/p/10639198.html