首页 > 其他 > 详细

实验三 类和对象

时间:2019-04-19 22:54:11      阅读:149      评论:0      收藏:0      [点我收藏+]

part1

测试:

以多文件结构组织的项目文件示例:在画布上可以上下左右移动的小球

测试效果如下:

技术分享图片

part2

以多文件结构写一个程序,头文件是graph.h,要求输入字符和行数,以一个等腰三角形的形式输出。

代码如下:

//graph.h

#ifndef GRAPH_H
#define GRAPH_H

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

#endif

//graph.cpp

// 类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;

    for (j = 0; j < size; j++)
    {
        for (i = 0; i < size- j; i++)
        {
            cout << " ";
        }
        for (i = 0; i < (2 * j + 1); i++)
        {
            cout << symbol;
        }
        cout << endl;
    }

}

//main.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();
    system("pause");
    return 0; 
} 

实验效果如下:

技术分享图片

技术分享图片

part3

要求以多文件结构写一个程序,要求实现分数之间的加减乘除四则运算以及分数之间大小对比。

//fraction.h

#ifndef FRACTION_H
#define FRACTION_H
class fraction 
{
    public: 
        fraction(int top0 = 0, int bottom0 = 1) :top(top0), bottom(bottom0) {}
        friend void add(fraction &a, fraction &b);
        friend void min(fraction &a, fraction &b);
        friend void mul(fraction &a, fraction &b);
        friend void div(fraction &a, fraction &b);
        friend void judge(fraction &a, fraction &b);
        friend void compare(fraction &a, fraction &b);
        friend void put(int & top1, int & bottom1);
        friend void compare(fraction &a, fraction &b);
            
    private: 
        int top;
        int bottom;    // 分母 
};

#endif 

//fraction.cpp

#include"fraction.h"
#include<iostream>
using namespace std;

void judge(fraction &a, fraction &b)
{
    if (a.bottom == 0 || b.bottom == 0)   //判断分母是否为零的边缘情况
    {
        if (a.bottom == 0)
        {
            cout << "分母不可为零,重新输入第一个分数" << endl;
            cin >> a.top >> a.bottom;
        }
        if (b.bottom == 0)
        {
            cout << "分母不可为零,重新输入第二个分数" << endl;
            cin >> b.top >> b.bottom;
        }
    }
}
void  put(int & top1, int & bottom1)   //输出函数,包括约分和输出
{
    int a1, a2;
    if (top1 > 0 && bottom1 < 0)
    {
        top1 = 0-top1;
        bottom1 = 0-bottom1;
    }
    else if (top1 < 0 && bottom1 < 0)
    {
        top1 = -top1;
        bottom1 = -bottom1;
    }

    if (top1 > 0)
    {
        for (a1=top1; a1 > 1;a1--)
        {
            if (top1%a1 == 0)
            {
                for (a2 = bottom1; a2 > 1; a2--)
                {
                    if (bottom1%a2 == 0)
                    {
                        if (a1 == a2)
                        {
                            top1 /= a1;
                            bottom1 /= a2;
                            break;
                        }
                    }
                }
            }
        }

    }
    if (top1 < 0)
    {
        for (a1 = top1; a1 < 1; a1++)
        {
            if (top1 % a1 == 0)
            {
                for (a2 = bottom1; a2 > 1; a2++)
                {
                    if (bottom1%a2 == 0)
                    {
                        if (-a1 == a2)
                        {
                            top1 /= -a1;
                            bottom1 /= a2;
                            break;
                        }
                    }
                }
            }
        }

    }
    
    if (top1 == 0)
        cout << "0" << endl;
    else if (bottom1 != 1)
        cout << top1 << "/" << bottom1 << endl;
    else
        cout << top1;


}
        void add(fraction &a, fraction &b)   //加法
        {
            int put_top,put_bottom;
            put_top = a.top*b.bottom + b.top*a.bottom;
            put_bottom = a.bottom*b.bottom;
            put(put_top, put_bottom);
            cout << endl;
            
        }
        void min(fraction &a, fraction &b)   //减法
        {
            int put_top, put_bottom;
            put_top = a.top*b.bottom - b.top*a.bottom;
            put_bottom = a.bottom*b.bottom;
            put(put_top, put_bottom);
            cout << endl;
        }
        void mul(fraction &a, fraction &b)   //乘法
        {
            int put_top, put_bottom;
            put_top = a.top*b.top;
            put_bottom = a.bottom*b.bottom;
            put(put_top, put_bottom);
            cout << endl;
        }
        void div(fraction &a, fraction &b)   //除法
        {
            int put_top, put_bottom;
            put_top = a.top*b.bottom;
            put_bottom = a.bottom*b.top;
            put(put_top, put_bottom);
            cout << endl;
        }
        void  compare(fraction &a, fraction &b)   //两个分数比大小
        {
            int a1, a2;
            if (a.top > 0 &&a.bottom < 0)
            {
                a.top = 0 - a.top;
                a.bottom = 0 - a.bottom;
            }
            else if (a.top < 0 && a.bottom < 0)
            {
                a.top= -a.top;
                a.bottom = -a.bottom;
            }
            if (b.top > 0 && b.bottom < 0)
            {
                b.top = 0 - b.top;
                b.bottom = 0 - b.bottom;
            }
            else if (b.top < 0 && b.bottom < 0)
            {
                b.top = -b.top;
                b.bottom = -b.bottom;
            }
            if (a.top > 0)
            {
                for (a1 = a.top; a1 > 1; a1--)
                {
                    if (a.top%a1 == 0)
                    {
                        for (a2 =a.bottom; a2 > 1; a2--)
                        {
                            if (a.bottom%a2 == 0)
                            {
                                if (a1 == a2)
                                {
                                    a.top /= a1;
                                    a.bottom /= a2;
                                    break;
                                }
                            }
                        }
                    }
                }

            }
            if (a.top < 0)
            {
                for (a1 = a.top; a1 < -1; a1++)
                {
                    if (a.top% a1 == 0)
                    {
                        for (a2 = a.bottom; a2 > 1; a2++)
                        {
                            if (a.bottom%a2 == 0)
                            {
                                if (-a1 == a2)
                                {
                                    a.top/= -a1;
                                    a.bottom/= a2;
                                    break;
                                }
                            }
                        }
                    }
                }

            }
            if (b.top > 0)
            {
                for (a1 = b.top; a1 > 1; a1--)
                {
                    if (b.top%a1 == 0)
                    {
                        for (a2 = b.bottom; a2 > 1; a2--)
                        {
                            if (b.bottom%a2 == 0)
                            {
                                if (a1 == a2)
                                {
                                    b.top /= a1;
                                    b.bottom /= a2;
                                    break;
                                }
                            }
                        }
                    }
                }

            }
            if (b.top < 0)
            {
                for (a1 = a.top; a1 < -1; a1++)
                {
                    if (b.top% a1 == 0)
                    {
                        for (a2 = b.bottom; a2 > 1; a2++)
                        {
                            if (b.bottom%a2 == 0)
                            {
                                if (-a1 == a2)
                                {
                                    b.top /= -a1;
                                    b.bottom /= a2;
                                    break;
                                }
                            }
                        }
                    }
                }

            }                                        //以上都是对两个分数约分

            if (a.top == 0&&b.top==0)
                cout << "两者相等" << endl;
            else if (a.top==0&&b.top!=0)
            {
                cout << "第二个分数较大" << endl;
            }
                
            else if (a.top != 0 && b.top == 0)
            {
                cout << "第一个分数较大" << endl;
            }
            else if (a.top != 0 && b.top != 0)
            {
                if (a.top*b.bottom > a.bottom*b.top)
                    cout << "第一个分数较大" << endl;
                if (a.top*b.bottom < a.bottom*b.top)
                    cout << "第二个分数较大" << endl;
                if (a.top*b.bottom ==a.bottom*b.top)
                    cout << "两者相等" << endl;
            }

        }
        
        

