C语言程序设计报告.docx
- 文档编号:15445921
- 上传时间:2023-07-04
- 格式:DOCX
- 页数:16
- 大小:56.55KB
C语言程序设计报告.docx
《C语言程序设计报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计报告.docx(16页珍藏版)》请在冰点文库上搜索。
C语言程序设计报告
二○一一年九月
设计要求
题目三通讯录管理系统
任务:
自学C语言中相关知识,设计出通讯录管理系统。
要求如下所述:
◆建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等;;
◆能够提供添加、删除和修改通讯录信息的功能,并给出确认是否保存或删除记录的提示信息;
◆能够提供按姓名或电话等查询并显示相应记录信息;
◆将通讯录保存在文件中;
◆能够按表格方式输出通讯录信息。
二、要求
◆为了保证所有的数据可以长期被使用,要求程序能将相关数据存储在外部数据文件中,具体数据格式和文件名、路径等自定;
◆根据所设计的算法,定义相应函数分别实现系统的各子功能模块,同时由主程序提供友好的用户界面,使用户可通过选择主菜单来调用课程设计中要求完成的各个功能模块,子程序执行完后可返回到主菜单,继续选择其他功能执行。
源程序要求书写规范,结构清晰。
重点函数的重点变量,重点功能部分均要求给出清晰的程序注释。
◆程序编译、链接成功后,自己设计实现程序功能的一组或多组测试数据,并严格按照此测试数据进行测试,然后分析测试结果。
如果程序不能正常运行或结果不正确,则需对程序进行单步调试,在调试过程中认真查找算法实现中存在的问题,并加以分析和修正。
程序详解
首先,定义结构体
structstudent
{
longnum;//用于存储学号
charname[20];//姓名
intage;//年龄
longtelephone;//电话号码
charadress[40];//地址
charE_mail[30];//邮箱
intQQ[12];//增设的QQ一栏
structstudent*next;//用于存放下一级指针
}first;
first为第一个节点,继而在其后动态的开创若干节点。
以下是用于链表处理的各个函数:
structstudent*creat(structstudent*p)//输入函数
voidprintall(structstudent*head)//显示所有记录
structstudent*delet(structstudent*head)//删除函数
structstudent*insert(structstudent*head)//插入函数
structstudent*searchbynum(structstudent*head)//按学号查找
structstudent*searchbyname(structstudent*head)//按姓名查找
structstudent*search(structstudent*head)//查找函数
menu_select()//选择函数
以下是各个函数的详细说明:
Creat()函数用于创建链表,其中以n记录节点的个数,并在创建时实现自加,以便于后面函数的处理,其循环输入的实现,依靠库函数malloc()和后面的while循环。
Printall函数用于显示当前的的所有记录,依靠头指针找到链表首地址,有while循环实现所有记录的输出。
Delet()函数用于删除某个记录,删除可以按姓名或学号这两种方式进行的,但本程序中没有这个功能即只可以按学号进行删除(因为学号唯一)。
Insert()函数用于插入,同样以头指针找到链表的首地址,并将要插入的学号依次与各个节点中得num比较,然后按顺序将一个节点插入。
Search()函数用于查找,查找函数提供了两种方式,即按姓名查找和按学号查找。
在search()函数中可以按提示调用searchbyname()和searchbynum()。
Menu_select()函数用于提供函数选项,旨在简化主函数。
流程图
2
1
主函数
Menu_select()
Printall()
Search()
Delet()
Insert()
Searchbyname()
Searchbynum()
Creat()
1
2
4
3
0
此即为该程序的主流程图。
源程序
以下是详细的源程序及部分注释:
#include
#include
#include
#include
#include
#defineNULL0
#defineLENsizeof(structstudent)
#defineSHU"%d\n%s\n%5d\n%ld\n%s\n%s\n%s"
intn;
structstudent
{
longnum;
charname[20];
intage;
longtelephone;
charadress[40];
charE_mail[30];
intQQ[12];
structstudent*next;
}first;
structstudent*creat(structstudent*p)//创建链表的函数,即输入函数
{
structstudent*head;
structstudent*p1,*p2;
n=0;//先给n赋值0
p1=p2=(structstudent*)malloc(LEN);//强制类型转换
printf("\t\t\t****************请输入用户信息****************\n");
printf("\t\t\t输入学号:
\n");
scanf("%ld",&p1->num);
printf("\t\t\t输入姓名:
\n");
scanf("%s",&p1->name);
printf("\t\t\t输入年龄:
\n");
scanf("%d",&p1->age);
printf("\t\t\t输入电话:
\n");
scanf("%ld",&p1->telephone);
printf("\t\t\t输入地址\n");
scanf("%s",&p1->adress);
printf("\t\t\t输入E-mail:
\n");
scanf("%s",&p1->E_mail);
printf("\t\t\t输入QQ\n");
scanf("%s",&p1->QQ);//40
head=NULL;
while(p1->num!
=0)
{
n=n+1;//实现n的自加,记录节点的个数
if(n==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(structstudent*)malloc(LEN);
printf("\t\t\t****************请输入用户信息****************\n");
printf("\t\t\t输入学号:
\n");
scanf("%ld",p1->num);
printf("\t\t\t输入姓名:
\n");
scanf("%s",p1->name);
printf("\t\t\t输入年龄:
\n");
scanf("%d",p1->age);
printf("\t\t\t输入电话:
\n");
scanf("%ld",p1->telephone);
printf("\t\t\t输入地址\n");
scanf("%s",p1->adress);
printf("\t\t\t输入E-mail:
\n");
scanf("%s",p1->E_mail);
printf("\t\t\t输入QQ\n");
scanf("%s",p1->QQ);
}
p2->next=NULL;
return0;
}
voidprintall(structstudent*head)//显示所有记录
{
structstudent*p;
printf("\n全部的记录如下\n:
");
p=head;
do
{
printf(SHU,p->num,p->name,p->age,p->telephone,p->adress,p->E_mail,p->QQ);
p=p->next;
}while(p!
=NULL);
}//80
structstudent*delet(structstudent*head)//删除函数
{
longnum;
printf("请输入要删除的号码:
\n");
scanf("%ld",&num);
structstudent*p1,*p2;
if(head==NULL)
{
printf("列表为空!
n");
returnhead;
}
p1=head;
while(num!
=p1->num&&p1->next!
=NULL)
{
p2=p1;
p1->next;
}
if(num==p1->num)
{
if(p1==head)//要删除的节点为首节点
head=p1->next;
else
p2->next=p1->next;
printf("delet:
%d\n",num);
n=n-1;//节点减一
}
else
printf("%d未找到该节点!
\n",num);
returnhead;
}
structstudent*insert(structstudent*head)//插入函数
{
structstudent*stud;
structstudent*p0,*p1,*p2;
p1=head;
p0=stud;//p0指向的是要插入的节点
if(head==0)
{
head=p0;
p0->next=NULL;//120
}
else
{
while((p0->num>p1->num)&&(p1->next!
=NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->num<=p1->num)
{
if(head==p1)
head=p0;//插入到原来第一个节点之前
else
p2->next=p0;
p0->next=p1;//插入到p2所指的节点之后
}
}
n=n+1;
returnhead;
}
structstudent*searchbynum(structstudent*head)//按学号查找
{
longnumb;
printf("请输入要删除的号码:
\n");
scanf("%ld",&numb);
structstudent*p;
p=head;//147
scanf("%ld",&numb);
if(numb!
=p->num)
p=p->next;
else
printf(SHU,p->num,p->name,p->age,p->telephone,p->adress,p->E_mail,p->QQ);
returnhead;
}
structstudent*searchbyname(structstudent*head)//按姓名查找
{
chara[100];
printf("请输入要查找的姓名:
\n");
scanf("%s",a);
structstudent*p;
p=head;
scanf("%s",a);
if(strcmp(a,p->name)!
=0)
p=p->next;
else
printf(SHU,p->num,p->name,p->age,p->telephone,p->adress,p->E_mail,p->QQ);
returnhead;
}
structstudent*search(structstudent*head)
{
charchoic;
printf("\t\t\t1-按电话号码查找2-按姓名查找");
printf("\t\t\t请选择:
");
choic=getch();
switch(choic)
{
case'1':
searchbynum(&first);break;
case'2':
searchbyname(&first);break;
}
returnhead;
}
intmenu_select()
{
chars[80];
inta;//定义整形变量
system("cls");
printf("\t\t***********欢迎进入通讯管理界面********\n\n");
printf("\t\t\t0.输入记录\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.Quit\n");
printf("\t\t***********************************************\n\n");
do{
printf("Enteryouchoice(0~5):
");
scanf("%s",s);
a=atoi(s);
}
while(a<0||a>5);
returna;
}
main()
{
printf("\t\t************************************************\n");
printf("\t\t********welcometoTONGXUNLU*******************\n");
printf("\t\t###########codeby陈国警###################\n");
printf("\t\t*************************************************\n");
printf("按任意键进入主菜单\n");
getch();
intselectnum;//选择函数,提示选择各种链表处理函数。
while
(1)
{
selectnum=menu_select();
switch(selectnum)
{
case0:
{
creat(&first);
break;
}
case1:
{
printall(&first);
break;
}
case2:
{
search(&first);
break;
}
case3:
{
insert(&first);
break;
}
case4:
{
delet(&first);
break;
}
case5:
{
printf("BYEBYE!
\n");
system("pause");//系统暂停
getchar();
exit(0);
}
}
}
getchar();
return0;
}
以下是部分运行结果:
初始化的界面
选择界面:
创建链表中的输入界面:
查找中的提示界面:
限于篇幅,运行结果就只列举这么多。
上机总结
这是自从学习C语言以来我编写过的最大的一个程序,编写的时候遇到了前所未有的困难。
因为这个程序所涉及到的知识,全部是要靠自学掌握的。
期间我问过很多人,都说这个没有可能做出来,我也一度想放弃,而且在假期也没有时间没有条件来编写这个程序。
后来还是勉强做了,这也是这个程序中有很多不足之处的原因。
比如这个程序未能做到将文件保存到磁盘中,这是最明显的一个缺点。
然后其中还有一些可以简化的地方,也有一些可以让界面更加友好的地方(如上面提到的删除可以按姓名和学号两种不同的方式)。
总之可以改进的地方很多。
但这个程序可以说是自己一点一点设计而来,还是能让人感到一点成就感的。
另外一点就是以后虽然不再学习C语言,但自己在下面也应该勤于练习,不能把这门技能给丢了,我们应该为我们的以后着想。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 报告