实验三

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.总的来说,这次的实验还是锻炼对构造函数,复制构造函数的应用。

posted @ 2019-04-21 14:42  Joey_Yan  阅读(97)  评论(0)    收藏  举报