考察:在最大最小的基础上增加了判断日期是否合法
learn && wrong:
1、边界值,所有人日期都不合法
2、init()手法可以
3、读取日期的格式,“%d/%d/%d”
*/
/*
输入在第一行给出正整数 N,取值在(0,10
5];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
编程思想:
1、10的5次方,超出范围了吗?不太确定,那就用最大的,我觉得仍旧是用结构体,遍历然后得出最小最大的日期
2、以及合法、合理的日期处理,超过两百岁,以及未出生,按这个思路一定会超过最大值,但是不合理,所以需要处理不合法日期,先判定是否合法,不合法再修改
总结就是:
这题想直接看答案先!因为感觉混淆了!记得不简单
#include <iostream>
using namespace std;
struct person {
char name[10]; //姓名
int yy, mm, dd;//日期
}oldest, youngest, left1, right1, temp;
//oldest与youngest存放最年长与最年轻的人,left与right存放合法日期的左右边界
bool moreuq(person a, person b) { //a的日期如果小于b,返回true
if (a.yy != b.yy) return a.yy >= b.yy;
else if (a.mm != b.mm) return a.mm >= b.mm;
else return a.dd >= b.dd;
}
bool lessequ(person a, person b) {
if (a.yy != b.yy) return a.yy <= b.yy;
else if (a.mm != b.mm) return a.mm <= b.mm;
else return a.dd <= b.dd;
}
//youngest与left为1814年9月6日,oldest与right为2014年9月6日
void init() {
youngest.yy = left1.yy = 1814;
oldest.yy = right1.yy = 2014;
youngest.mm = oldest.mm = left1.mm = right1.mm = 9;
youngest.dd = oldest.dd = left1.dd = right1.dd = 6;
}
int main()
{
init();//初始化youngest,oldest,left,right
int n, num = 0;//num存放合法日期的人数
scanf_s("%d", &n);
for (int i = 0;i < n;i++) {
scanf("%s %d/%d/%d", temp.name, &temp.yy, &temp.mm, &temp.dd);\
if (moreuq(temp, left1) && lessequ(temp, right1)) {
num++;
if (lessequ(temp, oldest)) oldest = temp;//更新oldest
if(moreuq(temp, youngest)) youngest = temp;//更新youngest
}
}
if (num == 0) printf("0\n");
else printf("%d %s %s\n", num, oldest.name, youngest.name);
return 0;
}