C语言实现通讯录的录入与显示,基础编程由此开始(第三十一节)
我们之前在PAT乙级的题目中遇到过结构体,结构体是非常方便的,能帮助存储不同类型的数据项,今天这道题目呢,就是用到了结构体,完成这道题目也显得非常简单。
先来看看这道题目的具体要求:
1、输入在第一行给出正整数N(N<=10)。
2、随后N行,每一行按照格式姓名 生日 性别 固话 手机给出一条记录。
3、其中姓名、生日、性别、固话、手机都要满足一定的要求。
4、在通讯录完成输入后,最后一行给出正整数K,随后输入K个整数,表示要查询的记录编号,编号从0到N-1为止。
5、对每一行要查询的记录编号,用姓名 固话 手机 性别 生日的格式打印,如果该记录不存在,则打印Not Found。
梳理逻辑
这道题目看起来非常复杂,但其实逻辑是很简单的,正如这道题目的分值一样,只有10分。
1、输入正整数N,且N要小于等于10,毫无疑问,这边要用到scanf函数。
2、输入N组数据,就是用到一个for循环。
3、对于这一组信息:姓名 生日 性别 固话 手机,我们使用结构体来存储,且都是用字符型数组。
4、输入整数K与K个整数,分别用到scanf函数和for循环。
5、按照固定格式打印,那就是printf函数要讲究一些。
代码实现
//通讯录的录入与显示#include<stdio.h>struct information{ char name[12];//姓名不超过10个字符 char birthday[17];//生日 char gender[2];//性别 char phone[17];//固话 char mobile[17];//电话};int main(){ int N; int K; int Search[100]; struct information hu[100]; int count = 0;//计数法 scanf('%d',&N);//输入整数N if(N>100){ scanf('%d',&N);//如果N大于100,重新输入 } for(int i=0;i<N;i++){ scanf('%s %s %s %s %s',hu[i].name,hu[i].birthday,hu[i].gender,hu[i].phone,hu[i].mobile); }//循环按照格式要求打印 scanf('%d',&K);//输入整数K for(int i=0;i<K;i++){ scanf('%d',&Search[i]);//K个整数 } for(int i=0;i<K;i++){ if(Search[i]>N-1||Search[i]<0){ if(i<K-1){ printf('Not Found\n'); } else{//解决越界问题和空行问题 printf('Not Found'); } } else if(Search[i]<=N-1&&Search[i]>=0){ if(i<K-1){ printf('%s %s %s %s %s\n',hu[Search[i]].name,hu[Search[i]].phone,hu[Search[i]].mobile,hu[Search[i]].gender,hu[Search[i]].birthday); } else{//解决越界问题和空行问题 printf('%s %s %s %s %s',hu[Search[i]].name,hu[Search[i]].phone,hu[Search[i]].mobile,hu[Search[i]].gender,hu[Search[i]].birthday); } } }}
结果测试
总结
刚开始做这道题目的时候,遇到了一个问题,就是最后结尾的空行怎么去掉,当时没有解决这个问题,而且这道题目也没有把这个当作一个测试点。
如果我把换行符号去掉,可以满足其中的某几个测试点,但会导致数组越界,如果不去掉,就是正确的。
后来我想了想,应该就是i和K-1之间的关系,换行符号如果在末尾的话,那就说明i大于K-1了,那就数组下标越界,导致出错,之后我修改了条件判断语句,就解决了这个问题。
赞 (0)