3.详细设计
3.1 模块功能说明
3.1.1 通信录建立模块
创建链表,并返回表头指针 {
创建新节点;
while (判断读入编号) {
读入联系人信息; 保存到指定的域; 指针指向下一新节点; } }
3.1.2通信录输出模块
{
按指定格式输出通讯录表头信息; if(头指针不为空) {
按指定格式输出联系人信息;记录联系人数; } else
通信录为空;
}
3.1.3 通信录添加模块
{
新建节点;
屏幕提示输入要添加的联系人信息;读入联系人信息; 按联系人编号升序排序; }
- 3 -
3.1.4 通信录删除模块
{
提示输入要删除的联系人编号; 读入编号信息; if(找到)
{输出找到的联系人信息; 询问是否删除该联系人; } else
提示没有该联系人; }
3.1.5 通信录查找模块
{
提示输入要查找的联系人身份证号;读入身份证号信息; If(找到)
显示查找到的联系人信息; else
提示没有该联系人; }
- 4 -
4.程序调试与测试
参照教材编写完程序的各个模块后,我们将各个模块和主函数整合,运行之后主要存在以下几个问题:
1. 程序输出信息部分不正确
运行程序,输入通信录中联系人信息后,程序输出的电话号码和身份证号信息错误,有时还会出现负数。经过查找发现在读入联系人信息时,这两项采用了长整型数据类型,但是长整型最大支持的值仍然小于电话号码和身份证号的值。我们换用字符串类型读入信息后为问题解决。
2. 结束联系人信息的输入(以数字0结束)存在问题
运行程序,我们在输入联系人信息完毕后是用数字0结束的,但是当我们输入完信息后,得将下一个联系人的所有信息全部输入为数字0时,程序才会结束输入。针对这个问题我们修改了输入模块的循环体顺序,让程序先判断输入的联系人编号是否为0,是0时结束输入,不是0时继续读入联系人信息。这样在我们结束输入时只需按一次0即可结束输入。
3. 联系人的查找存在问题
我们在查找(用身份证号)联系人时,当我们输入通信录中存在的联系人的身份证号时,程序能准确查找到该联系人;但当我们输入的身份证号信息在通信录中不存在时,程序会非法结束。为此,我们请教了老师,修改了if语句中的判断条件,程序能够在我们输入的身份证号信息不存在时正常提示“通信录中没有该联系人”,问题解决。
因为我们的程序是根据教材中的程序编写的,所以在调试过程中,程序没有出现大的错误,在模块连接上也没有问题,只是有一些输入输出以及一些循环体上的错误。
- 5 -
5.程序清单与执行结果
5.1 程序清单
/*主控菜单程序*/ #include \#include \#include \
struct per /*定义结构体类型*/ { };
struct per *jianli(); /*声明建立通信录函数*/ void shuchu(struct per *head); /*声明输出通信录函数*/ struct per *tianjia(struct per *head); /*声明添加联系人函数*/ struct per *shanchu(struct per *head); /*声明删除联系人函数*/ struct per *chazhao(struct per *head); /*声明查找联系人函数*/ struct per *head=NULL;
void main() /*主函数*/ {
long int num; char name[20]; char tel[12]; char mail[30]; char add[50]; long int mnum; char id[18]; struct per *next;
int select; int pass1; int pass=123456;
printf(\欢迎使用个人通信录管理系统,请输入登录密码:\scanf(\if(pass==pass1) { do{
- 6 -
printf(\登录成功!\\n\\n\
printf(\欢迎进入个人通信录管理系统 ******************\\n\
/*主控菜单*/
printf(\建 立 通 信 录 <<-----------------\printf(\输 出 通 信 录 <<-----------------\printf(\添 加 联 系 人 <<-----------------\printf(\删 除 联 系 人 <<-----------------\printf(\查 找 联 系 人 <<-----------------\printf(\退 出 系 统 <<-----------------\\n\printf(\
printf(\请选择(0---5):\
scanf(\printf(\
switch(select) /*对应模块函数*/ { case 1:
head=jianli();break;
case 2:
shuchu(head);break;
case 3:
head=tianjia(head);break;
case 4:
head=shanchu(head);break;
case 5:
head=chazhao(head);break;
case 0:
break;
default: }
printf(\您的输入有误,请重新输入(0---5):\\n\
}while(select!=0); } else
printf(\对不起,您输入的密码不正确,请按任意键退出程序!!!\\n\\n\
- 7 -