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()函数存在于 第二个注意这个Fract中的默认无参构造函数,这个函数如果不写的话,会导致编译出错,具体原因应该是因为这个模板数组在调用Fract类作为数组元素的时候,会调用到它的无参构造函数,因为在Array模板数组中(p=new T[n];)这里调用的是Fract的无参构造函数(new class【n】默认的就是调用无参构造函数),所以无参的一定要写。 关于数组调用构造函数的: 如果构造函数里面没有传任何参数,那么使用new操作符可以进行如下不同于上面的实例化对象和释放内存操作 第二种就是vector的模式: #include 再有就是关于模板函数的介绍, C++函数模板(模板函数)详解student *stu4 = new student[3]; //实例化对象数组
delete []stu4; //释放内存
#include
#include
using namespace std;
template < typename T>
class Array
{
public :
vector
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<
{
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.input(n);
Fract frsum(0, 1);
for ( int i = 0; i < n; i++)
frsum += fr[i];
frsum.show();
}
原文链接:https://blog.csdn.net/low5252/article/details/94622335
记录当下,我的编程之路



