实验三 类和对象

一、实验内容

 

1、graph类内容补充

代码如下:

#ifndef GRAPH_H
#define GRAPH_H

// 类Graph的声明 
class Graph {
    public:
        Graph(char ch, int n);   // 带有参数的构造函数 
        void draw();     // 绘制图形 
    private:
        char symbol;
        int size;
};


#endif
graph.h
// 类graph的实现
 
#include "graph.h" 
#include <iostream>
using namespace std;

// 带参数的构造函数的实现 
Graph::Graph(char ch, int n): symbol(ch), size(n) {
}


// 成员函数draw()的实现
// 功能:绘制size行,显示字符为symbol的指定图形样式 
void Graph::draw() {
    int i, j, k;
    for (i = 1;i <= size;i++) {
        for (j = 1;j <= size - i;j++)
            cout << ' ';
        for (k = 1;k <= 2 * i - 1;k++)
            cout << symbol;
        cout << endl;
    }
}
graph.cpp
#include <iostream>
#include "graph.h"
using namespace std;

int main() {
    Graph graph1('*',5);
    graph1.draw();
    
    system("pause");
    system("cls");
    
    Graph graph2('$',7);
    graph2.draw();
    
    return 0; 
} 
main.cpp

 效果如下:

              

 

 

2、分数类Fraction加减乘除及比较

#ifndef FRA_H
#define FRA_H

class Fraction {
public:
    Fraction(int t0 = 0, int b0 = 1);
    friend Fraction add(Fraction &f1, Fraction &f2);//加法计算
    friend Fraction sub(Fraction &f1, Fraction &f2);//减法计算
    friend Fraction mul(Fraction &f1, Fraction &f2);//乘法计算
    friend Fraction div(Fraction &f1, Fraction &f2); //除法计算
    friend void com(Fraction &f1, Fraction &f2);     //比较大小
    void sim( );                      //化简
    void transform();           //转化
    void input();                  //输入
    void output();                //输出
private:
    int top;
    int bottom;
};
#endif
Fraction.h
#include"Fraction.h"
#include<iostream>
#include<iomanip>
#include<math.h>
using std::cout;
using std::cin;
using std::endl;

Fraction::Fraction(int t0, int b0):top(t0),bottom(b0){
    if (b0 = 0) {
        cout << "worrong fraction!";
        exit(0);
    }
}

Fraction add(Fraction &f1, Fraction &f2) {
    Fraction ad;
    ad.bottom = f1.bottom*f2.bottom;
    ad.top = f1.top*f2.bottom + f2.top*f1.bottom;
    ad.sim();
    return ad;
}//加法

Fraction sub(Fraction &f1, Fraction &f2) {
    Fraction su;
    su.bottom = f1.bottom*f2.bottom;
    su.top = f1.top*f2.bottom - f2.top*f1.bottom;
    su.sim();
    return su;
}//减法

Fraction mul(Fraction &f1, Fraction &f2) {
    Fraction mu;
    mu.bottom = f1.bottom*f2.bottom;
    mu.top = f1.top*f2.top;
    mu.sim();
    return mu;
}//乘法

Fraction div(Fraction &f1, Fraction &f2) {
    Fraction di;
    di.bottom = f1.bottom*f2.top;
    di.top = f1.top*f2.bottom;
    di.sim();
    return di;
}//除法

void com(Fraction &f1, Fraction &f2) {
    f1.sim();
    f2.sim();
    if (f1.top*f2.bottom > f1.bottom*f2.top)
        cout << f1.top << "/" << f1.bottom << " > " << f2.top << "/" << f2.bottom << endl;
    else if (f1.top*f2.bottom < f1.bottom*f2.top)
        cout << f1.top << "/" << f1.bottom << " < " << f2.top << "/" << f2.bottom << endl;
    else 
        cout << f1.top << "/" << f1.bottom << " = " << f2.top << "/" << f2.bottom << endl;
}//比较

void Fraction::sim() {
    int i;
    if (top != 0) {
        for (i = fabs(top);i >= 1;i--) {
            if (top%i == 0 && bottom%i == 0)
                break;
        }
        top /= i;
        bottom /= i;
    }
    if (bottom*top < 0) {
        top = -fabs(top);
        bottom = fabs(bottom);
    }
    else if (bottom*top > 0) {
        top = fabs(top);
        bottom = fabs(bottom);
    }
}//化简

void Fraction::transform() {
    double p;
    p = top*1.0 / bottom;
    cout << std::setprecision(3) << p << endl;
}//转化

void Fraction::input() {
    cin >> top >> bottom;
}//输入

void Fraction::output() {
    if (top != 0) {
        if (bottom != 1)
            cout << top << "/" << bottom;
        else if (bottom == 1)
            cout << top;
    }
    else cout << "0";
}//输出
Fraction.cpp
#include<iostream>
#include"Fraction.h"
using std::cout;
using std::endl;

int main() {
    Fraction a,b;
    Fraction c1, c2,c3,c4;

    cout << "Enter two Fraction:";
    a.input();
    b.input();

    cout << "a= ";       //输出a的分数和小数形式
    a.output();
    cout  << "= ";
    a.transform();
    cout << endl;


    cout << "b= ";       //输出b的分数和小数形式
    b.output();
    cout << "= ";
    b.transform();
    cout << endl;

    c1=add(a, b);        //a,b相加
    cout << "a+b= ";
    c1.output();
    cout << endl;

    c2=sub(a, b);        //a,b相减
    cout << "a-b= ";
    c2.output();
    cout << endl;

    c3=mul(a, b);        //a,b相乘
    cout << "a*b= ";
    c3.output();
    cout << endl;

    c4=div(a, b);        //a,b相除
    cout << "a/b= ";
    c4.output();
    cout << endl;

    com(a, b);           //比较a,b大小

    system("pause");
    return 0;
}
main.cpp

效果如下:

 

 

二、实验反思

 

  • graph实验需要将图形转化为代数,发现行列间的规律。
  • Fraction.h中需要考虑是否将函数设为友元函数,是否需要带参数,前前后后修改了很多次。
  • Fraction.cpp中多处需要分类讨论,后来修改的时间用的比一开始的框架时间长,考虑要周全。
  • 最后提出疑问,友元函数不能在主函数中引用吗?还是我使用的格式不对?

 

posted @ 2019-04-19 18:26  zuiyankh  阅读(204)  评论(4编辑  收藏  举报