C语言程序上机实习报告电话簿管理系统|c语言程序代码编程小程序设计|c语言课程设计报告课程案例
一 需求分析
设计一个电话簿管理系统,该系统主要有7个功能:(1)输入原始姓名,电话和地址;(2)删除信息;(3)查找信息;(4)插入信息(5)对信息进行排序;(6)输出信息;(7)退出程序。
二 概要设计
1.本程序包含11个函数:
(1)主函数main()
(2)创建单链表create()
(3)显示菜单函数menu()
(4)链表输出函数output()
(5)结点输入函数input()
(6)插入元素函数insert()
(7)删除元素函数delete()
(8)查找函数select()
(9)操作选择函数f()
(10)动画函数dh()
(11)图形函数tp()
2.各函数功能:
(1)main()函数首先调用动画函数dh(),在程序开始运行时显示一幅动画,按任意键退出;
(2)进入图形函数tp(),显示一朵辣色花,按任意键退出;
(3)运行create()函数创建一个由用户输入的单链表(其中包括姓名,电话,地址),并在输入同时调用插入函数insert()对其进行排序;
(4)调用menu()函数,显示操作菜单,由用户输入选择项;
(5)调用f()函数,根据用户输入的选项调用相应的函数,如果选项不合法,要求用户重复输入;
(6)insert()函数,将用户输入的一条记录顺序插入到链表中;
(7)delete()函数,删除与用户输入姓名的相关记录;
(8)select()函数,可以按照姓名或电话号码查找与用户输入相关记录;
(9)在执行以上任一操作后,返回主菜单,执行下一次操作或退出;
(10)在每次操作后,调用output()函数输出当前链表内容;
(11)input()函数,由用户输入一条记录;
三.详细设计
1.链表输入输出函数
因为程序中多次用到链表输入输出,所以设计一个输入函数input()用于输入链表元素,输出函数output()用于链表输出.链表输入函数用指针变量作为形参,调用时将实参地址赋予形参,从而达到目的.链表输出函数也采用指针变量作为形参,调用时将链表首地址赋予形参,通过循环输出链表每一个元素.
2.创建链表排序输出
创建链表采用队列链表,考虑到创建后要进行排序,因此在创建的同时对其进行排序,也就是按顺序创建链表.因此,设想在创建链表时采用插入函数insert(),对其每一项进行顺序插入,在创建链表的同时也进行了排序.这样链表的排序得以实现,而且思路清晰,方法简单.
3.程序代码
下面是以上两个模块的程序代码
1. 输入输出
input(struct tb *p)
{ flushall();/*清空键盘缓冲区,为输入大量数据作准备*/
gets(p->name);
gets(p->tel);
gets(p->add);
}
void output(struct tb *head)
{ struct tb *p;
printf("the linked list is:\n");
for(p=head;p!=NULL;p=p->next)
printf("%-20s%-15s%-45s\n",p->name,p->tel,p->add);/*循环输出链表内容*/
}
2. 创建排序
struct tb *create(void)
{ struct tb *head,*q;
int i;
printf("This is a telenumber book!\nFirst,you should input %d records!\nPress \"enter\" to end the input of the \"name\",\"phonenumber\" and \"address\"!\n",N);
head=NULL;/*创建一个空链表*/
for(i=0;i<N;i++)
{ q=(struct tb *)malloc(L);
input(q);
head=insert(head,q);
}/*通过循环调用插入函数insert()创建顺序链表*/
return head;
}
四.调试分析
1.输入输出
考虑到电话号码可能包含区号,需要将区号和电话号码分隔开来, 由于各人习惯不同,所以将电话号码设计为字符串.这样,就可以采用习惯的分隔符将电话号码和区号分隔开来.但是这样以后,输入项都是大量字符,所以还得加上flushall()函数清空键盘缓冲区,为输入大量数据作准备.这样就解决了gets()函数不能输入的问题.输出链表关键要控制好循环和结束条件.先将指针p指向头指针head,通过p=p->next作为循环条件,而结束条件用p!= NULL 来控制.这样,每次调用output()函数,将头指针传给形参,通过循环就可以输出链表内容.
2.创建排序
创建链表采用队列式,关键是控制尾指针.由于考虑到要排序,所以为了简化程序实现,所以采用插入函数创建链表.创建链表时的每一个输入项都作为新元素插入到链表中,而插入函数是在有序链表的基础上设计的,并且插入也是顺序插入,因此,通过循环调用插入函数就可以实现创建链表和排序.
五.改进设想
1.用户输入数据时应有相应的提示,输入错误时应提示重新输入.添加帮助信息,在用户遇到问题时可以查看相应的帮助文件.输出时也应该使用比较规范的格式.
2. 创建链表应该可以从外部文件中读取信息.排序应设计相应独立的函数,以供其它函数独立调用,而且具有通用性.
3.整个程序初值应该从外部文件中调用,操作结果应该可以保存在外部文件中,以供下次运行时调用.
辣.测试结果
1.建立单链表
输入 zhan san
12345678
shanghai
li si
021-87654321
ligong
wang wu
13579
guangzhou
zhao liu
24680
beijing
ma qi
12345
xianggang
2.排序
输出 li si 021-87654321 ligong
ma qi 12345 xianggang
wang wu 13579 guangzhou
zhang san 12345678 shanghai
zhao liu 24680 beijing
3.查询
输入 1
输入 1
输入 li si
输出 li si 021-87654321 ligong
输入 1
输入 2
输入 12345
输出 ma qi 12345 xianggang
4.插入
输入 2
输入 ba jie 123 taiyuan
输出 ba jie 123 taiyuan
li si 021-87654321 ligong
ma qi 12345 xianggang
wang wu 13579 guangzhou
zhang san 12345678 shanghai
zhao liu 24680 beijing
5.删除
输入 3
输入 ba jie
输出 li si 021-87654321 ligong
ma qi 12345 xianggang
wang wu 13579 guangzhou
zhang san 12345678 shanghai
zhao liu 24680 beijing
输入 5
输出 “菜单”
输入 4
退出程序