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

两个类如下设计:类time有三个数据成员,hh,mm,ss,分别代表时,分和秒,并有若干构造函数和一个重载>(<)(大于号或者小于号)的成员函数。类date有三个数据成员,year,month,day分别代表年月日,并有若干构造函数和一个重载>(<)(大于号或者小于号)的成员函数。要求设计一个函数模板template 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 0 0结束。若为date型数据,输入date型数据(year1 month1 day1 year2 month2 day2),以0 0 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 0 0
4 2013 5 14 2013 5 15 2013 4 1 0 0 0
-1
样例输出:
9
6.9
18 21 49
2013 5 15


时间限制
1000 ms
内存限制
65536 kB
代码长度限制
8192 B
判题程序
Standard
来源
重载


#include<iostream>
using namespace std;
class Time
{
  int hh;
  int mm;
  int ss;
  public:
    Time(int r=0){hh=0;mm=0;ss=0;}
    friend istream& operator >>(istream& ,Time&);
    friend ostream& operator <<(ostream& ,Time&);
    friend bool operator >(Time,Time);
};

bool operator >(Time a,Time b)
{
  int s1,s2;
  s1=((a.hh)*60+a.mm)*60+a.ss;
  s2=((b.hh)*60+b.mm)*60+b.ss;
  if(s1>s2)
    return 1;
  return 0;
}

istream& operator >>(istream& in,Time& p)
{
  in>>p.hh>>p.mm>>p.ss;
  return in;
}

ostream& operator <<(ostream& out,Time& p)
{
  out<<p.hh<<" "<<p.mm<<" "<<p.ss;
  return out;
}
class date
{
  int year;
  int month;
  int day;
  public:
    date(int r=0){year=month=day=0;}
    friend istream& operator >>(istream& ,date&);
    friend ostream& operator <<(ostream& ,date&);
    friend bool operator >(date,date);
};

bool operator >(date a,date b)
{
  if(a.year>b.year)
    return 1;
    else if(a.year==b.year)
      if(a.month>b.month)
        return 1;
        else if(a.month>b.month)
          return 1;
          else if(a.month==b.month&&a.day>b.day)
            return 1;
   return 0;
}

istream& operator >>(istream& in,date& p)
{
  in>>p.year>>p.month>>p.day;
  return in;
}

ostream& operator <<(ostream& out,date& p)
{
  out<<p.year<<" "<<p.month<<" "<<p.day;
  return out;
}

