C语言课程设计报告报告+代码班级通讯录系统.docx
《C语言课程设计报告报告+代码班级通讯录系统.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告报告+代码班级通讯录系统.docx(22页珍藏版)》请在冰豆网上搜索。
![C语言课程设计报告报告+代码班级通讯录系统.docx](https://file1.bdocx.com/fileroot1/2023-5/24/09724af1-0e05-4fae-bfac-798853d5874f/09724af1-0e05-4fae-bfac-798853d5874f1.gif)
C语言课程设计报告报告+代码班级通讯录系统
理工大学
计算机科学与技术学院
课程设计报告
课程名称:
高级语言程序设计
设计题目:
班级通讯录
学生:
传华
学 号:
7
专业班级:
信管1002班
指导教师:
于金霞
2010年 09 月 10 日
一、设计题目及要求
设计题目:
班级通讯录
对象:
信管10级
(一)、技术参数和设计要求:
1.该系统主要处理通讯录的相关信息。
2.通讯录信息主要包括:
、班级、手机、家庭、电子、通讯录地址、邮编等容。
3.完成以下的操作:
实现通讯录信息的添加、修改、删除和查询。
(二)、设计容与步骤
1.分析并建立满足上述要求的数据结构
2.算法设计与分析
3.程序设计、实现、调试
4.课程设计说明书
二、算法设计分析
因为一个班级里面有很多学生,而且每个学生又包含很多信息如、学号、、等,这些信息又分别属于不同的数据类型,但是每个学生所包含的数据信息成分相同,所以要用到构造数据类型:
结构体。
用到结构体,应为要能实现查找、修改、删除等,所以又要用到链表的知识!
要实现这些功能,要用到模块化设计思想,用函数来解决问题!
三、具体函数分析
(一)、插入新结点
在插入新结点之前,先创建一个只有指针域的头结点,又指针p扫描全链表,实现尾插法,并返回头指针。
(二)、删除结点
用连个指针p,q扫描全链表,先通过学号找到要删除的结点q,然后将q结点从链表中删除,然后释放此结点!
(三)、修改结点容
通过学号找到此学生,通过switch语句选择要修改的项目,然后进行修改。
(四)、查找并输出
通过学号找到此学生,然后分别访问并输出此结点各项容。
(五)、输出通讯录
顺序访问链表各个结点,并输出结点信息。
(六)、保存为文件
现在d盘里面创建一个读写类型文件“班级通讯录.txt”,然后通过文件类型指针fp访问此文件并写入通讯录信息。
(七)、释放结点并结束程序
从头结点开始,使头结点不断后移,并将前面的结点释放。
四、算法流程图
五、函数运行情况及部分代码
(一)、主函数框架
主函数要用到基本输入输出、switch语句转换操作命令,然后用goto语句实现循环操作。
具体如下:
intmain()
{
intcz;//操作符
structstu*head,*q;
head=(structstu*)malloc(sizeof(structstu));
head->next=NULL;
system("color2e");//修改dos窗口前背景色,用两个十六进制数表示
printf("\n********************************C语言课程设计***********************************\n");
printf("***************★班级通讯录★*****************\n\n\n");
printf("*1:
新建通讯录*\n");
printf("*2:
删除通讯录*\n");
printf("*3:
修改通讯录*\n");
printf("*4:
查询通讯录*\n");
printf("*5:
显示全部记录*\n");
printf("*6:
保存为文件*\n");
printf("*7:
释放链表并结束程序*\n");
printf("*********************************************************\n");
start:
printf("输入操作符1-7:
");
scanf("%d",&cz);
switch(cz)
{
case1:
q=(structstu*)malloc(sizeof(structstu));
printf("\t输入:
");scanf("%s",q->name);
printf("\t输入学号:
");scanf("%d",&q->xh);
printf("\t输入班级:
");scanf("%d",&q->grade);
printf("\t手机号:
");scanf("%s",q->cel);
printf("\t家庭:
");scanf("%s",q->tel);
printf("\t输入电子:
");scanf("%s",q->mail);
printf("\t通讯录地址:
");scanf("%s",&q->add);
printf("\t输入邮编:
");scanf("%s",&q->post);
charu(head,q);
printf("插入成功!
!
!
\n");break;
case2:
//删除
head=del(head);break;
case3:
change(head);break;
case4:
search(head);break;
case5:
printall(head);
break;
case6:
printf("\n");
baoc(head);break;
case7:
sf(head);
exit(0);
default:
printf("输入操作错误,重新");
}
gotostart;
return0;
}
其中用到输出*来美化系统运行页面,然后用system("color2e");语句来修改dos界面前背景颜色,如;
(二)、插入函数
structstu*charu(structstu*head,structstu*q)//插入新结点
{
structstu*p;
for(p=head;p->next!
=NULL;p=p->next);
p->next=q;
q->next=NULL;
returnhead;
}
运行界面如图:
本部分采用尾插法。
(三)、删除结点
代码如下:
structstu*del(structstu*head)//删除结点
{
structstu*p,*q;
inta;//要删除学生的学号
if(head->next==NULL)
printf("**********************************通讯录为空!
!
!
*********************************\n\n\n");
else
{
printf("\t输入要删除学生学号:
");
scanf("%d",&a);
for(p=head,q=p->next;q->xh!
=a&&q->next!
=NULL;)
{
p=p->next;
q=p->next;
}
if(q->xh==a)
{
p->next=q->next;
free(q);
printf("删除成功!
!
!
\n");
}
elseprintf("nopeoplehavefound!
!
!
");
}
returnhead;
}
运行界面:
通讯录为空时:
不为空时:
(四)、查找
输入要查找学生学号,找到后将其输出,如图:
(五)修改学生信息
先通过学号找到该学生,然后用switch语句选择修改项,再用switch和goto语句实现是否循环,运行如图:
(六)、保存文件
在D:
盘中创建一个读写文件,顺序将各节点信息保存进去,代码为:
structstu*baoc(structstu*head)//保存文件
{
FILE*fp;
structstu*p=head;
if(head->next==NULL)
printf("**********************************通讯录为空!
!
!
*********************************\n\n\n");
else
{
if((fp=fopen("D:
\\班级通讯录.txt","w"))==NULL)
{
printf("can'topenfile!
!
!
\n");
exit(0);
}
while(p->next!
=NULL)
{
fwrite(p->next,sizeof(structstu),1,fp);
p=p->next;
}
fclose(fp);
printf("保存文件成功!
!
!
\n\n");
}
returnhead;
}
运行如图:
(七)、释放结点退出系统
用指针p扫描链表,头指针逐步后移,释放结点p,代码如下:
voidsf(structstu*head)
{
structstu*p=head;
printf("释放链表:
\n");
while(p!
=NULL)
{
head=head->next;
free(p);
p=head;
}
printf("释放链表成功!
!
!
\n");
}
运行如图;
六、附录:
完整原代码
#include
#include
#include
#include
structstu
{
charname[100];//
intxh;//学号
intgrade;//年级
charcel[15];//手机
chartel[50];//
charmail[50];//
charadd[100];//地址
charpost[15];//邮编
structstu*next;
};
structstu*charu(structstu*head,structstu*q)//插入新结点
{
structstu*p;
for(p=head;p->next!
=NULL;p=p->next);
p->next=q;
q->next=NULL;
returnhead;
}
voidsearch(structstu*head)//查找结点并输出
{
structstu*p;
inta;//要查找学生的学号
if(head->next==NULL)
printf("**********************************通讯录为空!
!
!
*********************************\n\n\n");
else
{
printf("\t输入要查询学生学号:
");
scanf("%d",&a);
for(p=head->next;p->next!
=NULL;p=p->next)
{
if(p->xh==a)
{
printf("要查找的学生信息为:
\n");
printf("★:
");puts(p->name);
printf("\t学号:
");printf("%d",p->xh);
printf("\t年级:
");printf("%d\n",p->grade);
printf("\t手机:
");puts(p->cel);
printf("\t:
");puts(p->tel);
printf("\t:
");puts(p->mail);
printf("\t地址");puts(p->add);
printf("\t邮编:
");puts(p->post);
printf("\t查找成功!
!
!
"):
printf("\n\n\n");
break;
}
}
if(p->xh==a)
{
printf("要查找的学生信息为:
\n");
printf("★:
");puts(p->name);
printf("\t年级:
");printf("%d\n",p->grade);
printf("\t手机:
");puts(p->cel);
printf("\t:
");puts(p->tel);
printf("\t:
");puts(p->mail);
printf("\t地址");puts(p->add);
printf("\t邮编:
");puts(p->post);
printf("\t查找成功!
!
!
"):
printf("\n\n\n");
}
elseprintf("nopeoplehavefound!
!
!
\n");
}
}
structstu*del(structstu*head)//删除结点
{
structstu*p,*q;
inta;//要删除学生的学号
if(head->next==NULL)
printf("**********************************通讯录为空!
!
!
*********************************\n\n\n");
else
{
printf("\t输入要删除学生学号:
");
scanf("%d",&a);
for(p=head,q=p->next;q->xh!
=a&&q->next!
=NULL;)
{
p=p->next;
q=p->next;
}
if(q->xh==a)
{
p->next=q->next;
free(q);
printf("删除成功!
!
!
\n");
}
elseprintf("nopeoplehavefound!
!
!
");
}
returnhead;
}
structstu*change(structstu*head)//修改结点容
{
intb,a,c;
structstu*p;
if(head->next==NULL)
printf("**********************************通讯录为空!
!
!
*********************************\n\n\n");
else
{
printf("输入要修改学生学号:
");
scanf("%d",&a);
for(p=head->next;p!
=NULL;p=p->next)
{
if(p->next->xh==a)
{
start:
printf("输入想要修改什么?
\n");
printf("\t\t\t1:
修改\n");
printf("\t\t\t2:
修改学号\n");
printf("\t\t\t3:
修改年级\n");
printf("\t\t\t4:
手机\n");
printf("\t\t\t5:
\n");
printf("\t\t\t6:
\n");
printf("\t\t\t7:
地址\n");
printf("\t\t\t8:
邮编\n");
printf("请输入你的选择:
");
scanf("%d",&b);
switch(b)
{
case1:
printf("\t输入新:
");
scanf("%s",p->name);break;
case2:
printf("\t输入新学号:
");
scanf("%d",&p->xh);break;
case3:
printf("\t输入新的班级:
");
scanf("%d",&p->grade);break;
case4:
printf("\t输入新的手机号:
");
scanf("%s",p->cel);break;
case5:
printf("\t输入新的号:
");
scanf("%s",p->tel);break;
case6:
printf("\t输入新的:
");
scanf("%s",p->mail);break;
case7:
printf("\t输入新的地址:
");
scanf("%s",p->add);break;
case8:
printf("\t输入新的邮编;");
scanf("%s",p->post);break;
default:
printf("输入操作错误,请重新输入:
");
}
printf("修改成功!
!
!
\n");
printf("是否要修改其他项?
1:
是2:
否\n");
printf("请输入你的选择:
");
scanf("%d",&c);
switch(c)
{
case1:
gotostart;
case2:
break;
}
}
}
}
returnhead;
}
voidprintall(structstu*head)//输出全部通讯录
{
structstu*p=head->next;
while
(1)
{
if(p==NULL)
{
printf("**********************************通讯录为空!
!
!
*********************************\n\n\n");
break;
}
elseif(p->next==NULL)
{
printf("★:
");puts(p->name);
printf("\t学号:
");printf("%d\n",p->xh);
printf("\t年级:
");printf("%d\n",p->grade);
printf("\t手机:
");puts(p->cel);
printf("\t:
");puts(p->tel);
printf("\t:
");puts(p->mail);
printf("\t地址:
");puts(p->add);
printf("\t邮编:
");puts(p->post);
printf("输出成功!
!
!
\n");
printf("\n\n\n");
break;
}
else
{
printf("★:
");puts(p->name);
printf("\t学号:
");printf("%d\n",p->xh);
printf("\t年级:
");printf("%d\n",p->grade);
printf("\t手机:
");puts(p->cel);
printf("\t:
");puts(p->tel);
printf("\t:
");puts(p->mail);
printf("\t地址:
");puts(p->add);
printf("\t邮编:
");puts(p->post);
printf("\n");
p=p->next;
continue;
}
printf("输出成功!
!
!
\n");
}
}
structstu*baoc(structstu*head)//保存文件
{
FILE*fp;
structstu*p=head;
if(head->next==NULL)
printf("**********************************通讯录为空!
!
!
*********************************\n\n\n");
else
{
if((fp=fopen("D:
\\班级通讯录.txt","w"))==NULL)
{
printf("can'topenfile!
!
!
\n");
exit(0);
}
while(p->next!
=NULL)
{
fwrite(p->next,sizeof(structstu),1,fp);
p=p->next;
}
fclose(fp);
printf("保存文件成功!
!
!
\n\n");
}
returnhead;
}
voidsf(structstu*head)
{
structstu*p=head;
printf("释放链表:
\n");
while(p!
=NULL)
{
head=head->next;
free(p);
p=head;
}
printf("释放链表成功!
!
!
\n");
}
intmain()
{
intcz;//操作符
structstu*head,*q;
head=(structstu*)malloc(sizeof(structstu));
head->next=NULL;
system("color2e");//修改dos窗口前背景色,用两个十六进制数表示
printf("\n********************************C语言课程设计***********************************\n");
printf("***************★班级通讯录★*****************\n\n\n");
printf("*1:
新建通讯录*\n");
printf("*2:
删除通讯录*\n");
printf("*3:
修改通讯录*\n");
printf("*4:
查询通讯录*\n");
printf("*5:
显示全部记录*\n");
printf("*6:
保存为文件*\n");
printf("*7:
释放链表并结束程序*\n");
printf("*********************************************************\n");
start:
printf("输入操作符1-7:
");
scanf("%d",&cz);
switch(cz)
{
case1