分享

C语言实现通讯录的录入与显示,基础编程由此开始(第三十一节)

 好汉勃士 2021-10-20

我们之前在PAT乙级的题目中遇到过结构体,结构体是非常方便的,能帮助存储不同类型的数据项,今天这道题目呢,就是用到了结构体,完成这道题目也显得非常简单。

先来看看这道题目的具体要求:

1、输入在第一行给出正整数N(N<=10)。

2、随后N行,每一行按照格式姓名 生日 性别 固话 手机给出一条记录。

3、其中姓名、生日、性别、固话、手机都要满足一定的要求。

4、在通讯录完成输入后,最后一行给出正整数K,随后输入K个整数,表示要查询的记录编号,编号从0到N-1为止。

5、对每一行要查询的记录编号,用姓名 固话 手机 性别 生日的格式打印,如果该记录不存在,则打印Not Found。

文章图片1

梳理逻辑

这道题目看起来非常复杂,但其实逻辑是很简单的,正如这道题目的分值一样,只有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); } } }}

结果测试

文章图片2
文章图片3

总结

刚开始做这道题目的时候,遇到了一个问题,就是最后结尾的空行怎么去掉,当时没有解决这个问题,而且这道题目也没有把这个当作一个测试点。

如果我把换行符号去掉,可以满足其中的某几个测试点,但会导致数组越界,如果不去掉,就是正确的。

后来我想了想,应该就是i和K-1之间的关系,换行符号如果在末尾的话,那就说明i大于K-1了,那就数组下标越界,导致出错,之后我修改了条件判断语句,就解决了这个问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多