栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Problem G: 分数类的模板数组类

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Problem G: 分数类的模板数组类

 

APPEND CODE

 这个题我个人觉得是有两种版本的,一种是定义不定长数组vector,一种是定义一个指针,个人觉得定义指针比较简单,但是存在对于c++中abs函数的一些体会:

#include

using namespace std;

template

class Array{

public:

    T *p;

    Array(int n)

    {

      p=new T[n];

    }

    void input(int n)

    {   int i=0;

        while(n--)

        {

            cin>>p[i];

            i++;

        }

    }

    T operator[](int i)

    {

        return p[i];

    }

};

int gcd(int a,int b)

{

    return b==0? a:gcd(b,a%b);

}

class Fract{

public:

    int n,m;

    Fract(){}

    Fract(int nn,int mm)

    {

        if(nn<0&&mm<0)

        {nn*=-1;mm*=-1;}

        int a=max(abs(nn),abs(mm));

        int b=min(abs(nn),abs(mm));

        n=nn/gcd(a,b);

        m=mm/gcd(a,b);

    }

    void show()

    {

        if(n==0||m==1)

            cout<

        else if((n<0&&m>0)||(n>0&&m<0))

            cout<<"-"<

        else

            cout<

    }

    Fract operator+=(const Fract&a)

    {

        int x=(abs(a.m)*abs(m))/gcd(max(abs(a.m),abs(m)),min(abs(a.m),abs(m)));

        if(m<0)

            n*=-1;

        int b=x/abs(a.m);

        if(a.m<0)

        {

           b*=-1;

        }

        Fract temp(n*abs(x/m)+a.n*b,x);

        return *this=temp;

    }

    friend istream &operator>>(istream&cin,Fract &t)

    {

        cin>>t.n>>t.m;//重载必须在子块里面写,不能写在模板里,因为在模板里你不知道要输入什么数据,输入几个数据

        return cin;

    }

};

首先注意abs函数,在C语言中,除了abs()函数存在于,其它数学函数都存在于。所以不难想到,在C++中使用abs()函数需要引用的头文件,而不是。因此解释了“将 改为后就编译成功”这一解决方案。同样的,因为fabs()函数存在于,所以将abs()改为fabs()便可正常编译。在以后的编程中,我们还是用下的abs()函数对整型进行操作,用下的fabs()函数对整型进行操作。这样既保险又不容易混淆!

第二个注意这个Fract中的默认无参构造函数,这个函数如果不写的话,会导致编译出错,具体原因应该是因为这个模板数组在调用Fract类作为数组元素的时候,会调用到它的无参构造函数,因为在Array模板数组中(p=new T[n];)这里调用的是Fract的无参构造函数(new class【n】默认的就是调用无参构造函数),所以无参的一定要写。

关于数组调用构造函数的:

 如果构造函数里面没有传任何参数,那么使用new操作符可以进行如下不同于上面的实例化对象和释放内存操作

student *stu4 = new student[3]; //实例化对象数组
delete []stu4;   //释放内存

第二种就是vector的模式:

#include
#include
#include
using namespace std;
 
template < typename T>
class Array
{
public :
     vector a;
     Array( int n) {}
     void input( int n)
     {
         for ( int i=0; i          {
             T tmp;
             cin>>tmp;
             a.push_back(tmp);
         }
     }
     T& operator[]( int n)
     {
         return a[n];
     }
};
 
int cccc( int a, int b)
{
     if (!b)
         return a;
     return cccc(b,a%b);
}
 
class Fract{
public :
     int n,m;
     Fract( int a=0, int b=1):n(a),m(b)
     {
         int Max,Min,c,x,y;
         if (a<0) a*=-1;
         if (b<0) b*=-1;
         c=cccc(max(a,b),min(a,b));
 
         if (m<0)
         {
             n*=-1;
             m*=-1;
         }
         if (c!=1)
         {
             n/=c;
             m/=c;
         }
     }
     void show()
     {
 
         if (n==0||m==1)
             cout<          else
         {
             cout<          }
     }
     Fract &operator +=(Fract &x){
         Fract y(x.n*m+x.m*n,x.m*m);
         return * this =y;
     }
 
     operator double ()
     {
         return ( double )n/m*1.0;
     }
     friend istream &operator>>(istream &is,Fract &f)
     {
         is>>f.n>>f.m;
         return is;
     }
 
 
};
Fract operator *(Fract f1,Fract f2)
{
     Fract f(f1.n*f2.n,f1.m*f2.m);
     return f;
}
 
int main()
{
     int  n;
     cin >> n;
     Array< double > db(1000);
     db.input(n);
     double dbsum(0.0);
     for ( int i = 0; i < n; i++)
         dbsum += db[i];
     cout << dbsum << endl;
 
     cin >> n;
     Array fr(1000);
     fr.input(n);
     Fract frsum(0, 1);
     for ( int i = 0; i < n; i++)
         frsum += fr[i];
     frsum.show();
}

再有就是关于模板函数的介绍,

C++函数模板(模板函数)详解
原文链接:https://blog.csdn.net/low5252/article/details/94622335


                                                                                                              记录当下,我的编程之路

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/965785.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号