B1028 人口普查 (20分)

考察:在最大最小的基础上增加了判断日期是否合法

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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容