C语言课程设计报告职工信息管理系统设计范文.docx
《C语言课程设计报告职工信息管理系统设计范文.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告职工信息管理系统设计范文.docx(15页珍藏版)》请在冰豆网上搜索。
![C语言课程设计报告职工信息管理系统设计范文.docx](https://file1.bdocx.com/fileroot1/2023-2/23/73b3e74b-39f7-4e24-b5e9-612be500f223/73b3e74b-39f7-4e24-b5e9-612be500f2231.gif)
C语言课程设计报告职工信息管理系统设计范文
职工信息管理系统设计
一、设计任务
课题:
职工信息管理系统设计
职工信息包括职工号,姓名,性别,年龄,学历,工资,住址,电话等(职
工号不重复)。
是设计一职工信息管理系统,使之能提供以下功能:
系统以菜单方式工作
职工信息录入功能(职工信息用文件保存)——输入
职工信息浏览功能——输出
查询和排序功能——算法
按工资查询
按学历查询等
职工信息删除,修改功能。
补充要求:
1)整个系统均用c语言实现;
2)可以利用数组,指针,链表来实现数据结构设计;
3)系统具有输入,显示,查询,删除,排序,插入,保存,读取等基本功能;
4)系统的各个功能模块都用函数的形式来实现;
5)可以将信息保存在文件中读取出来。
二、系统设计方案
1.程序采用模块化设计,主函数为程序的入口,各模块独立,可分块调试,各模块由主函数控制调用。
主函数的控制功能通过循环执行一个开关语句来实现。
该开关语句的条件值为调用主菜单函数得到的返回值,根据该值,调用相应的各功能函数。
2.应用高级语言程序设计中的基本控制结构,如选择和循环等,并且包含对文件的读、写等基本操作,在软件开发过程中应用了软件工程的基本理论。
因此,系统的设计方法是结构化设计方法,开发手段是C语言。
3.源程序运用多个函数,开头先进行函数声明,然后分别定义、调用各函数。
程序流程图
三、程序主要代码分析
/*下面定义职工信息结构*/
typedefstructworker
{
intid;
charname[20];
charsex[3];
intage;
charedu[50];
intwages;
charadr[255];
charphone[13];
}WORKER,*PWORKER;
//typedefstructWORKER*PWORKER;
typedefstructlink
分析:
我认为链表的使用正是本程序的最精彩的地方所在,较数组而言它的使用带来了很多优点:
(1)空间的灵活分配,虽然地址不是连续的,但只要找到链表的头所有数据都可以迅速找到
(2)可以灵活的插入或删除元素而不会像数组那样带来较多数据的移动
{
WORKERw;
structlink*next;
}LINK,*PLINK;
//typedefstructLINK*PLINK;
/*创建职工信息链表*/
PLINKcreate()
{
PLINKp=(PLINK)malloc(sizeof(LINK));
if(NULL!
=p)
{
p->next=NULL;
returnp;
}
printf("内存不足!
\n");
returnNULL;
}
/*显示程序界面文字*/
voidmessage()
{system("color09f");/*设置当前窗口的背景色和前景色*/
分析:
界面设计我运用了适当的标点使得界面变得清晰大方,背景色的添加也可给用户新的视觉效果
/*0=黑色8=灰色
1=蓝色9=淡蓝色
2=绿色A=淡绿色
3=浅绿色B=淡浅绿色
4=红色C=淡红色
5=紫色D=淡紫色
6=黄色E=淡黄色
7=白色F=亮白色*/
system("cls");
printf("\t\t************************************************\n\n");
printf("\t\t>>>>>>>>>>>>>>欢迎进入职工管理系统<<<<<<<<<<<<<<\n\n");
printf("\t\t************************************************\n\n");
printf("\t\t**************ChooseFunction*************\n\n");
printf("\t\t************帮助请输入:
0************\n\n");
printf("\t\t************录入职工信息请输入:
1************\n\n");
printf("\t\t************浏览职工信息请输入:
2************\n\n");
printf("\t\t************查询职工信息请输入:
3************\n\n");
printf("\t\t************删除职工信息请输入:
4************\n\n");
printf("\t\t************修改职工信息请输入:
5************\n\n");
printf("\t\t************清屏请输入:
6************\n\n");
printf("\t\t************退出请输入:
-1***********\n\n");
printf("\t\t************************************************\n\n");
printf("\t\t************************************************\n\n");
}
/*录入职工信息*/
intadd(PLINKp)
{
分析:
周密地考虑到了内存不足以及职工号已存在导致的录入失败,给予用户适当的提示使得设计更加人性化
PLINKh=NULL;
PLINKq=(PLINK)malloc(sizeof(LINK));
if(NULL==q)
{
printf("录入失败提示:
内存不足!
\n");
return-1;
}
printf("请输入职工号(数字):
");
scanf("%d",&q->w.id);
h=p->next;
while(h)
{
if(h->w.id==q->w.id)
{
free(q);
printf("录入失败提示:
此职工号已经存在!
\n");
return-1;
}
h=h->next;
分析:
适当的录入提示,更加方便了用户的录入操作
}
printf("请输入职工姓名(文字):
");
scanf("%s",&q->w.name);
printf("请输入职工性别(文字):
");
scanf("%s",&q->w.sex);
printf("请输入职工年龄(数字):
");
scanf("%d",&q->w.age);
printf("请输入职工学历(文字):
");
scanf("%s",&q->w.edu);
printf("请输入职工工资(数字):
");
scanf("%d",&q->w.wages);
printf("请输入职工住址(文字):
");
scanf("%s",&q->w.adr);
printf("请输入职工电话(文字):
");
scanf("%s",&q->w.phone);
q->next=p->next;
p->next=q;
printf(".^_^.录入成功!
.^_^.\n");
return-1;
}
/*按姓名查询*/
分析:
链表、结构指针的使用大大方便了信息的查找定位。
值得注意的是判断两字符串内容是否相同时需用到strcmp函数!
PLINKfindname(PLINKp,char*name)
{
message();
printf("按姓名查询\n");
printf("职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话\n");
while(NULL!
=p->next)
{
if(0==strcmp(p->next->w.name,name))
{
printf("%d\t%s\t%s\t%d\t%s\t%d\t%s\t%s\n",
p->next->w.id,p->next->w.name,p->next->w.sex,p->next->w.adr,
p->next->w.edu,p->next->w.wages,p->next->w.adr,p->next->w.phone);
returnp;
}
p=p->next;
}
printf(".^_^.查询结束!
.^_^.\n");
returnNULL;
}
/*按职工号删除职工信息*/
intdel(PLINKp,intid)
{
message();
printf("按职工号删除职工信息\n");
while(NULL!
=p->next)
{
if(p->next->w.id==id)
{
PLINKq=p->next;
p->next=p->next->next;
free(q);
printf(".^_^.删除成功!
.^_^.\n");
return1;
}
p=p->next;
}
printf("没有你输入的职工号!
\n");
return-1;
}
分析:
及时的在程序结束时释放内存,避免占用多余的空间充分显示出了链表使用的优越性,占用最小的空间满足用户更多的需求
/*程序结束释放内存*/
voidrelease(PLINKp)
{
PLINKq;
while(NULL!
=p->next)
{
q=p;
p=p->next;
free(q);
}
free(p);
分析:
此处是我对源程序的改进处之一,用此函数调用另外3种查询方式使得界面变得更清晰简单些,虽然只是小小switch函数的使用但会使用户的使用更具目的指向性
}
/*查询调用*/
voidsearch()
{
intid;
charname[20];
charstr[20];
PLINKpworker;
intl;
printf("\t\t\t\t*姓名查找按:
1*\n");
printf("\t\t\t\t*学历查找按:
2*\n");
printf("\t\t\t\t*职工号查按:
3*\n");
scanf("%d",&l);
if(l>0&&l<4)
{switch(l)
{
case1:
printf("请输入要查询的职工姓名:
");
scanf("%s",name);
findname(pworker,name);
break;
case2:
printf("请输入要查询的职工学历:
");
scanf("%s",str);
find_sr(pworker,str);
break;
case3:
printf("请输入要查询的职工号:
");
scanf("%d",&id);
findid(pworker,id);
break;
}
printf("\n\n选择完毕!
!
!
");
}
elseprintf("\t\t\t\t输入有误!
!
!
");
}
/*修改职工信息*/
intmodify(PLINKp)
{intid;
PLINKq;
分析:
此修改函数是我对原函数的一个补充,弥补了原程序修改功能的缺失,但相比较别人的函数似乎浪费了许多资源,单个信息的修改根本不需要如此大费周章,急需一改进——就是对需改进处的准确定位。
当然相比较我原本打算的先删除再录入还是有了一定的进步之出
PLINKh=NULL;
printf("请输入职工号(数字):
");
scanf("%d",&id);
h=p->next;
while(h)
{
if(h->w.id==id)
{
break;
}
h=h->next;
}
if(h==NULL)
{
printf("找不到此职工,请重试\n");
return-1;
}
printf("请输入职工姓名(文字):
");
scanf("%s",&h->w.name);
printf("请输入职工性别(文字):
");
scanf("%s",&h->w.sex);
printf("请输入职工年龄(数字):
");
scanf("%d",&h->w.age);
printf("请输入职工学历(文字):
");
scanf("%s",&h->w.edu);
printf("请输入职工工资(数字):
");
scanf("%d",&h->w.wages);
printf("请输入职工住址(文字):
");
scanf("%s",&h->w.adr);
printf("请输入职工电话(文字):
");
scanf("%s",&h->w.phone);
q->next=p->next;
p->next=q;
printf(".^_^.修改成功!
.^_^.\n");
return-1;
}
intmain()
{
intcmd=0;
分析:
主函数实现了控制调用其他函数的功能,一个while循环给用户以多次更改的机会,从而更好的满足用户的不同要求。
swith条件语句,编写简单明了,恰到好处的考虑到了用户的需求
intid;
charname[20];
charstr[20];
PLINKpworker;
if(!
(pworker=create()))
{
exit(0);
}
while(cmd!
=-1)
{
switch(cmd)
{
case0:
message();break;
case1:
add(pworker);break;
case2:
show(pworker);break;
case3:
search();break;
case4:
printf("请输入要删除的职工号:
");
scanf("%d",&id);
del(pworker,id);
break;
case5:
modify(pworker);break;
case6:
message();break;
}
printf("请输入操作命令数字:
\n");
scanf("%d",&cmd);
}
printf(".^_^.谢谢使用!
.^_^.\n");
release(pworker);
return0;
}
四、程序调试中出现的问题及其解决方法
(1)由于开始不能完全看懂链表在各个函数中是怎样调用的,以致编写查询调用search()函数时,一再出现什么什么未定义的状况
解决方法:
加入“charname[20];charstr[20];PLINKpworker;”对未定义的结构、数组什么的定义一下就完成了
(2)计划加入背景色时,对“system("color09f");”应该添加的位置很难琢磨
解决方法:
经查阅资料了解该函数可能添加的位置,最终放在了界面设计message()函数中,终于可以正常运行了
(3)各种变量的运用需要注意,稍对程序进行改动就会出现各种变量未定义
解决方法:
再次通看源程序,分清外部变量、局部变量
五、改进意见与收获体会
改进意见:
(1)运行程序时,输入信息后,再关闭,输入的数据会丢失,所以急需一个实时保存的函数,写入一文件中,可以下次使用时打开读取
(2)修改函数中需要一定位功能避免需要对一个记录整体修改,耗时又增大了继续录入错误的可能性
(3)界面设计可以更加灵活一些,加入动画或是什么的。
或者可以考虑利用书中提供的下拉菜单的方式使使用更方便便捷
(4)对不同用户进行不同的登录方式或许会更加实用,可以分普通职工用户、高层管理人员、系统管理人员,对不同用户提供更据针对性的服务,比如职工主要就是浏览查询个人资料,高层管理可查询了解所有职工的信息,系统管理人员用到修改、删除等功能
(5)加入登录时的密码保护,便于保护各个用户的私人资料不外漏,这样会使程序更加人性化
收获体会:
回顾起此次课程设计,我感慨颇多,从拿到题目到完成整个编程,从理论到实践,一星期里,我学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,链表,文件,循环,…半个学期的学习以及这一周的课程设计,我的C语言学习出现了很多的问题,可以看到基础的薄弱,通过请教同学,讨论,问题都一一得到了解决。
对于模块设计一开始真不知道从何下手,后来看了许多别人的设计才有所了解,这过程中最难的就是修改这两个模块。
开始编写修改时,很头疼,去向其他人寻求帮助,在别人的帮助和提示下,多个程序的参考结合,终于大功告成。
当然我也充分发现每个软件编程的不易,对用户多角度的考虑,对函数的兼容性,高效性,易读性等一系列问题的考虑使我学会了更加周密的思考问题。
也使我对C语言这门学科更深刻的认识,她不仅是一门学科,更重要的是如何运用到实际生活中。
今后,我应该会考虑参加一定的科创活动,更多的运用C语言。