这也是本次电带2022期末的一道题,这题用结构体的话不是太难,我也就一次搞定,但是要是不用结构体,那就稍微有点麻烦,由于这才是第一天考c,后面还有时间,大家可以看看我的思路,也希望我的这篇帖子能对大家考试有所帮助,欢迎大家和我讨论。
题目描述
某城镇进行人口普查,得到了全镇居民的生日。请编写程序,找出镇上最年长和最年轻的人。(这里假设镇上没有超过200岁的老人,假设今天是2021年1月9日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉)
输入格式
第一行给出正整数N(≤105)表示普查人数。随后N行,每行为一个人的姓名(由不超过10个英文字母组成的字符串)以及按“yyyy/mm/dd”(即年/月/日,日期数据均合法)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出格式
输出分三行,分别表示有效生日的个数、最年长人和最年轻人的姓名。如果没有有效生日,则输出0。
输入样例1
3
John 2001/05/12
Tom 1910/09/06
Ann 2121/01/30
输出样例1
2
Tom
John
输入样例2
3
John 2022/05/12
Tom 1810/09/06
Ann 2121/02/10
输出样例2
0
注意,要是不满足条件就直接让n--,这样也会方便一点的,
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
typedef struct people
{
char name[10];
int year;
int month;
int day;
}men[100000], temp;
int main()
{
int n, i, j;
scanf("%d", &n);
int t = n;
people men[n], temp;
for(i=0;i<n;i++){
scanf("%s %d/%d/%d", &men[i].name, &men[i].year, &men[i].month, &men[i].day);
}
for(i=0;i<t;i++){
if(men[i].year>2021){ //还未出生
n--;
men[i].year = -1;
continue;
}
else if((men[i].year==2021)&&(men[i].month>1)){ //还未出生
n--;
men[i].year = -1;
continue;
}
else if((men[i].year==2021)&&(men[i].month==1)&&(men[i].day>9)){ //还未出生
n--;
men[i].year = -1;
continue;
}
else if(men[i].year<1821){ //年龄大于200,不符合条件
n--;
men[i].year = -1;
continue;
}
else if((men[i].year==1821)&&(men[i].month==1)&&(men[i].day<9)){ //年龄大于200,不符合条件
n--;
men[i].year = -1;
continue;
}
}
for(i=0;i<t-1;i++){
for(j=0;j<t-i-1;j++){
if(men[i].year<men[i+1].year){ //年份大的年龄小
temp = men[i];
men[i] = men[i+1];
men[i+1] = temp;
}
}
}
if(n>0){
printf("%d\n", n);
printf("%s\n", men[n-1].name); //最年老的
printf("%s\n", men[0].name); //最年轻的
}
else{
printf("0");
}
return 0;
}