c语言课程设计通讯录.docx
《c语言课程设计通讯录.docx》由会员分享,可在线阅读,更多相关《c语言课程设计通讯录.docx(14页珍藏版)》请在冰点文库上搜索。
c语言课程设计通讯录
电气信息工程学院
课程设计报告
2010—2011学年第2学期
课程名称C语言课程设计
设计题目实用的小型通讯录
学生姓名
指导老师刘跃峰
学号
专业班级电子信息科学与技术
一、课程设计目的
1、通过课程设计,加深对结构化设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。
2、通过课程设计,学会设计数据结构。
其中包括对结构数组、数据文件等知识的运用。
3、通过课程设计,提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。
4、通过课程设计,训练C程序调试能力,能将一个中小型各级组织系统联调通过。
5、通过课程设计,开发一个中小型系统,掌握系统研发全过程。
6、通话课程设计,培养分析问题、解决实际问题的能力。
二、课程设计内容及要求
课程设计通讯录管理系统,能以简便高效的方式对通讯录进行管理和检索,具体要示:
(1)录入:
联系人信息包括:
姓名,电话。
以结构数组或数据文件的形式存放通讯录信息。
(2)更新:
能插入、修改、删除通讯录信息。
(3)浏览:
按录入先后为序进行通讯录信息浏览。
(4)查询:
能实现指定联系人信息查询或指定电话号码查询功能。
(5)系统以菜单方式工作,界面友好,易于操作,容错性好。
三、总体设计
1、模块化设计
为实现系统功能,本程序主要分为六个模块。
它们分别为:
录入联系人信息、删除联系人信息、查询联系人信息、增加联系人信息、浏览所以联系人信息、退出该程序。
这六个函数再通过主函数调用分别得以实现。
主函数,首先提供了程序运行时的友好界面,列出了清单,提供用户做出选择,以便决定使用通讯录的哪种功能。
然后,通过执行多分支选择语句——switch语句,分别实现其它各个函数的调用功能。
其它各个函数的功能分别如下:
Enter函数用于录入通讯录中学生的信息;
Delet函数用于对通讯录中指定信息的删除;
Search函数用于对通讯录中指定信息的查询;
Add函数用于在通讯录中插入信息;
Modify函数用于对联系人进行修改;
Load函数用于对通讯录中所有信息进行浏览;
Quit函数用于退出系统。
四、详细设计
(1)数据结构设计
本程序中,运用了多种数据结构。
首先对于通讯录中各项详细信息的记录用了结构体数组的形式,然后又运用switch语句来实现对分函数调用的开关功能,在文件的保存过程当中,还运用了数据文件的方式,每一次从终端输入的数据都以数据文件的形式保存到了磁盘,也可以从磁盘中讲文件内容读入内存中。
结构体及其成员如下:
structpeople
{
charname[10];
charnum[20];
charaddr[50];
}pe[100];
(2)模块接口设计
本程序执行的入口是main函数,然后是菜单函数,在菜单函数中对选项进行选择以后,接下来在do-while语句中再套用switch语句实现对各个函数的调用。
被调用的函数都是没有形参的,但是通过对数据文件的使用,可以使得每一次的函数调用都能够讲忘记保存到磁盘中,而不需要返回值。
最后,再从main函数中结束整个程序的运行。
其中涉及到被调用的函数有:
voidload(top);//保存函数
voiddisplay();//删出函数
voidnew_addrBook();//新建函数
voidslstore();//增加函数
voidmodify();//修改函数
voidsearch();//查找函数
voidload();//浏览函数
voidquit();//退出函数
#include/*头文件*/
#include
#defineLENsizeof(ADDR)
typedefstructnode
charname[20];
longtel;
structnode*next;
}ADDR;
ADDR*top;
intn=0;
menu_select()/*菜单选择:
*/
intcn,i=0;
do
{printf("\n\tmenu\n");
for(i=0;i<30;i++){printf("=");}
printf("\n\t1-save\n\t2-load\n\t3-display\n\t4-slstore\n\t5-delectrecord\n");
printf("\t6-search\n\t7-link\n\t8-buildnew\n\t9-menuhandle\n");
printf("\t10-menuselect\n\t11-freenodes\n\t12-quitprogram:
\n");
printf("\npleaseInputyourchoice1-12--:
");
scanf("%d",&cn);
}while(cn<0||cn>12);
returncn;
}
voidsave(ADDR*top)/*save函数*/
{FILE*fp;
ADDR*p1=top;
if((fp=fopen("E:
\\sname.txt","w+"))==NULL)
{printf("cannotopenthefile\n");
return;
if(p1!
=NULL)
{fprintf(fp,"%s,%ld\n",p1->name,p1->tel);
p1=p1->next;
}while(p1!
=NULL);
fclose(fp);
printf("savesuccessful!
voidload(ADDR*top)/*文件读取*/
{externn;
inti;
FILE*fp;
ADDR*p1,*p2;
p1=p2=(ADDR*)malloc(LEN);
top=p1;
fp=fopen("E:
\\sname.txt","r");
for(i=0;i{fscanf(fp,"%s%,ld\n",p1->name,&p1->tel);p2->next=p1;p2=p1;p1=(ADDR*)malloc(LEN);}p2->next=NULL;printf("readsuccessful!\n");}voiddisplay()/*显示链表内存:*/{ADDR*p3=top;printf("Nowoutputtherecord\n");if(p3!=NULL)do{printf("%s\t%ld\n",p3->name,p3->tel);p3=p3->next;}while(p3!=NULL);elseprintf("Listempty!\n");}ADDR*slstore()/*添加信息:*/{ADDR*p1;ADDR*p0=(ADDR*)malloc(LEN);inta;p1=top;printf("Inputinsertname&telphone:\n");scanf("%s%ld",p0->name,&p0->tel);if(top==NULL){printf("theoriginisempty!\n");top=p0;p0->next=NULL;}else{while(p1->next!=NULL)p1=p1->next;p1->next=p0;p0->next=NULL;}n++;display();printf("Doyouwantcontinuetoadd:1-yes\t2-no\n");scanf("%d",&a);if(a==1)slstore(top);elsereturn(top);}ADDR*delete_record(ADDR*top)/*删除记录:*/{charc[20];longm;inti,b;ADDR*p2,*p1=top;if(top==NULL){printf("\nlistisempty!");return(top);}printf("Nowinputyourdeletenameortelphonenumber:\n");scanf("%s",c);printf("%s",c);if(c[0]<'a'){m=i=0;while(c[i]){b=c[i]-'0';m=m*10+b;i++;}}if(c[0]<'a'){while(m!=p1->tel&&p1->next!=NULL){p2=p1;p1=p1->next;}if(m==p1->tel){if(p1==top)top=p1->next;elsep2->next=p1->next;printf("delete:%ld\n",m);n=n-1;}elseprintf("%ldnothavebeenfound!",m);}else{while(strcmp(c,p1->name)&&p1->next!=NULL){p2=p1;p1=p1->next;}if(strcmp(c,p1->name)==0){if(p1==top)top=p1->next;elsep2->next=p1->next;printf("delete:%s\n",c);n=n-1;}elseprintf("%snothavebeeenfound!",c);}return(top);}ADDR*find_record(ADDR*top)/*查找信息:*/{ADDR*p;longx;intcount=0,i,b;chars[15],e;printf("pleaseinputyoursearchednameortelphonenumber:\n");scanf("%S",s);if(s[0]<'a'){x=i=0;while(s[i]){b=s[i]-'0';x=x*10+b;i++;}}p=top;while(p!=NULL){if(x!=p->tel||(strcmp(s,p->name)==0)){printf("youfindtheperson\nname\ttelphone\n");printf("%s\t%ld\n",p->name,p->tel);count++;break;}p=p->next;}if(count==0)printf("Nofoundthe%sperson\n",s);printf("Doyouwanttocontinue:pressy-yes\n");scanf("%c",&e);if(e=='y')find_record(top);return(top);}voidlink_files()/*连接文件:*/{FILE*in,*out;charinfile[10],outfile[10];printf("Entertheinfilename:\n");scanf("%s",infile);printf("Entertheoutfilename:\n");scanf("%s",infile);if((in=fopen(infile,"r"))==NULL){printf("cannotopentheinfile");exit(0);}if((out=fopen(outfile,"w"))==NULL){printf("cannotopentheoutfile");exit(0);}while(!feof(in))fputc(fgetc(in),out);fclose(in);fclose(out);}ADDR*new_addrBook(ADDR*top)/*新建通讯录:*/{ADDR*p1,*p2;n=0;p1=p2=(ADDR*)malloc(LEN);printf("Nowwillbuildnewaddressbook!\n");printf("pleaseinputallyourinformation:\n");printf("name\ttelphonenumber\n");scanf("%s%ld",p1->name,&p1->tel);top=NULL;while(p1->tel!=0){n=n+1;if(n==1)top=p1;elsep2->next=p1;p2=p1;p1=(ADDR*)malloc(LEN);scanf("%s%ld",p1->name,&p1->tel);if(p1->tel==0)printf("nowinputover\n");}p2->next=NULL;return(top);}voidfree_nodes(ADDR*top)/*释放内存*/{free(top);top=NULL;n=0;}voidquit(ADDR*top)/*结束程序*/{ADDR*p0=top;ADDR*p=NULL;intw;if(p0==NULL){printf("Norecord!\nGoodbay\n");exit(0);}else{printf("Doyouwantsavetherecordintothefile?1-yes\tothers-no:\n");scanf("%d",&w);}if(w==1){save(top);printf("Nowtheinformationsaved\nGoodbay\n");}exit(0);}voidhandle_menu(){for(;;){switch(menu_select()){case1:save(top);break;case2:load(top);break;case3:display(top);break;case4:top=slstore(top);break;case5:top=delete_record(top);break;case6:find_record(top);break;case7:link_files();break;case8:top=new_addrBook(top);break;case9:handle_menu(top);break;case10:menu_select();break;case11:free_nodes(top);break;case12:quit(top);break;}}}voidmain()/*主函数*/{printf("welcometoentertheprogram:");handle_menu();}五、调试与测试(1)调试过程中的主要问题由于本程序是分模块设计的,所以运行时选择完任务并且执行完任务后,又会继续回到用户选择界面,供用户继续选择任务并执行任务,整个程序以文件形式读写,所以每次都可对输入的数据进行保存。对于本程序的调试运行,总体上情况良好。但是,其中也出现了一些小问题:在这次程序调试中我还发现了return;与break;的不同作用,其中break是只能用来结束它本身所在的本层循环,而return则是结束调用函数,让程序返回到主函数;还有用getchar()来接收输入字符时的回车符及让系统暂停,用ctrl+break来让系统暂停等。六、课程设计总结:经过一个多星期的编写,终于将它完成了。本程序在刚开始调试时有许多错误,但在我的努力及同学的帮助下都被一一克服,现在在操作本程序时可根据提示进行相关操作,能正确输出结果。在刚开始的几次调试中曾经出现过不能运行,运行出现死循环,不会正确输出结果等等问题。尤其那个结点,本来就不怎么懂,经过我看资料及同学的帮助,这些问题得到克服,并且使程序的功能也得到了一定的完善。现在它的基本功能管理等都可以正确运行,并且给出正确答案。虽然课程设计很苦很累,有时候还很令人抓狂,不过现在回想起来它给我的并不只是痛苦的回忆,它不仅让拉近了我和同学间的距离,而且对我们学习计算机语言还是很有意义的。通过这次的课程设计,让我明确了学习C语言的目的和重要性,在以后的时间里,我会更加努力的把C语言学好,为以后学习更高级的计算机语言打下好的基础,并通过与老师同学的交流来不断的提升自己的编程和开发能力!
{fscanf(fp,"%s%,ld\n",p1->name,&p1->tel);
p2->next=p1;
p2=p1;
p1=(ADDR*)malloc(LEN);
p2->next=NULL;
printf("readsuccessful!
voiddisplay()/*显示链表内存:
ADDR*p3=top;
printf("Nowoutputtherecord\n");
if(p3!
{printf("%s\t%ld\n",p3->name,p3->tel);
p3=p3->next;
}while(p3!
elseprintf("Listempty!
ADDR*slstore()/*添加信息:
ADDR*p1;
ADDR*p0=(ADDR*)malloc(LEN);
inta;
p1=top;
printf("Inputinsertname&telphone:
scanf("%s%ld",p0->name,&p0->tel);
if(top==NULL)
{printf("theoriginisempty!
top=p0;
p0->next=NULL;
else
{while(p1->next!
p1->next=p0;
n++;
display();
printf("Doyouwantcontinuetoadd:
1-yes\t2-no\n");
scanf("%d",&a);
if(a==1)slstore(top);
elsereturn(top);
ADDR*delete_record(ADDR*top)/*删除记录:
charc[20];
longm;
inti,b;
ADDR*p2,*p1=top;
{printf("\nlistisempty!
return(top);
printf("Nowinputyourdeletenameortelphonenumber:
scanf("%s",c);
printf("%s",c);
if(c[0]<'a')
{m=i=0;
while(c[i])
{b=c[i]-'0';
m=m*10+b;
i++;
}}
{while(m!
=p1->tel&&p1->next!
{p2=p1;p1=p1->next;}
if(m==p1->tel)
{if(p1==top)top=p1->next;
elsep2->next=p1->next;
printf("delete:
%ld\n",m);
n=n-1;}
elseprintf("%ldnothavebeenfound!
",m);}
{while(strcmp(c,p1->name)&&p1->next!
if(strcmp(c,p1->name)==0)
%s\n",c);
n=n-1;
elseprintf("%snothavebeeenfound!
",c);
}return(top);
ADDR*find_record(ADDR*top)/*查找信息:
{ADDR*p;
longx;
intcount=0,i,b;
chars[15],e;
printf("pleaseinputyoursearchednameortelphonenumber:
scanf("%S",s);
if(s[0]<'a')
{x=i=0;
while(s[i])
{b=s[i]-'0';
x=x*10+b;
i++;}
p=top;
while(p!
if(x!
=p->tel||(strcmp(s,p->name)==0))
{printf("youfindtheperson\nname\ttelphone\n");
printf("%s\t%ld\n",p->name,p->tel);
count++;
break;
p=p->next;
if(count==0)
printf("Nofoundthe%sperson\n",s);
printf("Doyouwanttocontinue:
pressy-yes\n");
scanf("%c",&e);
if(e=='y')
find_record(top);
voidlink_files()/*连接文件:
{FILE*in,*out;
charinfile[10],outfile[10];
printf("Entertheinfilename:
scanf("%s",infile);
printf("Entertheoutfilename:
if((in=fopen(infile,"r"))==NULL)
{printf("cannotopentheinfile");
exit(0);
if((out=fopen(outfile,"w"))==NULL)
{printf("cannotopentheoutfile");
while(!
feof(in))fputc(fgetc(in),out);
fclose(in);
fclose(out);
ADDR*new_addrBook(ADDR*top)/*新建通讯录:
n=0;
printf("Nowwillbuildnewaddressbook!
printf("pleaseinputallyourinformation:
printf("name\ttelphonenumber\n");
scanf("%s%ld",p1->name,&p1->tel);
top=NULL;
while(p1->tel!
=0)
{n=n+1;
if(n==1)top=p1;
elsep2->next=p1;
if(p1->tel==0)printf("nowinputover\n");
voidfree_nodes(ADDR*top)/*释放内存*/
free(top);
top=NULL;n=0;
voidquit(ADDR*top)/*结束程序*/
ADDR*p0=top;
ADDR*p=NULL;
intw;
if(p0==NULL)
{printf("Norecord!
\nGoodbay\n");
{printf("Doyouwantsavetherecordintothefile?
1-yes\tothers-no:
scanf("%d",&w);
if(w==1)
{save(top);
printf("Nowtheinformationsaved\nGoodbay\n");
}exit(0);
voidhandle_menu()
for(;;)
{switch(menu_select())
{case1:
save(top);break;
case2:
load(top);break;
case3:
display(top);break;
case4:
top=slstore(top);break;
case5:
top=delete_record(top);break;
case6:
find_record(top);break;
case7:
link_files();break;
case8:
top=new_addrBook(top);break;
case9:
handle_menu(top);break;
case10:
menu_select();break;
case11:
free_nodes(top);break;
case12:
quit(top);break;
}}}
voidmain()/*主函数*/
{printf("welcometoentertheprogram:
handle_menu();
五、调试与测试
(1)调试过程中的主要问题
由于本程序是分模块设计的,所以运行时选择完任务并且执行完任务后,又会继续回到用户选择界面,供用户继续选择任务并执行任务,整个程序以文件形式读写,所以每次都可对输入的数据进行保存。
对于本程序的调试运行,总体上情况良好。
但是,其中也出现了一些小问题:
在这次程序调试中我还发现了return;与break;的不同作用,其中break是只能用来结束它本身所在的本层循环,而return则是结束调用函数,让程序返回到主函数;还有用getchar()来接收输入字符时的回车符及让系统暂停,用ctrl+break来让系统暂停等。
六、课程设计总结:
经过一个多星期的编写,终于将它完成了。
本程序在刚开始调试时有许多错误,但在我的努力及同学的帮助下都被一一克服,现在在操作本程序时可根据提示进行相关操作,能正确输出结果。
在刚开始的几次调试中曾经出现过不能运行,运行出现死循环,不会正确输出结果等等问题。
尤其那个结点,本来就不怎么懂,经过我看资料及同学的帮助,这些问题得到克服,并且使程序的功能也得到了一定的完善。
现在它的基本功能管理等都可以正确运行,并且给出正确答案。
虽然课程设计很苦很累,有时候还很令人抓狂,不过现在回想起来它给我的并不只是痛苦的回忆,它不仅让拉近了我和同学间的距离,而且对我们学习计算机语言还是很有意义的。
通过这次的课程设计,让我明确了学习C语言的目的和重要性,在以后的时间里,我会更加努力的把C语言学好,为以后学习更高级的计算机语言打下好的基础,并通过与老师同学的交流来不断的提升自己的编程和开发能力!
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2