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


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

    两个类如下设计:类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
    

    代码

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    //class Time;
    //class date;
    
    class Time{
    	private:
    		int hh;
    		int mm;
    		int ss;
    		int total;
    	public:
    		Time(){
    			
    		};
    	    Time(int h,int m,int s):hh(h),mm(m),ss(s){
    	    	this->cal_total();
    		}	
    	    void cal_total()
    		{
    			this->total=this->hh*3600+this->mm*60+this->ss;
    		}
    		int get_total()
    		{
    			return this->total;
    		}
    		void print()
    		{
    			cout<<this->hh<<" "<<this->mm<<" "<<this->ss<<endl;
    		}
    		bool operator>(Time& out)
    		{
    			if(this->get_total()>out.get_total())
    			   return true;
    			else return false;
    		}
    		bool operator<(Time& out)
    		{
    			if(this->get_total()<out.get_total())
    			   return true;
    			else return false;
    		}
    };
    
    class date{
    	private:
    		int year;
    		int month;
    		int day;
    		int total;
    	public:
    		date(){
    			
    		};
    		date(int y,int m,int d):year(y),month(m),day(d){
    			this->cal_total();
    		}
    		
    		void cal_total()
    		{
    		    this->total=this->year*365+month*30+day;
    		}
    		int get_total()
    		{
    			return this->total;
    		}
    		
    		void print()
    		{
    			cout<<this->year<<" "<<this->month<<" "<<this->day<<endl;
    		}
    		
    			bool operator>(date& out)
    		{
    			if(this->get_total()>out.get_total())
    			   return true;
    			else return false;
    		}
    		bool operator<(date& out)
    		{
    			if(this->get_total()<out.get_total())
    			   return true;
    			else return false;
    		}
    };
    
    template <class T>
    int maxn(T x[], int len)
    {
    	int pos=0;
    	for(int i=0;i<len;i++)
    	{
    		if(x[i]>x[pos])
    		{
    			pos=i;
    		}
    	}
    	return pos;
    }
    
    int main()
    {
    	int intArray[100];
        double douArray[100];
    	Time timeArray[100];
        date dateArray[100];
    	int op;
    	while(1)
    	{
    		cin>>op;
    		if(op==-1)
    		  break;
    		int cnt=0;
    		switch(op)
    	    {
    	    	
    	    	case 1:
    	    		{
    	    		     int x;
    	    		     while(1)
    	    		     {
    	    		     	cin>>x;
    	    		     	if(x==0)
    	    		     	   break;
    	    		     	intArray[cnt++]=x;  
    					 }
    					 int pos= maxn(intArray,cnt);
    					 cout<<intArray[pos]<<endl;
    					 break;
    				}
    			case 2:
    				{
    					 double x;
    	    		     while(1)
    	    		     {
    	    		     	cin>>x;
    	    		     	if(x==0)
    	    		     	   break;
    	    		     	douArray[cnt++]=x;  
    					 }
    					 int pos= maxn(douArray,cnt);
    					 cout<<douArray[pos]<<endl;
    					 break;
    				}
    			case 3:
    				{
    					 int h,m,s;
    	    		     while(1)
    	    		     {
    	    		     	cin>>h;
    	    		     	if(h==0)
    	    		     	   break;
    	    		     	   
    	    		     	cin>>m>>s;
    	    		     	timeArray[cnt++]=Time(h,m,s);  
    					 }
    					 int pos= maxn(timeArray,cnt);
    					 timeArray[pos].print();
    					 break;
    				}
    			case 4:
    				{
    					 int y,m,d;
    	    		     while(1)
    	    		     {
    	    		     	cin>>y;
    	    		     	if(y==0)
    	    		     	   break;
    	    		     	   
    	    		     	cin>>m>>d;
    	    		     	dateArray[cnt++]=date(y,m,d);  
    					 }
    					 int pos= maxn(dateArray,cnt);
    					 dateArray[pos].print();
    					 break;
    				}
    		}
    	}
    	return 0;
    }
    

    注意

    如果使用了#include<bits/stdc++.h>,最好命名不要太显而易见。time这个命名就有点问题。

    小总结

    模板函数

    结构

    template <class T>
    返回类型 函数名(参数列表)
    {
        内容
    }
    

    使用

    直接函数名(参数)
    

    二元运算符重载

    		bool operator运算符(类名& out)
    		{
    			if(比较的内容)
    			   return true;
    			else return false;
    		}
    
  • 相关阅读:
    学习Python的一些Tips
    读书笔记《深入理解计算机系统》(第三版) 第二章 信息的表示
    读书笔记《深入理解计算机系统》(第三版) 第一章 计算机系统漫游
    C 标准库系列之locale.h
    C 标准库系列之limits.h
    C 标准库系列之float.h
    C 标准库系列之errno.h
    C 标准库系列之ctype.h
    C 标准库系列之assert.h
    C 标准库系列之概述
  • 原文地址:https://www.cnblogs.com/BeautifulWater/p/14826246.html
Copyright © 2020-2023  润新知