//main.cpp

#include"fraction.h"
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
    int top1, top2, bottom1, bottom2;
    int top3, bottom3, top4, bottom4;
    cout << "请分别输入两个分数的分子和分母" << endl;
    cin >> top1 >> bottom1;
    cin >> top2 >> bottom2;
    fraction a(top1, bottom1);
    fraction b(top2, bottom2);
    cout << "两分数的和为:" << endl;
    add(a, b);
    cout << "两分数的差为:" << endl;
    min(a, b);
    cout << "两分数的积为:" << endl;
    mul(a, b);
    cout << "两分数的商为:" << endl;
    div(a, b);
    cout << "请分别输入两个对比分数的分子和分母" << endl;
    cin >> top3 >> bottom3;
    cin >> top4 >> bottom4;
    fraction c(top3, bottom3);
    fraction d(top4, bottom4);
    cout<<"两分数的大小关系为:"<<endl;
    compare(c,d);
    system("pause"); 
    return 0;
}

技术分享图片

实验反思:

1.关于第一个ball的测试程序,让我更好的弄明白头文件的构造与实现以及与主函数之间的关系。

2.第二个graph的程序,由于在第一个程序中明白了多文件结构的一些注意点,所以这一个实验并没有在结构上耗费太多的时间,主要就是graph.cpp的实现部分了,一开始写的时候理解错了,把它写成一个每行奇数个字符的直角三角形了,然后在纸上画画方格,最后找到了空格和字符的规律。

3.关于第三个实验,改过好几次,第一次想的是定义一个compute类函数,靠识别加减乘除的运算符号来分别计算,写着写着觉得很乱,就推掉重新再来了,第二次是定义了加减乘除四个友元函数,依此计算,但是当时没有再定义一个输出函数,每一个运算函数里都是包括约分、计算、输出,例如加法,先找出两个形参的分母的最小公倍数,然后分别用公倍数除以之前的分母,所得数再乘以分子,以这样的约分化简过程再继续进行加法运算,后来到了输出的时候发现,这样根本就没考虑分母分子为0或者为复数的情况,默认它是整数了,再把这些都实现在一个加法函数里,太过于麻烦繁琐了。于是又推掉重新再来,这次就加减乘除直接运算,加法分子分母交叉相乘相加,把最后的化简全部仍在输出函数里,这样做可以时加减乘除函数看起来明朗很多很多,体现了区块划分,同时也可以放心的把加减乘除函数类型定义成void,不需要再返回值,像第二次尝试的时候时定义成fraction,返回的也是一个分数,这样写的时候就容易出错。

4.两个分数之间的比较函数我写写完后感觉写得很麻烦,两个分数就是先化简再比较,所以化简部分就与输出函数里的化简部分重复了,我就想能否也把比大小放在输出函数里,在化简的同时顺便比个大小,这样就简洁太多太多了,怎么实现呢?就是把compare函数嵌套在输出函数里,然后在main主函数里不需要再额外专门写两个分数比较大小,直接一开始输入的两个分数进行加减乘除,顺便输出大小关系就好了。所以这里可以再改进一下。

 

实验三 类和对象

原文:https://www.cnblogs.com/21savage-code/p/10720348.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!