实验三
1.新建一个空项目,添加上述三个文件到项目中。 补足graph.h中类的成员函数draw()的实现,使得在main()中对类的测试能够实现以下效果: 主函数中测 试代码
代码如下:
//定义一个graph的类 #ifndef GRAPH_H #define GRAPH_H class Graph{ public: Graph(char ch, int n); void draw(); private: char symbol; int size; }; #endif
//类grapg的实现 #include"graph.h" #include<iostream> using std::cout; using std::endl; Graph::Graph(char ch, int n):symbol(ch),size(n){ } void Graph::draw(){ int line=1; for(line=1; line<=size; line++){ int x=0; do{ x++; if((x<=size-line)||(x>=size+line)) cout << " "; else cout << symbol; }while(x<size*2); cout << endl; } }
#include"graph.h" #include<iostream> using namespace std; int main(){ Graph graph1('*',5); graph1.draw(); system("pause"); Graph graph2('$',7); graph2.draw(); system("pause"); return 0; }
运行结果如下:

2.Fraction类对象能够进行如下操作: 加、减、乘、除运算 对两个分数值进行比较运算,返回其大小关系 分数的输入、输出
代码如下:
//定义一个类 #ifndef FRACTION_H #define FRACTION_H class Fraction{ public: Fraction(int top1=0, int bottom1=1); Fraction(const Fraction &f); //复制构造函数 Fraction add(Fraction &a, Fraction&b); //分数加法 Fraction subtract(Fraction &a, Fraction&b); //分数减法 Fraction multiply(Fraction &a, Fraction&b); //相乘 Fraction divide(Fraction &a, Fraction&b); //相除 void print(); //打印 void import(); //输入 void compare(Fraction &a, Fraction&b); //比较 double huajian(Fraction &a); //化简 private: int top; int bottom; }; #endif
#include"fraction.h" #include<iostream> #include<cstring> #include<cmath> using namespace std; int factor(int a, int b){ //求最大公因数 int i=1; if(a==b) i=a; else{ while(i!=0){ i=a%b; a=b; b=i; } } return fabs(a); //避免最后的分母为负数 } Fraction::Fraction(int top1, int bottom1):top(top1),bottom(bottom1){ //构造函数 top1=0; bottom1=1; } Fraction::Fraction( const Fraction &f):top(f.top),bottom(f.bottom){ //复制构造函数 } void Fraction::import(){ //输入 cin >> top >> bottom; if(bottom<0){ bottom=bottom*(-1); top=top*(-1); } if(bottom==0){ cout << "分母不能为0,请重新输入: "; cin >> top >> bottom; } int num=factor(top,bottom); top=top/num; bottom=bottom/num; } void Fraction::print(){ //输出 if(top==0) cout << top << endl; else cout << top << "/" << bottom << endl; } Fraction Fraction::add(Fraction &a, Fraction &b){ //分数相加 Fraction c; c.top=a.top*b.bottom+b.top*a.bottom; c.bottom=a.bottom*b.bottom; int num=factor(top,bottom); c.top=c.top/num; c.bottom=c.bottom/num; return c; } Fraction Fraction::multiply(Fraction &a, Fraction &b){ //分数相乘 Fraction c; c.top=a.top*b.top; c.bottom=a.bottom*b.bottom; int num=factor(top,bottom); c.top=c.top/num; c.bottom=c.bottom/num; return c; } Fraction Fraction::divide(Fraction &a, Fraction &b){ //分数相除 Fraction c; c.top=a.top*b.bottom; c.bottom=a.bottom*b.top; int num=factor(top,bottom); c.top=c.top/num; c.bottom=c.bottom/num; return c; } Fraction Fraction::subtract(Fraction &a, Fraction &b){ //分数相减 Fraction c; c.top=a.top*b.bottom-a.bottom*b.top; c.bottom=a.bottom*b.bottom; int num=factor(top,bottom); c.top=c.top/num; c.bottom=c.bottom/num; return c; } void Fraction::compare(Fraction &a, Fraction &b){ //分数比较 int c1; c1=a.top*b.bottom-a.bottom*b.top; if(c1>0){ cout << a.top << "/" << a.bottom << " > " << b.top << "/" << b.bottom << endl; } if(c1==0){ cout << a.top << "/" << a.bottom << " = " << b.top << "/" << b.bottom << endl; } if(c1<0){ cout << a.top << "/" << a.bottom << " < " << b.top << "/" << b.bottom << endl; } } double Fraction::huajian(Fraction &a){ double num; num=(double)a.top/(double)a.bottom; return num; }
#include"fraction.h" #include<iostream> using namespace std; int main(){ Fraction a; Fraction b(3,4); Fraction c(5); cout << "a: "; a.print(); cout << "b: "; b.print(); cout << "c: "; c.print(); Fraction d; d=d.add(b,c); cout << "b+c= "; d.print(); Fraction d1; d1=d1.subtract(b,c); cout << "b-c= "; d1.print(); Fraction d2; d2=d2.multiply(b,c); cout << "bxc= "; d2.print(); Fraction d3; d3=d3.divide(b,c); cout << "b÷c= "; d3.print(); Fraction d4; cout << "b和c的大小关系为: "; d4.compare(b,c); cout << "请输入分子分母: " << endl; a.import(); cout << "a= "; a.print(); cout << "化为小数为: "; cout << a.huajian(a); return 0; }
运行结果如下:

总结:1.第一个问题相对来说是比较简单的,只是它的for循环比较的巧妙。
2.第二个问题加减乘除部分我的思路很像上次写重载函数complex的思路。先定义一个Fraction,然后return 的也是Fraction。
3.之前苦恼于分母输入为0的时候该咋办,然后仔细思考了一下用一个if然后再给个提示说分母不要输入0应该就行了。
4.化简的时候出现了分母为负数,分子为正数的情况(输入的时候分子为负,分母为正),然后就觉得可能是最大公因数可能为负数的原因,然后那个函数我返回的是最大公因数的绝对值,就好了。
5.一个问题,Fraction::Fraction(int top1=0, int bottom1=1):top(top1),bottom(bottom1){}这么写为什么不行,希望哪位大佬能够评论下。
6.总的来说,这次的实验还是锻炼对构造函数,复制构造函数的应用。
浙公网安备 33010602011771号