自定义实数及其数组

这篇博客探讨了如何使用两个整数来精确表示实数,并基于此设计了一个Double类和DoubleArray类。Double类包含整数和小数部分,而DoubleArray类实现了数组的插入、删除和排序功能。通过示例输入和输出,展示了如何操作这些自定义实数数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义实数及其数组

Description
众所周知,实数在计算机内是不能精确表示的,有些实数在存储时会产生误差。为解决这个问题,对于小数部分不包含前导和后缀0的实数(0除外),可以用两个整数分别来表示其整数部分和小数部分。如:3.14,可以分解为3和14。请基于这一思想,设计一个程序,用两个整数来表示一个实数,并利用这个新的实数类型构建一个数组,实现数组的元素插入、删除和排序。
具体而言,需要定义2个类:
1.Double类。属性为2个int类型的整数,分别为实数的整数部分和小数部分。如:原来的实数为3.14,则Double类的两个属性分别是3、14。其方法至少包括:可以接收2个整数作为参数的构造函数、缺省构造函数。
2. DoubleArray类。包括一个Double*类型的属性和一个int类型的属性,分别为数组元素和长度。该类至少包括如下方法:
(1)构造函数DoubleArray(int* a, int *b, int n):n为a、b的元素个数,相同位置的a和b的值为一个实数的整数部分和小数部分。如:若a={1,3},b={2,4},n=2,则表示有2个实数:1.2和3.4。
(2)show()方法:显示所有的元素。输出时,数组元素两两之间用1个空格隔开,且前后无多余空格,最后输出一个换行符。
(3)sortArray(bool):对数组进行排序。当参数值为true时,排序结果为递增序;否则为递减序。
(4)insertAtPos(Double, int):在第2个参数指定的位置插入第1个参数给定的对象。注意:对于长度为n的数组,合法的插入位置为[0,n]。
(5)deleteADouble(Double):删除数组中所有与给定参数相等的元素。

实际应用中,要注意:
1. 上述方法的返回值是什么?要根据main函数的调用方法来确定。
2. 仅有上述函数远远不能很好地解决这个问题,需要在Double和DoubleArray中添加其他必要的成员函数。

Input
输入有多行。第一行N>0,表示之后有N个Double类型的对象,之后的N行,每行包括2个用空格隔开的整数,分别是一个Double对象的整数部分和小数部分。
接下来的一行是一个正整数M,表示之后有M行输入,每行输入是两两之间用1个空格隔开的3个整数,前2个整数代表了要插入到当前DoubleArray对象中的一个Double对象,第3个表示插入的位置。

Output
见样例。

Sample Input
3
91 13
89 313
123454 1121
5
1 2 0
3 4 5
5 6 3
0 0 1
0 0 4

Sample Output
91.13 89.313 123454.1121
89.313 91.13 123454.1121
123454.1121 91.13 89.313
1.2 0.0 123454.1121 91.13 0.0 5.6 89.313
1.2 123454.1121 91.13 5.6 89.313

#include <iostream>
#include <algorithm>

using namespace std;
class Double
{
private:
    int a,b;
    friend class DoubleArray;
  public:
//      Double()
//      {
//          a=0;b=0;
//      }
    Double(int a1=0,int b1=0)
    {
        a=a1;b=b1;
    }
    Double(const Double &p1)
    {
        a=p1.a;
        b=p1.b;
    }


};
class DoubleArray
{
private:
    Double *p;
    int l;
public:
    DoubleArray(int* a11, int *b11, int n)
    {
        l=n;
        p=new Double[l];

        for(int i=0;i<l;i++)
        {
            p[i].a=a11[i];
            p[i].b=b11[i];
        }
    }
    void show()
    {
        for(int i=0;i<l;i++)
        {
            if(i==0)
                cout<<p[i].a<<"."<<p[i].b;
            else
                cout<<" "<<p[i].a<<"."<<p[i].b;
        }
        cout<<endl;
    }
    DoubleArray &sortArray(bool t)
    {
        if(t)
        {
            for(int i=1;i<=l-1;i++)
            {
                for(int j=0;j<l-i;j++)
                {
                    if(p[j].a>p[j+1].a||(p[j].a==p[j+1].a&&p[j].b>p[j+1].b))
                    {
                        int t1=0,t2=0;
                        t1=p[j].a;
                        t2=p[j].b;
                        p[j].a=p[j+1].a;
                        p[j+1].a=t1;
                        p[j].b=p[j+1].b;
                        p[j+1].b=t2;
                    }
                }
            }
        }
        else
        {
            for(int i=1;i<=l-1;i++)
            {
                for(int j=0;j<l-i;j++)
                {
                    if(p[j].a<p[j+1].a||(p[j].a==p[j+1].a&&p[j].b<p[j+1].b))
                    {
                        int t1,t2;
                        t1=p[j].a;t2=p[j].b;
                        p[j].a=p[j+1].a;
                        p[j+1].a=t1;

                        p[j].b=p[j+1].b;
                        p[j+1].b=t2;



                    }
                }
            }
        }
        return *this;
    }
    void insertAtPos(Double x,int q)
    {
        if(q<0||q>l)
            return ;
        Double p1[l+1];
        for(int i=0;i<q;i++)
        {
            p1[i]=p[i];

        }
        p1[q]=x;
        for(int i=q+1;i<l+1;i++)
        {
            p1[i]=p[i-1];
        }
        delete []p;
        p=new Double[l+1];
        for(int i=0;i<l+1;i++)
        {
            p[i]=p1[i];
        }
        l=l+1;
    }
    DoubleArray &deleteADouble(Double x11)
    {
        Double p2[l];
        int f=0;
        for(int i=0; i<=l;i++)
        {
            if(p[i].a!=x11.a||p[i].b!=x11.b)
            {
                p2[f++]=p[i];

            }
        }
        delete []p;
        p=new Double[f];
        l=f-1;
        for(int i=0;i<f;i++)
        {
           p[i]=p2[i];
        }
        return *this;
    }


    ~DoubleArray()
    {
        delete []p;
    }

};
int main()
{
    Double one, two(10,10);
    int num, i, a, b, c, *iPart, *dPart;
    cin>>num;
    iPart = new int[num];
    dPart = new int[num];
    for (i = 0; i < num; i++)
    {
        cin>>iPart[i]>>dPart[i];
    }
    DoubleArray test(iPart, dPart, num);
    test.show();
    test.sortArray(true).show();
    test.sortArray(false).show();
    cin>>num;
    for (i = 0; i < num; i++)
    {
        cin>>a>>b>>c;
        test.insertAtPos(Double(a, b), c);
    }
    test.show();
    test.deleteADouble(Double()).show();
    delete[] iPart;
    delete[] dPart;
    return 0;
}

if里面一定要用双==啊,卡了好久。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值