ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ### 题目描述 某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过滤掉。 输入格式: 输入在第一行给出正整数N,取值在(0, 105];随后N行,每行给出1个人的姓名(由不超过5个英文字母组成的字符串)、以及按“yyyy/mm/dd”(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。 输出格式: 在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。 输入样例: 5 John 2001/05/12 Tom 1814/09/06 Ann 2121/01/30 James 1814/09/05 Steve 1967/11/20 输出样例: 3 Tom John ### 分析(伪代码和知识点) #### (1)iostream iostream的意思是输入输出流。直接点说就是in(输入) out(输出) stream(流)。取in、out的首字母与stream合成。 iostream 库的基础是两种命名为 istream 和 ostream 的类型,分别表示输入流和输出流。流是指要从某种 IO 设备上读出或写入的字符序列。术语“流”试图说明字符是随着时间顺序生成或消耗的。 ####(2)using namespace std; 对于一个存在着标准输入输出的C++控制台程序,一般会在#include <iostream>的下一行发现一句话,using namespace std。这句话其实就表示了所有的标准库函数都在标准命名空间std中进行了定义。其作用就在于避免发生重命名的问题 ####(3)C语言标准库函数strcpy 把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间。 例如: 定义一个字符串char a[20],和一个字符串c[]="i am a teacher!"; 把c复制到a中就可以这样用:strcpy(a,c); ####(4)格式说明说明符号 %d是按照十进制整数形式输出,%nd中的n表示有效数字的位数; %c是按照字符型输出;%f是按照浮点数输出;%lf是按照长浮点数输出; %o是按照八进制输出;%x是按照16进制输出;%e是按照科学计数法输出结果。 ### 代码部分C ~~~ #include <stdio.h> #include <string.h> int bigger(char a[20], char b[20]) { int i=0; for(i=0;i<10;i++) { if(a[i]-b[i]>0) return 1;//在c里0为假,1为真。 //在底层0为真,1为假。 //在java里0,1不能表示真假。 if(a[i]-b[i]<0) return 0; } return 0; } int main() { int n,i,count=0; char a[10],old[10],young[10]; char b[20],big[20]="1814/09/05",small[20]="2014/09/07"; scanf("%d", &n); for(i=0;i<n;i++) { scanf("%s %s",a,b); if((bigger(b,"1814/09/05"))&&(bigger("2014/09/07",b))) { count++; if(bigger(b,big)) { strcpy(big,b);//将b与big进行比较,年龄较大的赋 strcpy(old,a);//值给big,同时a的姓名赋值给old } if(bigger(small,b)) { strcpy(small,b);//将b与small进行比较,年龄较小 strcpy(young,a);//给small,同时a的姓名赋值给young } } } if(count>0) printf("%d %s %s\n",count,young,old); else printf("0"); return 0; } ~~~ ### 代码部分C++ ~~~ #include <iostream> #include <string.h> using namespace std; int bigger(char a[20], char b[20]) { int i=0; for(i=0;i<10;i++) { if(a[i]-b[i]>0) return 1;//在c里0为假,1为真。 //在底层0为真,1为假。 //在java里0,1不能表示真假。 if(a[i]-b[i]<0) return 0; } return 0; } int main() { int n,i,count=0; char a[10],old[10],young[10]; char b[20],big[20]="1814/09/05",small[20]="2014/09/07"; scanf("%d", &n); for(i=0;i<n;i++) { scanf("%s %s",a,b);//%c格式对应的是单个字符,%s格式对应的是字符串 if((bigger(b,"1814/09/05"))&&(bigger("2014/09/07",b))) { count++; if(bigger(b,big)) { strcpy(big,b);//将b与big进行比较,年龄较大的赋 strcpy(old,a);//值给big,同时a的姓名赋值给old } if(bigger(small,b)) { strcpy(small,b);//将b与small进行比较,年龄较小 strcpy(young,a);//给small,同时a的姓名赋值给young } } } if(count>0) printf("%d %s %s\n",count,young,old); else printf("0"); system("pause");system(“pause”);是用于结束时暂停,可以看清最后结果 return 0; } ~~~