C语言课程设计报告职工管理.docx
《C语言课程设计报告职工管理.docx》由会员分享,可在线阅读,更多相关《C语言课程设计报告职工管理.docx(22页珍藏版)》请在冰豆网上搜索。
C语言课程设计报告职工管理
目录
第1章课题概述(课题介绍、……)1
1.1课题的目的1
1.2课题的要求1
1.2.1输入输出的要求1
1.2.2程序所要实现的功能1
第2章设计思路(概要设计、总体设计、……)2
2.1存储结构的确定2
2.2程序流程图2
第3章程序实现3
3.1存储结构与方式3
3.2程序中各函数分析3
第4章问题与解决15
第5章程序测试16
第6章总结22
参考文献23
第1章课题概述(课题介绍、……)
1.1课题的目的
课程设计题目:
职工信息管理程序;
要求设计一个程序,能够对输入的职工信息进行修改、删除、查询、排序等功能。
各功能以菜单方式列出,由用户进行选择。
1.2课题的要求
1.2.1输入输出的要求
(1)输入的职工信息以文件形式保存;
(2)输出时以职工号和工资排序;
1.2.2程序所要实现的功能
程序需要实现的功能有:
(1)职工信息的录入功能(职工信息用文件Workers.dat保存);
(2)职工信息的删除、修改功能;
(3)职工信息浏览功能;
(4)按职工号和姓名查询的功能;
(5)按职工号和资排序的功能;
(6)各功能以菜单方式列出,由用户进行选择。
第2章设计思路(概要设计、总体设计、……)
2.1存储结构的确定
课题要求职工信息以文件形式保存,存储结构确定为结构体数组。
成员分别包括职工号、姓名、性别、年龄、学历、工资、住址电话等。
2.2程序流程图
整个程序的流程如图2-1所示。
图2-1
第3章程序实现
3.1存储结构与方式
在程序运行时,文件以结构体数组的方式存储在内存中,再以文件形式保存到硬盘。
structemployee/*定义结构体*/
{
intnumber;/*职工号*/
intage;/*年龄*/
intwage;/*工资*/
charname[20],sex[10],address[30],xueli[20];/*姓名、性别、地址、学历*/
longinttelephone;/*电话*/
}em[N];
FILE*fp;/*打开文件*/
if((fp=fopen("Workers.txt","ab+"))==NULL)
{
printf("不能打开该文件:
\n");
exit
(1);
}
3.2程序中各函数分析
表3-1程序中的函数列表
函数名
函数功能
main()
主函数
search()
选择查找方式
search_name()
查找姓名
search_number()
查找职工号
display()
显示职工信息
del()
删除职工信息
input()
输入职工信息
change()
修改职工信息
sortNumber()
按职工号对职工进行排序
sortWage()
按工资对职工进行排序
(1)main()
显示系统工作菜单,罗列该系统所有功能。
先声明所有将会调用到的函数名。
再运用选择函数switch即可根据使用者所输入的功能代号进入对应的功能程序。
同时通过对文件数据的读取,获得当前文件中的职工个数。
main()
{
……/*函数申明,已省略*/
intk;
inti;
intn;
FILE*fp;
if((fp=fopen("Workers.txt","ab+"))==NULL)/*打开方式选择“ab+”,当文件不存在时,可创建文件*/
{
printf("不能打开该文件:
\n");
exit
(1);
}
for(i=0;i<=N;i++)/*“i”为读取出的人数*/
if(fread(&em[i],sizeof(em[i]),1,fp)==0)/*当读取后的返回值是“0”则读取结束*/
break;
people=i;/*当读取结束后将代表当前人数的“i”赋值给人数“people”*/
……/*输出菜单,已省略*/
scanf("%d",&n);
switch(n)/*选择功能*/
{
case1:
printf("◆◆◆输入职工信息◆◆◆\n");printf("\n");k=input();main();break;
case2:
printf("◆◆◆浏览职工信息◆◆◆\n");printf("\n");display();main();break;
case3:
printf("◆◆◆查询职工信息◆◆◆\n");printf("\n");search();break;
case4:
printf("◆◆◆删除职工信息◆◆◆\n");printf("\n");del();break;
case5:
printf("◆◆◆修改职工信息◆◆◆\n");printf("\n");change();break;
case6:
printf("◆◆◆按职工号排序◆◆◆\n");printf("\n");sortNumber();break;
case7:
printf("◆◆◆按工资排序◆◆◆\n");printf("\n");sortWage();break;
case8:
exit(0);break;
default:
break;
}
}
(2)search()
该函数的功能是输出查找菜单,选择查找方式。
voidsearch()
{
intt;
printf("\n按职工号查询按1\n按姓名查询请按2");
printf("\n返回主菜单请按3\n");
scanf("%d",&t);
switch(t)
{
case1:
printf("\n按职工号查询\n");
search_number();
break;
case2:
printf("\n按姓名查询\n");
search_name();
break;
case3:
main();break;
default:
printf("输入错误,请重新输入!
\n");
search();
break;
}
}
(2)search_name()
查找姓名。
定义字符串数组“name[20]”,输入想要查找的姓名,赋值给“name”。
用for循环将“name”中的字符串与结构体数组中的成员“name”进行比较。
如相同,则输出该成员所在的结构体数组;如比较完毕还未找到相同项,则输出“查无此人”
voidsearch_name()
{
inti;
charname[20];
……/*打开文件,已省略*/
printf("\n请输入要查询的姓名:
");
scanf("%s",name);
for(i=0;iif(!
strcmp(em[i].name,name))/*查找相同项*/
{
printf("\n该职工信息如下:
\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话\n");
printf("\n%d\t%8s\t%s\t%d\t%8s\t%d\t%s\t%d\n",em[i].number,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone);
printf("\n");
break;
}
if(i==people)/*当“i”值等于当前人数时,即没有相同项*/
printf("\n查无此人\n");
fclose(fp);
search();
}
(3)search_number()
查找职工号,与“查找姓名”功能类似,原理类似。
(4)display()
显示。
显示文件中的职工信息,用for循环输出。
原理较简单,不在此处详述。
(5)del()
删除。
先通过用户输入,确定要删除的员工的姓名。
用for循环查找此人。
用此人所在的结构体数组的后一个结构体数组替代此人所在的结构体数组,以此类推,将职工信息删除。
voiddel()
{
inti,t,j,m,l;
charname[20];
……/*打开文件,已省略*/
printf("\n所有职工信息:
\n");
display(people);
printf("\n请输入要删除职工的名字:
");
scanf("%s",name);
for(i=0;i{
if(!
strcmp(em[i].name,name))/*查找*/
{
printf("\n确认删除请按1\n取消请按2\n");
scanf("%d",&t);
if(t==1)
{
for(j=i;j{
em[j].age=em[j+1].age;
em[j].wage=em[j+1].wage;
em[j].number=em[j+1].number;
em[j].telephone=em[j+1].telephone;
strcpy(em[j].xueli,em[j+1].xueli);
strcpy(em[j].name,em[j+1].name);
strcpy(em[j].address,em[j+1].address);
strcpy(em[j].sex,em[j+1].sex);
}
people--;/*删除后,人数减少,故“people”执行自减*/
for(l=0;lfwrite(&em[l],sizeof(em[l]),1,fp);
break;
}
if(t==2)
break;
}
}
if(j==people)
printf("\n输入错误,无此人\n");
fclose(fp);
printf("\n继续删除请按1\n浏览信息请按2\n返回主菜单请按3\n");
scanf("%d",&m);
switch(m)
{
case1:
del(people);break;
case2:
display(people);main();break;
case3:
main();break;
default:
break;
}
}
(6)input()
录入职工信息。
用scanf输入职工信息,用fwrite保存到文件。
intinput()
{
FILE*fp;
……/*打开文件,已省略*/
fflush(stdin);
printf("请输入职工号:
");
scanf("%d",&em[people].number);
fflush(stdin);
printf("请输入姓名:
");
scanf("%s",em[people].name);
fflush(stdin);
printf("请输入性别:
");
scanf("%s",&em[people].sex);
fflush(stdin);
printf("请输入年龄:
");
scanf("%d",&em[people].age);
fflush(stdin);
printf("请输入学历:
");
scanf("%s",em[people].xueli);
fflush(stdin);
printf("请输入工资:
");
scanf("%d",&em[people].wage);
fflush(stdin);
printf("请输入住址:
");
scanf("%s",em[people].address);
fflush(stdin);
printf("请输入电话:
");
scanf("%d",&em[people].telephone);
fflush(stdin);
printf("\n");
printf("输入成功!
\n");
fwrite(&em[people],sizeof(structemployee),1,fp);
fclose(fp);
people++;/*每录入一次,员工人数加1,故“people”执行自增*/
returnpeople;/*将“people”返回,更新员工个数*/
}
(7)change()
修改职工信息。
用“scanf”语句输入想要修改的职工姓名,查找该员工。
再查找到该员工后,通过“switch”语句选择要修改的职工信息,用赋值语句将要修改的职工信息赋值到原职工信息。
/*修改*/
voidchange()
{
intnum;
charname[10];
charsex;
intage;
charxueli[30];
intwage;
charaddr[30];
longinttel;
inti,t,n,k;
……/*打开文件,已省略*/
printf("\n原来的职工信息:
\n");
display(people);
printf("输入想要更改信息的员工名字:
\n");
scanf("%s",&name);
for(i=0;i{
if(!
strcmp(em[i].name,name))
{
printf("要修改的员工信息为:
\n");
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话\n");
printf("\n%d\t%8s\t%s\t%d\t%8s%d\t%s\t%d\n",em[i].number,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone);
printf("\n");
printf("确认修改输入1,返回输入2\n");
scanf("%d",&n);
if(n==1)
{
printf("请输入想要修改的内容:
\n1.职工号\n2.姓名\n3.性别\n4.年龄\n5.学历\n6.工资\n7.住址\n8.电话\n");
scanf("%d",&t);/*选择想要修改的信息*/
if(t>8||t<1)
printf("输入错误,请输入1~8之间的任意整数!
\n");
switch(t)/*将新信息赋值给旧信息以实现修改*/
{
case1:
printf("职工号改为:
");
scanf("%d",&num);
em[i].number=num;
break;
case2:
printf("姓名改为:
");
scanf("%s",name);
strcpy(em[i].name,name);
break;
case3:
printf("性别改为:
");
scanf("%s",&sex);
strcpy(em[i].name,name);
break;
case4:
printf("年龄改为:
");
scanf("%d",&age);
em[i].age=age;
break;
case5:
printf("学历改为:
");
scanf("%s",xueli);
strcpy(em[i].xueli,xueli);
break;
case6:
printf("工资改为:
");
scanf("%d",&wage);
em[i].age=age;
break;
case7:
printf("住址改为:
");
scanf("%s",addr);
strcpy(em[i].address,addr);
break;
case8:
printf("电话改为:
");
scanf("%ld",&tel);
em[i].telephone=tel;
break;
}
printf("\n是否确定所修改的信息?
\n是请按1;不,重新修改请按2:
\n");
scanf("%d",&k);
if(k==1)/*保存信息*/
{
for(i=0;ifwrite(&em[i],sizeof(em[i]),1,fp);
fclose(fp);
}
else
change();
}
}
}
if(i==people)
printf("\n查无此人\n");
main();
}
(8)sortNumber()
按职工号排序。
排序方式选择冒泡排序法。
voidsortNumber()
{
inti,j;
structemployeep;
……/*打开文件,已省略*/
for(i=0;i{
for(j=0;j
{
if(em[i].number{
p=em[i];
em[i]=em[j];
em[j]=p;
}
}
}
printf("\n职工号\t姓名\t性别\t年龄\t学历\t工资\t住址\t电话\n");
for(i=0;iprintf("\n%d\t%8s\t%s\t%d\t%8s\t%d\t%s\t%d\n",em[i].number,em[i].name,em[i].sex,em[i].age,em[i].xueli,em[i].wage,em[i].address,em[i].telephone);
printf("\n");
fclose(fp);
main();
}
(9)sortWage()
按工资排序,与“sortNumber()”函数类似。
第4章问题与解决
编写程序的过程中遇到了很多问题,但是通过询问老师和与同组同学讨论都一一解决了,这些问题主要是以下几种类别:
一、程序编写时遇到的问题与解决
没有编写类似教复杂的程序的经验,先前都是做的一些小功能。
虽然单个功能的编写不会有太大问题,但将他们组合在一起时有种无从下手的感觉。
在经过老师的和参考网上的类似程序,终于将程序完成。
在初次编写时,使用了多个全局变量,导致在程序实现的过程中出现了多个问题,数次修改无果,询问老师后,老师给的建议是,尽量少用全局变量。
经过修改后,程序思路变得清晰了,错误也解决了。
二、程序实现时遇到的问题
Q1:
程序关闭后再次运行时,上次输入的数据无法读取;
A1:
这个问题研究了很久,始终被禁锢在原本的思路中,跳不出来。
初步认为数据并没有保存到文件。
手动打开文件,发现文件中存在数据,但并不是以正确的方式保存。
在询问了老师后,老师教了我一种方法,在主函数中增加一端代码,在程序运行时能够读取文件中的人数,之后保存正确,程序再次运行时也读取正确。
Q2:
程序的修改功能是采用将新信息赋值给旧信息的方法,在赋值语句中,出现过编译错误;
A2:
开始的时候为了这个问题十分头痛,不知道该怎么办才好,不管是翻阅参考书还是上网搜索资料,都找不到合适的方式,后来在仔细分析程序后,发现结构体数组中的成员类型不同,而我都是用strcpy语句进行赋值,故出现错误;
第5章程序测试
图6-1程序主菜单
图6-2输入界面
图6-3输入界面
图6-4浏览界面
图6-5查询
图6-6查询
图6-7删除
图6-8删除
图6-9修改
图6-10修改
图6-11排序
图6-12排序
第6章总结
经过一学年的C语言学习,我们掌握了C语言的基础知识,能够读懂别人用c语言设计的程序。
平时的程序设计大多是以填空、纠错的形式出现,做的编程题也都是一些小程序。
而这一周的课程设计,却让我们完完全全用自己学到的知识编写一个完整的体统程序。
这是一个新的挑战,也是一种新的学习。
我选择的是职工信息管理系统。
这需要我们自己设计一个系统,可以输入信息,保存到文件里,再从文件里调出来,使之显示在屏幕上,进行删除、添加等对信息的修改。
初看到这个题目觉得很简单,但当我做到电脑前准备开始编写代码的时候才发现无从下手。
通过去图书馆查找程序设计相关的书籍,和上网参考前人编写的类似程序,我脑中才有了一个大概方向。
在这次课程设计的过程中,我运用了老师交给我们的方法:
先将一个个的小功能编写出来,再将他们串联起来,组合成一个程序。
初步串联起来后会有各种奇怪的问题出现。
在理清楚了整个程序的思路后,一点一点仔细修改,慢慢的程序中的错误越来越少,随着程序运行的成功,预示着我们的职工信息管理系统大功告成!
总之,经过这一次的课程设计,我们体会到了痛苦与快乐同存的感觉。
当最后一次成功串联运行所有函数时,真的很