template<typename T>
double maxn(T x[], int len)
{
  T temp;
  int i=0,l=0;
  cin>>temp;
  while(temp>0)
  {
    x[i]=temp;
    if(i>0&&temp>x[l])
      l=i;
    i++;
    cin>>temp;
  }
  cout<<x[l]<<endl;
  return 0;
}
int main()
{
  int intArray[100];
  double douArray[100];
  Time timeArray[100];
  date dateArray[100];
  int act;
  cin>>act;
  while(act>0)
  {
    switch(act)
    {
      case 1:maxn(intArray,0);break;
      case 2:maxn(douArray,0);break;
      case 3:maxn(timeArray,0);break;
      case 4:maxn(dateArray,0);break;
    }
    cin>>act;
  }
  return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是代码: 使用函数重载: #include <iostream> using namespace std; int max(int a, int b) { return a > b ? a : b; } float max(float a, float b) { return a > b ? a : b; } double max(double a, double b) { return a > b ? a : b; } char max(char a, char b) { return a > b ? a : b; } template <typename T> void findMinMax(T arr[], int size, T& minValue, T& maxValue) { minValue = maxValue = arr[0]; for (int i = 1; i < size; ++i) { if (arr[i] < minValue) { minValue = arr[i]; } if (arr[i] > maxValue) { maxValue = arr[i]; } } } int main() { int arrInt[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; float arrFloat[] = {1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, 0.1}; double arrDouble[] = {1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89, 8.90, 9.01, 0.12}; char arrChar[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}; int minInt, maxInt; float minFloat, maxFloat; double minDouble, maxDouble; char minChar, maxChar; findMinMax(arrInt, 10, minInt, maxInt); findMinMax(arrFloat, 10, minFloat, maxFloat); findMinMax(arrDouble, 10, minDouble, maxDouble); findMinMax(arrChar, 10, minChar, maxChar); cout << "Int min: " << minInt << ", max: " << maxInt << endl; cout << "Float min: " << minFloat << ", max: " << maxFloat << endl; cout << "Double min: " << minDouble << ", max: " << maxDouble << endl; cout << "Char min: " << minChar << ", max: " << maxChar << endl; return 0; } 使用函数模板: #include <iostream> using namespace std; template <typename T> T max(T x, T y) { return x > y ? x : y; } template <typename T> T min(T x, T y) { return x < y ? x : y; } template <typename T> void findMinMax(T arr[], int size, T& minValue, T& maxValue) { minValue = maxValue = arr[0]; for (int i = 1; i < size; ++i) { if (arr[i] < minValue) { minValue = arr[i]; } if (arr[i] > maxValue) { maxValue = arr[i]; } } } int main() { int arrInt[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; float arrFloat[] = {1.2, 2.3, 3.4, 4.5, 5.6, 6.7, 7.8, 8.9, 9.0, 0.1}; double arrDouble[] = {1.23, 2.34, 3.45, 4.56, 5.67, 6.78, 7.89, 8.90, 9.01, 0.12}; char arrChar[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'}; int minInt, maxInt; float minFloat, maxFloat; double minDouble, maxDouble; char minChar, maxChar; findMinMax(arrInt, 10, minInt, maxInt); findMinMax(arrFloat, 10, minFloat, maxFloat); findMinMax(arrDouble, 10, minDouble, maxDouble); findMinMax(arrChar, 10, minChar, maxChar); cout << "Int min: " << minInt << ", max: " << maxInt << endl; cout << "Float min: " << minFloat << ", max: " << maxFloat << endl; cout << "Double min: " << minDouble << ", max: " << maxDouble << endl; cout << "Char min: " << minChar << ", max: " << maxChar << endl; return 0; } ### 回答2: 使用函数重载函数模板可以实现对不同类型的数求最大值和最小值。 使用函数重载的方法,可以分别创建多个函数来处理不同类型的数据。具体实现如下: ```cpp #include<iostream> #include<algorithm> using namespace std; int findMax(int nums[], int n) { int maxNum = nums[0]; for(int i=1; i<n; i++) { if(nums[i] > maxNum) { maxNum = nums[i]; } } return maxNum; } float findMax(float nums[], int n) { float maxNum = nums[0]; for(int i=1; i<n; i++) { if(nums[i] > maxNum) { maxNum = nums[i]; } } return maxNum; } double findMax(double nums[], int n) { double maxNum = nums[0]; for(int i=1; i<n; i++) { if(nums[i] > maxNum) { maxNum = nums[i]; } } return maxNum; } char findMax(char chars[], int n) { char maxChar = chars[0]; for(int i=1; i<n; i++) { if(chars[i] > maxChar) { maxChar = chars[i]; } } return maxChar; } int findMin(int nums[], int n) { int minNum = nums[0]; for(int i=1; i<n; i++) { if(nums[i] < minNum) { minNum = nums[i]; } } return minNum; } float findMin(float nums[], int n) { float minNum = nums[0]; for(int i=1; i<n; i++) { if(nums[i] < minNum) { minNum = nums[i]; } } return minNum; } double findMin(double nums[], int n) { double minNum = nums[0]; for(int i=1; i<n; i++) { if(nums[i] < minNum) { minNum = nums[i]; } } return minNum; } char findMin(char chars[], int n) { char minChar = chars[0]; for(int i=1; i<n; i++) { if(chars[i] < minChar) { minChar = chars[i]; } } return minChar; } int main() { int int_nums[] = {1, 2, 3, 4, 5}; float float_nums[] = {1.1, 2.2, 3.3, 4.4, 5.5}; double double_nums[] = {1.111, 2.222, 3.333, 4.444, 5.555}; char char_chars[] = {'a', 'b', 'c', 'd', 'e'}; int int_max = findMax(int_nums, 5); int float_max = findMax(float_nums, 5); int double_max = findMax(double_nums, 5); int char_max = findMax(char_chars, 5); int int_min = findMin(int_nums, 5); int float_min = findMin(float_nums, 5); int double_min = findMin(double_nums, 5); int char_min = findMin(char_chars, 5); cout << "int类型数据最大值为:" << int_max << endl; cout << "float类型数据最大值为:" << float_max << endl; cout << "double类型数据最大值为:" << double_max << endl; cout << "char类型数据最大值为:" << int(char_max) << endl; cout << "int类型数据的最小值为:" << int_min << endl; cout << "float类型数据的最小值为:" << float_min << endl; cout << "double类型数据的最小值为:" << double_min << endl; cout << "char类型数据的最小值为:" << int(char_min) << endl; return 0; } ``` 使用函数模板的方法,可以创建一个函数模板来处理不同类型的数据。具体实现如下: ```cpp #include<iostream> #include<algorithm> using namespace std; template<typename T> T findMax(T nums[], int n) { T maxNum = nums[0]; for(int i=1; i<n; i++) { if(nums[i] > maxNum) { maxNum = nums[i]; } } return maxNum; } template<typename T> T findMin(T nums[], int n) { T minNum = nums[0]; for(int i=1; i<n; i++) { if(nums[i] < minNum) { minNum = nums[i]; } } return minNum; } int main() { int int_nums[] = {1, 2, 3, 4, 5}; float float_nums[] = {1.1, 2.2, 3.3, 4.4, 5.5}; double double_nums[] = {1.111, 2.222, 3.333, 4.444, 5.555}; char char_chars[] = {'a', 'b', 'c', 'd', 'e'}; int int_max = findMax(int_nums, 5); float float_max = findMax(float_nums, 5); double double_max = findMax(double_nums, 5); char char_max = findMax(char_chars, 5); int int_min = findMin(int_nums, 5); float float_min = findMin(float_nums, 5); double double_min = findMin(double_nums, 5); char char_min = findMin(char_chars, 5); cout << "int类型数据最大值为:" << int_max << endl; cout << "float类型数据最大值为:" << float_max << endl; cout << "double类型数据最大值为:" << double_max << endl; cout << "char类型数据最大值为:" << int(char_max) << endl; cout << "int类型数据的最小值为:" << int_min << endl; cout << "float类型数据的最小值为:" << float_min << endl; cout << "double类型数据的最小值为:" << double_min << endl; cout << "char类型数据的最小值为:" << int(char_min) << endl; return 0; } ``` 两种方法都可以实现对不同类型数据最大值和最小值求解,根据实际需要选择使用函数重载函数模板。 ### 回答3: 函数重载函数模板分别可以用来实现根据输入数的类型求最大值和最小值。下面是使用函数重载函数模板的代码示例: 函数重载版本: ```cpp #include <iostream> using namespace std; int getMax(int arr[], int n) { int maxVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > maxVal) { maxVal = arr[i]; } } return maxVal; } double getMax(double arr[], int n) { double maxVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > maxVal) { maxVal = arr[i]; } } return maxVal; } char getMax(char arr[], int n) { char maxVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > maxVal) { maxVal = arr[i]; } } return maxVal; } int getMin(int arr[], int n) { int minVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < minVal) { minVal = arr[i]; } } return minVal; } double getMin(double arr[], int n) { double minVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < minVal) { minVal = arr[i]; } } return minVal; } char getMin(char arr[], int n) { char minVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < minVal) { minVal = arr[i]; } } return minVal; } int main() { int intArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; double doubleArr[10] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.0 }; char charArr[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }; int maxInt = getMax(intArr, 10); double maxDouble = getMax(doubleArr, 10); char maxChar = getMax(charArr, 10); int minInt = getMin(intArr, 10); double minDouble = getMin(doubleArr, 10); char minChar = getMin(charArr, 10); cout << "最大整数:" << maxInt << endl; cout << "最大浮点数:" << maxDouble << endl; cout << "最大字符:" << maxChar << endl; cout << "最小整数:" << minInt << endl; cout << "最小浮点数:" << minDouble << endl; cout << "最小字符:" << minChar << endl; return 0; } ``` 函数模板版本: ```cpp #include <iostream> using namespace std; template<typename T> T getMax(T arr[], int n) { T maxVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > maxVal) { maxVal = arr[i]; } } return maxVal; } template<typename T> T getMin(T arr[], int n) { T minVal = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < minVal) { minVal = arr[i]; } } return minVal; } int main() { int intArr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; double doubleArr[10] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9, 10.0 }; char charArr[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' }; int maxInt = getMax(intArr, 10); double maxDouble = getMax(doubleArr, 10); char maxChar = getMax(charArr, 10); int minInt = getMin(intArr, 10); double minDouble = getMin(doubleArr, 10); char minChar = getMin(charArr, 10); cout << "最大整数:" << maxInt << endl; cout << "最大浮点数:" << maxDouble << endl; cout << "最大字符:" << maxChar << endl; cout << "最小整数:" << minInt << endl; cout << "最小浮点数:" << minDouble << endl; cout << "最小字符:" << minChar << endl; return 0; } ``` 无论是函数重载还是函数模板,我们通过输入一个数组和数组长度来求最大值和最小值。由于题目中提到输入的数可能是整形、浮点型、双精度型及其字符类型,所以在函数重载的方法中我们分别定义了不同类型的函数。而在函数模板的方法中,通过使用`typename T`来表示不同的类型。这样就可以实现对不同类型数组的最大值和最小值求解。最后输出最大值和最小值的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值