课程设计.docx
- 文档编号:10858517
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:24
- 大小:210.61KB
课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(24页珍藏版)》请在冰豆网上搜索。
课程设计
一.设计内容及要求
1.1题目的内容
内容:
手机通讯录管理系统
1.2题目要求的功能
要求:
正像一个电话本一样,记录下每位学生的信息,并把它保存在文件中,帮助自己记住好多有用的信息,可以给个人的学习生活带来很大的方便。
而且使用起来非常的方便,特别是在现在计算机使用普及的环境下,一个通讯录系统程序,省去了翻查纸质通讯录的麻烦。
(一)给电话簿添加新的记录,其中包括姓名,地址,学号,qq号码,电话号码,邮箱地址。
(二)输出通讯录相应记录的模块,根据用户输入的姓名进行输出。
(三)删除通讯录相应记录的模块,根据用户输入的关键字进行删除。
(四)最后保存并退出该系统。
1.3开发环境与运行需求
Microsoft Visual C++6.0。
Visual C++(简称VC)是Microsoft公司推出的目前使用极为广泛的基于Windows平台的C++可视化开发环境。
Visual C++6.0提出的控制台应用程序对学习和掌握标准的C/C++内容非常有利。
“可视”的资源编辑器与MFC类以及应用程序向导,为快速高效的开发出功能强大的Windows应用程序提供了极大的方便。
利用Visual C++6.0进行Internet、数据库及多媒体等多方面的程序开发也很容易。
二、详细设计
2.1系统的设计思想
设计思路程序设计一般由两部分组成:
算法和数据结构,合理地选择和实现一个数据结构和处理这些数据结构具有同样的重要性。
在通讯录管理程序中,由于预计记录数相对于一个单位的学生人数或职工人数来说不会太大,除了能够加入、删除、保存等外,更多的情况是查询,且能够实现快速查询,所以选用静态数组保存数据,实现多种查询方式。
2.2总体程序框图
通讯录系统
添加记录
查询记录
输出记录
删除记录
保存并退出
三设计过程和程序代码
3.1主函数的程序流程图
1)
主函数程序(N-S)流程图及运行界面
主函数程序(N-S)流程图(见图3.1-A)
主函数main()
定义变量intc;;
While
(1)
Scanf("%c",&c)
switch(c)
case'1':
Add();break;添加记录
case'2':
print();break;输出条目
case'3':
Find();break;查找条目1.按姓名2.按学号
case'4':
Delete();删除信息
print();break;输出删除后的结果
case'0':
SaveFree();保存并释放内存exit(0);退出
default:
printf("选择错误\n");
图3.1-A主函数程序
简单说明:
该功能主要显示的是给用户一个进入界面,它主要的是显示该程序主要能够执行的有哪些功能。
下面是显示给用户的界面。
(见图3.1-A)
主函数程序运行界面:
3.2对关键代码加以分析说明
1、/*添加记录*/
voidAdd()
{
LIST*p1=NULL,*p2=NULL;
p1=(LIST*)malloc(sizeof(LIST));/*申请结点*/
printf("输入姓名:
\n");/*添加信息*/
scanf("%s",p1->name);
printf("输入地址:
\n");
scanf("%s",p1->addr);
printf("输入学号:
\n");
scanf("%s",p1->num);
printf("请输入qq号:
\n");
scanf("%s",p1->qq);
printf("输入电话:
\n");
scanf("%s",p1->phnum);
printf("请输入email:
\n");
scanf("%s",p1->email);
p1->next=NULL;/*保存到链表*/
if(head==NULL)
{
head=(LIST*)malloc(sizeof(LIST));/*申请空间*/
head->next=p1;
}
else
{
for(p2=head;p2->next!
=NULL;p2=p2->next);/*找到结点尾*/
p2->next=p1;
}
printf("此记录已添加!
");
}
通过本段函数可以把要添加的成员的姓名,学号,qq号码,地址,邮箱等信息添加到通讯录中。
二、/*输出学生信息*/
voidprint()
{
LIST*p=NULL;
if(head==NULL)
{
printf("这是一个新记录,请添加记录\n");
return;
}
printf("**************通讯录系统*********************\n");/*输出信息*/
printf("姓名\t\t地址\t学号\t\tqq\t\t电话\t\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
三、/*查找信息1.按姓名、2、按学号*/
voidFind()
{
LIST*p;
charname1[20],num1[20];
inti;
printf("请输入查找方式1、按姓名;2、按学号");
scanf("%d",&i);
if(i==1)
{
printf("请输入要查找的姓名:
\n");
scanf("%s",name1);
printf("**************通讯录系统*********************\n");
printf("姓名\t\t地址\t学号\tqq\t电话\t\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->name,name1)==0)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
}
elseif(i==2)
{
printf("请输入要查找人的学号:
\n");
scanf("%s",num1);
printf("**************通讯录系统*********************\n");
printf("姓名\t\t地址\t学号\tqq\t电话\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->num,num1)==0)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
}
else
printf("请选择1和2两个数字\n");
}
通过此段函数将成员的具体信息全部输出来。
四、/*删除信息*/
voidDelete()
{
charname1[20];/*先查找后删除*/
LIST*p=head->next,*pr=head->next;
printf("请输入要删除的姓名:
\n");
scanf("%s",name1);
if(head->next==NULL)
{
printf("无此节点!
\n");
return;
}
while((strcmp(p->name,name1)!
=0)&&p->next!
=NULL)
{
pr=p;
p=p->next;
}
if(strcmp(name1,p->name)==0)/*输出删除信息*/
{
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->next->name,p->next->addr,
p->next->num,p->next->qq,p->next->phnum,p->next->email);
if(p==head->next)
head->next=p->next;
else
pr->next=p->next;
free(p);
}
printf("此记录已删除!
");
}
通过这个函数可以把指定人员的姓名,学号,地址,邮箱,等信息删除.
四设计结果与分析
4.1数据结构
由于使用静态数组需要预先估计记录数,表示记录数,也就是数组的大小,记录联系人的信息至少应有姓名、地址、学号、电话、qq、email,所以定义每个数组元素的类型为结构体。
由于数组存储是采用顺序存放,在内存空间中占用连续空间,所以若干条记录通讯录的管理实质就是对顺序存储的线性表的管理。
结点结构如下:
structlist
{
charname[20];
charaddr[20];
charnum[20];
charqq[10];
charphnum[20];
charemail[30];
structlist*next;
};
4.2程序采用模块化设计
主函数是程序的入口,各模块独立,可分块调试,均由主函数控制调用。
控制功能的实现通过循环执行一个开关语句,该语句的条件值是通过调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数,同时设置一个断点,即当返回值为一定条件时运行exit()函数结束程序,以免造成死循环。
4.3menu()主菜单
直接利用输出函数printf输出字符串,在屏幕上显示一个菜单,并显示选项,输入0-5之间的数字,将此数字作为菜单函数的返回值返回主函数这个数字调用相应的功能函数。
制作简便由于程序中很多地方用到了字符串输入语句,会造成下一个字符不能正确读入,为了在程序调用执行了各个函数后能够清晰地看到菜单,并输入新的选项,首先写了一条输出信息,一条读字符语句getchar()等待输入字符,按任意键即可进入主菜单。
读者可以将这两行来体会它的功能。
按照所见即所得的方式直接设计输出函数,输出字符串,达到菜单效果,将精力主要放在程序功能的实现上,利用do循环语句,一直执行scanf(“%s”,s),按照字符串形式输入,则循环等待重新输入。
既然是数字选项,为什么不用整数格式输入,而要按字符串输入,再将其转换呢?
如果按照整数格式输入,当用户输入了非数字字符,例如a和b等,由于类型不同将导致程序出错,所以对于不参与运算的数据,表面上看是数字,也应将其设为字符处理,例如电话号码,千万不要设为整数类型。
程序设计技巧很多,所以读者在编程调试中应注意并仔细体会。
4.4Add()输入记录
输入记录时按照一条一行的格式输入,每个数据之间用空格分隔,较为清晰,且能直接反映数据之间的关系。
但由于scanf函数的特性,在输入时,数据用回车分隔也是可以的与界面设计不吻合
由于记录并不是一次性全部输入,而是随时填加和删除的,而预先开辟的空间数往往大于实际的记录数,所以程序设计为首先输入准备输入的记录数n,然后用for循环语句循环n次,输入记录。
通讯录的每一条记录有三个字段,都是字符串类型,用格式输入printf("输入姓名:
\n");/*添加信息*/
scanf("%s",p1->name);
printf("输入地址:
\n");
scanf("%s",p1->addr);
printf("输入学号:
\n");
scanf("%s",p1->num);
printf("请输入qq号:
\n");
scanf("%s",p1->qq);
printf("输入电话:
\n");
scanf("%s",p1->phnum);
printf("请输入email:
\n");
scanf("%s",p1->email);,继续输入下一条,达到规定的记录数,输入停止,返回记录数到主函数。
4.5Print()显示所有记录
通讯录建立好后,更频繁的操作是显示和查找记录,本函数实现显示所有记录功能
将主函数传递过来的数组输出,输出时,为了格式美观清晰,设计一定的样式输出,注意利用格式输出函数,根据字段的长度设定输出的长度,而且利用结构体的链表进行输出,保证输出所有的记录。
4.6Find()查找记录
查找指定姓名的记录,采用顺序查找法。
首先输入要查找记录的姓名,然后顺序查找结点,如果没找到,则输出没找到信息,否则,显示找到的记录信息。
因为程序多次用到了查找和显示记录,例如删除记录中,所以编写了一个find()函数,专门进行查找。
从第一条记录开始,将指针一直往后移,直到找到要求着到的记录为止。
如果没有给出提示信息。
4.7Delete()删除记录
输入要删除记录的姓名如果没有该记录,然后顺序查找结点,如果没找到,则输出没找到信息,否则,显示找到的记录信息。
因为程序多次用到了查找和显示记录从第一条记录开始,将指针一直往后移,直到找到要求着到的记录为止。
否则显示没找到信息;否则,调用print函数,依次将每个字段拷贝到前一条记录的相应字段,即覆盖了前一条记录,达到前移的目的,直到最后一条记录。
并把删除的记录在屏幕上显示出来。
程序结束。
4.8SaveFree()保存记录到文件
前面我们讲到的数据输入和输出是以终端为对象的,当程序关闭后,数据也就丢失了,所以为了能随时查阅数据,必须将数据输出到磁盘文件上保存起来,使用时再从磁盘中读入到内存中,这就用到了磁盘文件的读写操作。
参考文献
[1]姜灵芝,余健.C语言课程设计案例精编,北京:
清华大学出版社,2008.1
[2]郭翠英等编著,C语言课程设计案例精编,北京:
中国水利水电出版社,2004.3
[3]贾学.宋海民.C语言程序设计.北京:
中国铁道出版社,2007
[4]赵海廷.C语言程序设计.北京:
人民邮电出版社,2006.
[5]范刚龙.王康平.C程序设计.武汉:
武汉理工大学出版社,2006
[6]张强华.C语言程序设计.北京:
人民邮电出版社,2010
[7]徐新华.C语言程序设计教程.北京:
清华大学出版社,2010
[8]谭浩强.C语言程序设计.北京:
清华大学出版社,2011
[9]徐建民.C语言程序设计.北京:
电子工业出版社,2009
附录(程序清单)
#include
#include
#include
structlist
{
charname[20];
charaddr[20];
charnum[20];
charqq[10];
charphnum[20];
charemail[30];
structlist*next;
};
typedefstructlistLIST;
LIST*head=NULL;
voidmenu();/*菜单*/
voidAdd();/*添加记录*/
voidprint();/*输出记录*/
voidFind();/*查找记录(按姓名)*/
voidDelete();/*删除记录*/
voidSaveFree();/*保存到文件*/
voidCreat();/*打开文件*/
voidmain()
{
charc;
Creat();/*打开文件*/
while
(1)
{
menu();/*显示菜单*/
scanf("%c",&c);
switch(c)
{
case'1':
Add();break;/*添加记录*/
case'2':
print();break;/*输出条目*/
case'3':
Find();break;/*查找条目1.按姓名*/
case'4':
Delete();/*删除信息*/
print();break;/*输出删除后的结果*/
case'0':
SaveFree();/*保存并释放内存*/
exit(0);/*退出*/
break;
default:
printf("选择错误!
");
break;
}
}
}
/*菜单*/
voidmenu()
{
printf("\n*****************通讯录系统*********************\n");
printf("***********\t1.添加记录*******************\n");
printf("***********\t2.输出全部记录*******************\n");
printf("***********\t3.查询记录*****************\n");
printf("***********\t4.删除记录*******************\n");
printf("***********\t0.保存并退出!
****************\n");
printf("************************************************\n");
printf("\t请选择将要进行的操作:
\n");
}
/*添加记录*/
voidAdd()
{
LIST*p1=NULL,*p2=NULL;
p1=(LIST*)malloc(sizeof(LIST));/*申请结点*/
printf("输入姓名:
\n");/*添加信息*/
scanf("%s",p1->name);
printf("输入地址:
\n");
scanf("%s",p1->addr);
printf("输入学号:
\n");
scanf("%s",p1->num);
printf("请输入qq号:
\n");
scanf("%s",p1->qq);
printf("输入电话:
\n");
scanf("%s",p1->phnum);
printf("请输入email:
\n");
scanf("%s",p1->email);
p1->next=NULL;/*保存到链表*/
if(head==NULL)
{
head=(LIST*)malloc(sizeof(LIST));/*申请空间*/
head->next=p1;
}
else
{
for(p2=head;p2->next!
=NULL;p2=p2->next);/*找到结点尾*/
p2->next=p1;
}
printf("此记录已添加!
");
}
/*输出学生信息*/
voidprint()
{
LIST*p=NULL;
if(head==NULL)
{
printf("这是一个新记录,请添加记录\n");
return;
}
printf("**************通讯录系统*********************\n");/*输出信息*/
printf("姓名\t\t地址\t学号\t\tqq\t\t电话\t\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
/*查找信息1.按姓名、2、按学号*/
voidFind()
{
LIST*p;
charname1[20],num1[20];
inti;
printf("请输入查找方式1、按姓名;2、按学号");
scanf("%d",&i);
if(i==1)
{
printf("请输入要查找的姓名:
\n");
scanf("%s",name1);
printf("**************通讯录系统*********************\n");
printf("姓名\t\t地址\t学号\tqq\t电话\t\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->name,name1)==0)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
}
elseif(i==2)
{
printf("请输入要查找人的学号:
\n");
scanf("%s",num1);
printf("**************通讯录系统*********************\n");
printf("姓名\t\t地址\t学号\tqq\t电话\temail\n");
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->num,num1)==0)
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->name,p->addr,p->num,p->qq,p->phnum,p->email);
}
}
else
printf("请选择1和2两个数字\n");
}
/*删除信息*/
voidDelete()
{
charname1[20];/*先查找后删除*/
LIST*p=head->next,*pr=head->next;
printf("请输入要删除的姓名:
\n");
scanf("%s",name1);
if(head->next==NULL)
{
printf("无此节点!
\n");
return;
}
while((strcmp(p->name,name1)!
=0)&&p->next!
=NULL)
{
pr=p;
p=p->next;
}
if(strcmp(name1,p->name)==0)/*输出删除信息*/
{
printf("%s\t\t%s\t%s\t%s\t%s\t%s\n",p->next->name,p->next->addr,
p->next->num,p->next->qq,p->next->phnum,p->next->email);
if(p==head->next)
head->next=p->next;
else
pr->next=p->next;
free(p);
}
printf("此
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计