数据结构课程设计报告简单的职工管理系统.docx
《数据结构课程设计报告简单的职工管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告简单的职工管理系统.docx(20页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告简单的职工管理系统
数据结构课程设计
题目名称:
简单的职工管理系统
计算机科学与技术学院
1.需求分析
1.问题描述
对单位的职工进行管理,包括插入、删除、查找、排序等功能。
2.要求
职工对象包括、性别、出生年月、工作年月、学历、职务、住址、等信息。
(1)新增一名职工:
将新增职工对象按以字典方式职工管理文件中。
(2)删除一名职工:
从职工管理文件中删除一名职工对象。
(3)查询:
从职工管理文件中查询符合某些条件的职工。
(4)修改:
检索某个职工对象,对其某些属性进行修改。
(5)排序:
按某种需要对职工对象文件进行排序。
3.实现提示
职工对象数不必很多,便于一次读入存,所有操作不经过外存交换。
(1)由键盘输入职工对象,以文件方式保存。
程序执行时先将文件读入存。
(2)对职工对象中的""按字典顺序进行排序。
(3)对排序后的职工对象进行增、删、查询、修改等操作。
2.概要设计
1.设计一个职工的结构体
typedefstructWorker
{
char*name;
char*sex;
char*Bothdate;
char*Workdate;
char*school;
char*duty;
char*address;
char*phone;
structWorker*next;
}worker;
2.主体函数
(1).输入函数
voidScanfwork(worker**phead,worker**pend,intnum);
(2).输出函数
voidPrintfwork(worker*phead);
(3).查询职工函数
voidFindworker(worker*phead);
(4).更新职工函数
voidUpdata(worker*phead);
(5).删除职工函数
voidDelwork(worker**phead,worker**pend);
voidDelete(worker**phead,worker**pend,char*name);
(6).按字典排序函数
worker*Sort(worker**phead,worker**pend,intnum);
(7).文件调用函数
voidsave(worker*phead);
(8).增加职工函数
voidAddworker(worker**phead,worker**pend,worker*p);
worker*GetnodeIn();
3.详细设计
1.流程图
2.代码详细分析
(1).输入函数
voidScanfwork(worker**phead,worker**pend,intnum)
{
inti;
srand((unsignedint)time(0));
for(i=0;i{
Addworker(phead,pend,Getwork());
}
}
(2).输出函数
voidPrintfwork(worker*phead)
{
while(phead)
{
printf("%s%s%s%s%s%s%s%s\n",phead->name,phead->sex,phead->Bothdate,phead->Workdate,phead->school,phead->duty,phead->phone,phead->address);
phead=phead->next;
}
printf("b返回主菜单");
key=getchar();
switch(key)
{
case'b':
return;
break;
default:
printf("按错了\n");
}
}
(3).查询职工函数
voidFindworker(worker*phead)
{
char*keyword=NULL;
worker*w=NULL;
worker*newhead=NULL;
worker*newend=NULL;
worker*pDel=NULL;
worker*bj=phead;
while
(1)
{
while
(1)
{
printf("请输入要查询的关键字:
");
keyword=getstring();
printf("按a键确认你的输入,按其他键重新输入:
");
if(getkey()=='a')
{
break;
}
else
{
free(keyword);
keyword=NULL;
}
}
phead=bj;
while(phead)
{
if(strncmp(phead->name,keyword,strlen(keyword))==0||
strncmp(phead->sex,keyword,strlen(keyword))==0||
strncmp(phead->Bothdate,keyword,strlen(keyword))==0||
strncmp(phead->Workdate,keyword,strlen(keyword))==0||
strncmp(phead->school,keyword,strlen(keyword))==0||
strncmp(phead->duty,keyword,strlen(keyword))==0||
strncmp(phead->address,keyword,strlen(keyword))==0||
strncmp(phead->phone,keyword,strlen(keyword))==0)
{
w=(worker*)malloc(sizeof(worker));
w->name=phead->name;
w->sex=phead->sex;
w->Bothdate=phead->Bothdate;
w->Workdate=phead->Workdate;
w->duty=phead->duty;
w->school=phead->school;
w->address=phead->address;
w->phone=phead->phone;
w->next=NULL;
Addworker(&newhead,&newend,w);
}
phead=phead->next;
}
if(newhead!
=NULL)
{
Printfwork(newhead);
while(newhead)
{
pDel=newhead;
newhead=newhead->next;
free(pDel);
pDel=NULL;
}
newhead=NULL;
newend=NULL;
}
if(key=='b')
{
return;
}
else
{
printf("没有找到\n");
}
}
}
(4).更新职工函数
voidUpdata(worker*phead)
{
worker*bj=phead;
char*name1;
while
(1)
{
printf("请输入要修改的名字");
name1=getstring();
phead=bj;
while(phead)
{
if(strncmp(phead->name,name1,strlen(name1))==0)
{
printf("请输入新的");
free(phead->phone);
phead->phone=getstring();
}
phead=phead->next;
}
printf("y继续修改,其他键返回");
if(getkey()!
='y')
{
return;
}
}
}
(5).删除职工函数
voidDelwork(worker**phead,worker**pend)
{
char*name1;
while
(1)
{
printf("请输入删除的:
");
name1=getstring();
Delete(phead,pend,name1);
printf("按y继续删除其他键返回主菜单\n");
if(getkey()!
='y')
{
return;
}
}
}
voidDelete(worker**phead,worker**pend,char*name)
{
worker*bj=*phead;
worker*pDel=NULL;
if(strncmp((*phead)->name,name1,strlen(name1))==0)
{
pDel=*phead;
*phead=(*phead)->next;
free(pDel);
pDel=NULL;
return;
}
while(bj->next!
=NULL)
{
if(strncmp(bj->next->name,name1,strlen(name1))==0)
{
pDel=bj->next;
bj->next=bj->next->next;
free(pDel);
pDel=NULL;
if(bj->next==NULL)
{
*pend=bj;
}
return;
}
bj=bj->next;
}
}
(6).按字典排序函数
worker*Sort(worker**phead,worker**pend,intnum)
{
inti;
intj;
worker*bj=*phead;
worker*sign=NULL;
worker*sign1=NULL;
chartemp[20]={0};
chartemp1[20]={0};
chartemp2[20]={0};
chartemp3[20]={0};
chartemp4[20]={0};
chartemp5[20]={0};
chartemp6[15]={0};
chartemp7[12]={0};
for(i=0;i{
bj=(*phead);
sign=bj;
for(j=i+1;j{
sign1=sign->next;
if(strncmp(sign->name,sign1->name,strlen(sign1->name))>=0)
{
strcpy(temp,sign->name);
strcpy(temp1,sign->sex);
strcpy(temp2,sign->Bothdate);
strcpy(temp3,sign->Workdate);
strcpy(temp4,sign->school);
strcpy(temp5,sign->duty);
strcpy(temp6,sign->address);
strcpy(temp7,sign->phone);
strcpy(sign->name,sign1->name);
strcpy(sign->sex,sign1->sex);
strcpy(sign->Bothdate,sign1->Bothdate);
strcpy(sign->Workdate,sign1->Workdate);
strcpy(sign->school,sign1->school);
strcpy(sign->duty,sign1->duty);
strcpy(sign->address,sign1->address);
strcpy(sign->phone,sign1->phone);
strcpy(sign1->name,temp);
strcpy(sign1->sex,temp1);
strcpy(sign1->Bothdate,temp2);
strcpy(sign1->Workdate,temp3);
strcpy(sign1->school,temp4);
strcpy(sign1->duty,temp5);
strcpy(sign1->address,temp6);
strcpy(sign1->phone,temp7);
}
sign=sign->next;
}
}
return*phead;
}
(7).文件调用函数
voidsave(worker*phead)
{
FILE*pf;
fopen_s(&pf,"F:
\\worker.txt","w+");
while(phead)
{
fprintf(pf,"%s%s%s%s%s%s%s%s\n",phead->name,phead->sex,phead->Bothdate,phead->Workdate,phead->school,phead->duty,phead->phone,phead->address);
phead=phead->next;
}
fclose(pf);
}
(9).增加职工函数
voidAddworker(worker**phead,worker**pend,worker*p)
{
if(*phead==NULL)
{
*phead=p;
}
else
{
(*pend)->next=p;
}
*pend=p;
}
worker*GetnodeIn()
{
worker*w=(worker*)malloc(sizeof(worker));
printf("请输入名字\n");
w->name=getstring();
printf("请输入性别\n");
w->sex=getstring();
printf("请输入出生年月\n");
w->Bothdate=getstring();
printf("请输入工作年月\n");
w->Workdate=getstring();
printf("请输入学历\n");
w->school=getstring();
printf("请输入职务\n");
w->duty=getstring();
printf("请输入\n");
w->phone=getstring();
printf("请输入住址\n");
w->address=getstring();
w->next=NULL;
returnw;
}
4.调试分析
1.在写职工程序的时候遇到了单链表排序问题,解决的方法我选择了询问网络以及身边的朋友
2.当写删除的时候遇到了头删除的问题,解决方法我选择了查看书籍
3.当调用文件保存的时候也遇到了问题,例如文件容不能直接覆盖,数据不能全部输出等问题,解决的方法我选择了询问网络,查看视频等
4.在写职工程序的时候,虽然遇到了很多问题,我通过自己的努力以及身边朋友的帮助,使我克服了问题,这次的课程设计提高我自己写代码能力,以及训练了我运用链表的增删改查方面的知识和文件的调用存取方面的知识。
5.用户使用说明
(1).可以直接运行程序,当运行程序后,会有五个选项
(2).可以通过选择序号来完成自已有想要做的事情
(3).数据会自动的存在文本文档,可以直接选择查看
(4).q可以直接退出程序
6.测试结果
(1).菜单测试结果
(2).查看职工测试结果
(3).添加职工测试结果
(4).查询职工测试结果
(5).修改职工测试结果
(6).删除职工测试结果
附录:
#include
#include
#include
#include
charkey;
intG_key;
typedefstructWorker
{
char*name;
char*sex;
char*Bothdate;
char*Workdate;
char*school;
char*duty;
char*address;
char*phone;
structWorker*next;
}worker;
worker*Getwork();
char*Getname();
char*Getsex();
char*GetBothdate();
char*GetWorkdate();
char*Getschool();
char*Getduty();
char*Getaddress();
char*Getphone();
chargetkey();
char*getstring();
voidAddworker(worker**phead,worker**pend,worker*p);
worker*GetnodeIn();
voidScanfwork(worker**phead,worker**pend,intnum);
voidPrintfwork(worker*phead);
voidFindworker(worker*phead);
voidUpdata(worker*phead);
voidDelwork(worker**phead,worker**pend);
voidDelete(worker**phead,worker**pend,char*name);
worker*Sort(worker**phead,worker**pend,intnum);
voidsave(worker*phead);
intmain()
{
worker*phead=NULL;
worker*pend=NULL;
worker*bj=NULL;
charc;
G_key=12;
Scanfwork(&phead,&pend,G_key);
bj=phead;
while
(1)
{
printf("1.查看职工信息\n");
printf("2.添加职工信息\n");
printf("3.查询职工信息\n");
printf("4.修改职工信息\n");
printf("5.删除职工信息\n");
printf("q.退出\n");
c=getkey();
switch(c)
{
case'1':
Printfwork(Sort(&phead,&pend,G_key));
save(Sort(&phead,&pend,G_key));
break;
case'2':
Addworker(&phead,&pend,GetnodeIn());
G_key+=1;
Printfwork(Sort(&phead,&pend,G_key));
save(Sort(&phead,&pend,G_key));
break;
case'3':
Findworker(phead);
break;
case'4':
Updata(phead);
save(Sort(&phead,&pend,G_key));
break;
case'5':
Delwork(&phead,&pend);
G_key-=1;
save(Sort(&phead,&pend,G_key));
break;
case'q':
return;
break;
}
}
return0;
}