打卡 数据的最大值问题(重载+函数模板)

Posted qmz-znv2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打卡 数据的最大值问题(重载+函数模板)相关的知识,希望对你有一定的参考价值。

两个类如下设计:类Time有三个数据成员,hh,mm,ss,分别代表时,分和秒,并有若干构造函数和一个重载-(减号)的成员函数。类Date有三个数据成员,year,month,day分别代表年月日,并有若干构造函数和一个重载>(<)(大于号或者小于号)的成员函数。

要求设计一个函数模板

template <class T>

double maxn(T x[], int len);

对int,float,time和date或者其他类型的数据,返回最大值。

main主函数有如下变量的定义:

int intArray[100];

double douArray[100];

Time timeArray[100];

Date dateArray[100];

其中,hh = 3600 ss, mm = 60 ss, year = 365 day, month = 30 day,对于Time和Date类型,数据在转换成ss或者day后进行运算。

输入格式:

每行为一个操作,每行的第一个数字为元素类型,1为整型元素,2为浮点型元素,3为Time类型,4为Date类型,若为整型元素,接着输入整型数据,以0结束。若为浮点型元素,接着输入浮点型数据,以0结束。若为Time型元素, 输入Time型数据(hh1 mm1 ss1 hh2 mm2 ss2),以0结束。若为Date型数据,输入Date型数据(year1 month1 day1 year2 month2 day2),以0结束。输入-1时表示全体输入结束。

输出格式:

对每次输入,输出一个最大值。

样例输入:

1 4 5 9 3 7 0

2 4.4 5.5 6.9 3.2 2.7 0

3 18 21 22 18 20 31 18 21 49 0

4 2013 5 14 2013 5 15 2013 4 1 0

-1

样例输出:

9

6.9

18 21 49

2013 5 15

思路:通过设置友元函数实现<<运算符重载实现时间的输出,函数模板实现求最大值,通过布尔返回值

      来判断循环条件是否成立。

代码实现:

#include<cmath>
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<iomanip>
#include<iostream>
using namespace std;
typedef long long ll;
class Time

public :
void setx(double a1,double b1,double c1)

h=a1;
m=b1;
s=c1;

bool operator >(Time b)

double sum1,sum2;
sum1=h*3600+m*60+s;
sum2=b.h*3600+b.m*60+b.s;
if(sum1>sum2)

return true;

else
return false;

friend ostream& operator <<(ostream&os ,Time&);
private:
double h,m,s;
;
ostream& operator <<(ostream&os,Time&a)

os<<a.h<<" "<<a.m<<" "<<a.s;

class Date
public :
void setx(double a1,double b1,double c1)

h=a1;
m=b1;
s=c1;

bool operator >(Date b)

double sum1,sum2;
sum1=h*365+m*30+s;
sum2=b.h*365+b.m*30+b.s;
if(sum1>sum2)

return true;

else
return false;

friend ostream& operator <<(ostream& ,Date&);
private:
double h,m,s;
;
ostream& operator <<(ostream&os ,Date&a)
os<<a.h<<" "<<a.m<<" "<<a.s;

template <class T>
double dist(T a[],int n)
T maxx=a[0];
for(int i=1;i<n;i++)
if(a[i]>maxx)
maxx=a[i];


cout<<maxx<<endl;
return 0;

int main()

int n;
cin>>n;
int intArray[100];
double douArray[100];
Time timeArray[100];
Date dateArray[100];
while(n!=-1)
if(n==1)
int a,b=0;
cin>>a;
while(a)
intArray[b]=a;
b++;
cin>>a;

dist(intArray,b);

else if(n==2)
double a;int b=0;
cin>>a;
while(a)
douArray[b]=a;
b++;
cin>>a;

dist(douArray,b);

else if(n==3)
double a1,b1,c1;int b=0;
cin>>a1;
while(a1)
cin>>b1>>c1;
timeArray[b].setx(a1,b1,c1);
cin>>a1;
b++;

dist(timeArray,b);

else if(n==4)
double a1,b1,c1;int b=0;
cin>>a1;
while(a1)
cin>>b1>>c1;
dateArray[b].setx(a1,b1,c1);
cin>>a1;
b++;

dist(dateArray,b);

cin>>n;

return 0;

数据的最大值问题(重载+函数模板)

两个类如下设计:类time有三个数据成员,hh,mm,ss,分别代表时,分和秒,并有若干构造函数和一个重载-(减号)的成员函数。类date有三个数据成员,year,month,day分别代表年月日,并有若干构造函数和一个重载>(<)(大于号或者小于号)的成员函数。

要求设计一个函数模板template <\class T>\ double maxn(T x[], int len) 对int,float,time和date或者其他类型的数据,返回最大值。

主函数有如下数据成员:

int intArray[100];

double douArray[100];time timeArray[100];

date dateArray[100];

其中,hh = 3600 ss, mm = 60 ss, year = 365 day, month = 30 day,对于time和date类型,数据在转换成ss或者day后进行运算。

输入格式:

每行为一个操作,每行的第一个数字为元素类型,1为整型元素,2为浮点型元素,3为time类型,4为date类型,若为整型元素,接着输入整型数据,以0结束。若为浮点型元素,接着输入浮点型数据,以0结束。若为time型元素, 输入time型数据(hh1 mm1 ss1 hh2 mm2 ss2),以0结束。若为date型数据,输入date型数据(year1 month1 day1 year2 month2 day2),以0结束。输入-1时表示全体输入结束。

输出格式:

对每次输入,输出一个最大值。

样例输入:

1 4 5 9 3 7 0

2 4.4 5.5 6.9 3.2 2.7 0

3 18 21 22 18 20 31 18 21 49 0

4 2013 5 14 2013 5 15 2013 4 1 0

-1

样例输出:

9

6.9

18 21 49

2013 5 15

 

------------------------------------------------------------------------------------------------------

                  参靠代码

-------------------------------------------------------------------------------------------------------

  1 #include<iostream>
  2 using namespace std;
  3 //实现Time类 
  4 class Time
  5 {
  6     private:
  7         int hh;
  8         int mm;
  9         int ss;
 10     public:
 11         Time()//无参构造函数 
 12         {
 13             hh = 0;
 14             mm = 0;
 15             ss = 0;
 16         }
 17         void set(int h,int m,int s)//赋值成员数据 
 18         {
 19             hh=h;
 20             mm=m;
 21             ss=s;
 22         }
 23         friend bool operator >(Time &t1,Time &t2);//重载> 
 24         friend ostream & operator <<(ostream &,Time &);//重载<< 
 25 };
 26 //重载Time的> 
 27 bool operator >(Time &t1,Time &t2)
 28 {
 29     int totalSecond1=t1.hh*3600+t1.mm*60+t1.ss;
 30     int totalSecond2=t2.hh*3600+t2.mm*60+t2.ss;
 31     if(totalSecond1>totalSecond2)//用总的秒数比较 
 32         return true;
 33     else
 34         return false;
 35 }
 36 //重载Time的<< 
 37 ostream &operator <<(ostream &output,Time&t)
 38 {
 39     output<<t.hh<<" "<<t.mm<<" "<<t.ss;
 40     return output;
 41 }
 42 //实现date类  
 43 class date
 44 {
 45     private:
 46         int year;
 47         int month;
 48         int day;
 49     public:
 50         date()
 51         {
 52             year = 0;
 53             month = 0;
 54             day = 0;
 55         }
 56         void set(int y,int m,int d)
 57         {
 58             year=y;
 59             month=m;
 60             day=d;
 61         }
 62         friend bool operator >(date &d1,date &d2);
 63         friend ostream & operator <<(ostream &,date &);
 64 };
 65 //重载 >
 66 bool operator >(date &d1,date &d2)
 67 {
 68     int totalDay1=d1.year*365+d1.month*30+d1.day;
 69     int totalDay2=d2.year*365+d2.month*30+d2.day;
 70     if(totalDay1>totalDay2)
 71         return true;
 72     else
 73         return false;
 74 }
 75 //重载<< 
 76 ostream & operator <<(ostream &output,date &d)
 77 {
 78     output<<d.year<<" "<<d.month<<" "<<d.day;
 79     return output;
 80 }
 81 //实现类模板 
 82 template <class T>
 83 T maxn(T x[], int len)
 84 {
 85     T max;
 86     max=x[0];
 87     for(int i=0; i<len; i++)max=max>x[i]?max:x[i];
 88     cout<<max<<endl;//这里的<<已经重载完成可以适应Time和date类 
 89     return max;
 90 }
 91 
 92 int main()
 93 {
 94     //数组数据 
 95     int intArray[100];
 96     double douArray[100];
 97     Time TimeArray[100];
 98     date dateArray[100];
 99     
100     int classType;
101     int i=0;
102     while(cin>>classType)//持续输入 
103     {
104         if(classType==-1)break;
105            switch(classType)
106         {
107             case 1://int 
108             {
109                 while(cin>>intArray[i])//持续输入 
110                    {
111                       if(intArray[i]==0)  break;
112                     i++;
113                 }            
114                 maxn(intArray,i);    
115             }break;
116             case 2://double
117             {
118                 while(cin>>douArray[i])
119                 {
120                     if(douArray[i]==0)   break;
121                         i++;
122                 }
123                 maxn(douArray,i);
124             }break;
125             case 3://Time
126             {
127                 int hour,minute,second;
128                 while(cin>>hour)//独立出hour判断时候使用 
129                 {
130                     if(hour==0)    break;
131                     cin>>minute>>second;
132                     TimeArray[i].set(hour,minute,second);
133                     i++;
134                 }
135             maxn(TimeArray,i);//执行最大值 
136             }break;
137             case 4://date            
138             {
139                 int years,months,days;
140                 while(cin>>years)
141                 {
142                     if(years==0)    break;
143                     cin>>months>>days;
144                     dateArray[i].set(years,months,days);
145                     i++;
146                 }
147                 maxn(dateArray,i);       
148             }break;
149         }
150     }
151     return 0;
152 }

 

以上是关于打卡 数据的最大值问题(重载+函数模板)的主要内容,如果未能解决你的问题,请参考以下文章

数据的间距问题(重载+函数模板)

数据的间距问题(重载+函数模板)

C++学习33 函数模板

函数模板做函数参数

模板函数 重载/特化

使用模板重载类的成员函数