职工信息管理系统 C语言实习报告.docx
《职工信息管理系统 C语言实习报告.docx》由会员分享,可在线阅读,更多相关《职工信息管理系统 C语言实习报告.docx(26页珍藏版)》请在冰豆网上搜索。
职工信息管理系统C语言实习报告
C语言课程实习报告
所在院系:
__经济管理学院___
班级学号:
__08108120081001708_
姓名:
__张梦莹______
程序已存档:
指导老师:
__赵曼____
评分:
____________
二零一零年一月十五日
目录
1.1题目分析
1.2需求分析
1.3总体设计
1.4详细设计
1.1.4主函数
1.4.2各功能模块设计
(1)输入模块
(2)浏览模块
(3)查找模块(包括修改)
(4)插入模块
3公共函数
(1)保存函数
(2)加载函数
(3)职工号输入函数
(4)输入整一个记录函数
(5)显示一个记录的函数
(6)结束选择浏览或返回函数
(7)修改整条数据记录函数
1.5程序测试
1.5.1数据源
1.5.2编译、连接和运行
1.5.3结果
1.6结束语--实习心得
职工信息管理系统
摘要:
本论文设计的程序是《C语言课程设计指导书》第11题--职工信息管理系统。
这个管理系统能对职工的信息(包括职工号、姓名、性别、年龄、学历、工资、住址、电话等)进行有效地信息录入、浏览、查询、插入、删除等操作,通过操作可以给各方面的用户带来很大的便利。
1.1题目分析
题目要求
职工信息包括职工号,姓名,性别,年龄,学历,工资,住址,电话等(职工号不重复)。
试设计一职工信息管理系统,使之能提供以下功能:
●系统以菜单方式工作。
●职工信息录入功能(职工信息用文件保存)。
●职工信息浏览功能。
●职工信息查询功能,查询方式可按学历查询或按职工号查询。
●职工信息删除,修改功能(可选项)。
[提示]
建立职工信息结构体,结构体成员包括职工号、姓名、性别、年龄、学历、工资、住址、电话。
1.2需求分析
根据题目要求,要求对职工信息进行输入、输出等操作;在程序中需要浏览职工的信息,应提供显示、查找、浏览、插入、修改等操作;另外还应提供键盘式选择菜单实现功能选择。
1.3总体设计
图1.3系统功能模块图
1.4详细设计
1.4.1主函数
主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。
其中各功能模块用菜单方式选择。
[流程图]:
显示各功能选项
图1.4.1主函数流程图
[程序]:
/*****************主函数**********************/
main()
{menu();
}
/*****************menu函数********************/
voidmenu()
{intn,w1;/*变量n保存选择菜单数字,w1判断输入的数字是否在功能菜单对应数字范围*/
do
{
puts("\t\t*****************职工信息管理系统****************\n\n");
puts("\t\t\t\t1.Enternewdata");
puts("\t\t\t\t2.Browseall");
puts("\t\t\t\t3.Search");
puts("\t\t\t\t4.Add");
puts("\t\t\t\t5.Exit");
puts("\n\n\t\t***********************************\n");
printf("Choiceyournumber(1-5):
[]\b\b");
scanf("%d",&n);
if(n<1||n>5)/*对选择的数字作出判断,是否在菜单功能数字范围内*/
{w1=1;getchar();}
elsew1=0;
}while(w1==1);
switch(n)/*根据输入的数字,进入到相应的操作模块中*/
{case1:
enter();break;/*输入模块*/
case2:
browse();break;/*浏览模块*/
case3:
search();break;/*查找模块,其中包括按不同类别进行查找的多个子模块*/
case4:
add();break;/*插入模块*/
case5:
exit(0);/*退出*/
}
}
注:
menu函数能提供菜单方式选择功能,可以根据用户需要进入到所想要的操作模块中,此外把menu函数独立出来,可以方便随时对它进行调用,容易返回到系统界面。
用结构体来存放职工信息:
/********************结构体*******************/
structworker
{
charnumber[11];
charname[20];
charsex[20];
charadress[20];
charxueli[20];
chartelephone[20];
charage[20];
charsalary[20];
}wor[N];
/*wor[N]中每个数组元素对应一个职工*/
其中可以根据宏定义#defineN随时对N的值进行调整,扩大信息的储存量。
1.4.2各功能模块设计
(1)输入模块
[需求分析]对信息进行输入。
[流程图]:
图1输入模块流程图
[程序]:
/********************输入模块*******************/
voidenter()/*输入函数*/
{
inti,n;
printf("Howmanyworkers(0-%d):
",N-1);
scanf("%d",&n);/*输入记录的个数,赋值给n*/
printf("\nEnterdatanow\n\n");
for(i=0;i{printf("\nInput%dthworkerrecord.\n",i+1);
input(i);/*调用单个输入函数*/
}
if(i!
=0)save(n);/*调用保存函数*/
printf_back();/*一个任务结束时让用户选择还是浏览还是返回*/
}
(2)浏览模块
[需求分析]该模块的功能是显示所有职工记录信息。
[流程图]
显示职工记录(10个一屏)
:
按任意键显示下一屏
按任意键返回主菜单
图2浏览模块流程图
[程序]:
/****************浏览(全部)模块***************/
browse()/*浏览(全部模块)*/
{
inti,j,n;
n=load();/*调用加载函数,并计算可以记录的个数*/
printf_face();/*调出显示数据结构项目函数*/
for(i=0;i{
if((i!
=0)&&(i%10==0))/*判断i值能否整除10,每10行一屏显示*/
{
printf("\n\nPassanykeytocontinue...");
getchar();
puts("\n\n");
}
printf_one(i);/*调用显示一个记录的函数*/
}
printf("\tThereare%drecord.\n",n);/*提示用户储存信息数量*/
printf("\nPassanykeytoback...");
getchar();/*按任意键*/
menu();/*返回主菜单*/
}
(3)查找模块
[流程图]:
:
图3查找模块流程图
[程序]:
/***************查找模块***************/
search()/*查找模块*/
{
intc,w1;
do/*do-while循环语句用来判断用户的选择是否在程序规定之内*/
{
puts("\nsearchby=>\n\n1).number2}.xueli3).cancelandback");
printf("Whichyouneeded?
:
[]\b\b");
scanf("%d",&c);
if(c>3||c<1)/*对选择的数字作出判断*/
{
puts("\nchoiceerror!
pleaseagain!
");
getchar();}
}
while(c>3||c<1);
{
switch(c)/*switch语句提供按不同类别进行查找功能*/
{
case1:
search1();break;/*按职工号进行查找*/
case2:
search2();break;/*按学历进行查找*/
case3:
menu();break;/*返回主菜单*/
}
}
}
/***************按职工号查找模块***************/
[流程图]:
按职工号查找模块
用户作出选择,输入一整型数值
1,2,还是3
1继续查找
3返回主菜单
2修改
图4按职工号查找模块流程图
[程序]:
search1()
{
inti,n,k,w1=1,w2,w3,w4;
structworkers;/*定义结构体变量s,用以储存输入的number的值,便于进行比较*/
n=load();/*加载将要记录的个数*/
do/*该do-while循环语句判断是否继续执行该函数*/
{
do/*该do-while循环语句判断是否找到要查找的对象*/
{
k==1;
printf("\n\nEnternumberthatyouwanttosearch!
number:
");
scanf("%s",s.number);
printf_face();/*调出显示数据结构项目函数*/
for(i=0;i同的职工号*/
if(strcmp(s.number,wor[i].number)==0)/*原数据信息中找到与输入职工号相
同的职工号*/
{k=i;
printf_one(k);break;
}
if(k==1)/*原数据信息中没有找到与输入职工号相同的职工号*/
{
printf("\n\nNoexit!
please");
printf("\n\nAreyouagain?
\n\t1).again2).Noandback[]\b\b");
scanf("%d",&w1);
if(w1==2)menu();/*返回主菜单*/
}
}while(k==1&&w1==1);/*在没有找到且想再次查找的情况下继续进行循环*/
w4=0;w3=0;
if(k!
==1)/*在查找到的情况下*/
{
printf("\n\nWhatdoyouwanttodo?
\n\t1).Searchanother2).Modify3).Backmenu[]\b\b");
scanf("%d",&w2);
switch(w2)
{case1:
search1();break;/*继续按照职工号查找其他对象*/
case2:
w3=modify_data(k,n);break;/*对查找到的对象进行修改*/
case3:
menu();break;/*返回主菜单*/
}
}
}while(w2==1);
menu();/*返回主菜单*/
}
/***************按职工学历查找模块***************/
[流程图]
按职工学历查找模块
用户作出选择,输入一整型数值
1,2,还是3
修改
继续查找
返回主菜单
图5按职工学历查找模块流程图
[程序]:
search2()
{inti,n,k,w1=1,w2,w3,w4;
structworkers;/*定义结构体变量s,用以储存输入的xueli的值,便于进行比较*/
n=load();/*加载将要记录的个数*/
do/*该do-while循环语句判断是否继续执行该函数*/
{
do/*该do-while循环语句判断是否找到要查找的对象*/
{k=-1;
printf("\n\nEnterxuelithatyouwanttosearch!
xueli:
");
scanf("%s",xueli);
printf_face();/*调出显示数据结构项目函数*/
for(i=0;i职工号*/
if(strcmp(s.xueli,wor[i].xueli)==0)/*原数据信息中找到与输入职工学历相同的职工*/
{k=i;
printf_one(k);break;
}
if(k==-1)/*原数据信息中没有找到与输入职工学历相同的职工号*/
{printf("\n\nNoexit!
please");
printf("\n\nAreyouagain?
\n\t1).again2).Noandback[]\b\b");
scanf("%d",&w1);
if(w1==2)menu();/*返回主菜单*/
}
}
while(k==-1&&w1==1);/*在没有找到且想再次查找的情况下继续进行循环*/
w4=0;w3=0;
if(k!
=-1)/*在查找到的情况下*/
{printf("\n\nWhatdoyouwanttodo?
\n\t1).Searchanother2).Modify3).Backmenu[]\b\b");
scanf("%d",&w2);
switch(w2)
{case1:
search1();break;/*继续按照职工学历查找其他对象*/
case2:
w3=modify_data(k,n);break;/*对查找到的对象进行修改*/
case3:
menu();break;/*返回主菜单*/
}
}
}
while(w2==1);
menu();/*返回主菜单*/
}
(4)插入模块
[需求分析]该模块的功能是插入职工记录信息并且不能覆盖原有职工信息。
[流程图]
插入模块
调用加载函数
让用户输入要插入的职工信息个数
调用整条信息输入函数
用户作出选择,输入1or2
1还是2
2返回主菜单
1浏览全部
图6插入模块流程图
【程序】
/*************************插入模块*********************/
add()/*插入模块*/
{
inti,n,m,k;
FILE*fp;
n=load();/*加载将要记录的个数*/
printf("Howmanyworkersareyouwanttoadd(0-%d)?
:
",N-1-n);
scanf("%d",&m);/*输入要插入职工信息的个数*/
k=m+n;
for(i=n;i{
printf("\nInput%dthworkersrecord.\n",i-n+1);
input(i);/*调用整条职工信息输入函数*/
}
if((fp=fopen("worker.txt","ab"))==NULL)
{
printf("cannotopenfile\n");
}
for(i=n;iif(fwrite(&wor[i],sizeof(structworker),1,fp)!
=1)
printf("filewriteerror\n");
fclose(fp);
printf_back();/*一个任务结束时的选择浏览还是返回的函数*/
}
1.4.3公共函数
(1)保存函数save(intn)
[说明]:
形参n控制保存的个数。
[程序]:
voidsave(intn)
{FILE*fp;/*定义文件指针*/
inti;
if((fp=fopen("worker.txt","wb"))==NULL)/*以只写方式为输出打开一个二进制文件,若打不开返回NULL值*/
{printf("\nCannotopenfile\n");
}
for(i=0;iif(fwrite(&wor[i],sizeof(structworker),1,fp)!
=1)/*若读写成功,则返回值1*/
printf("filewriteerror\n");
fclose(fp);/*关闭文件*/
}
(2)加载函数load()
[说明]:
该函数可以用来加载所有记录,并且可以返回所有记录的个数。
[程序]:
intload()
{FILE*fp;
inti;
if((fp=fopen("worker.txt","rb"))==NULL)/*以只读方式打开二进制文件,若打不开返回NULL值*/
{printf("\nCannotopenfile\n");
returnNULL;}
for(i=0;!
feof(fp);i++)/*在文件关闭之前,向磁盘文件中读入数据块*/
fread(&wor[i],sizeof(structworker),1,fp);
fclose(fp);
return(i-1);/*返回数据块个数值*/
}
(3)职工号输入函数no_input(inti,intn)
[说明]:
该函数对输入职工号进行判断,确保输入的职工号唯一。
形参i表示第i个职工记录,形参n表示总共有n个职工记录。
[程序]:
voidno_input(inti,intn)
{intj,k,w1;
do/*该do-while循环语句用来输入职工号信息并判断号码是否重复*/
{w1=0;
printf("number:
");
scanf("%s",wor[i].number);
for(j=0;wor[i].number[j]!
='\0';j++)/*判断输入的号码是否由0-9间的数字组成*/
if(wor[i].number[j]<'0'||wor[i].number[j]>'9')/*输入数字不是有0-9之间的数字组成*/
{puts("Inputerror!
Onlybemadeupof(0-9).Pleasereinput!
\n");
w1=1;break;}
if(w1!
=1)/*w1!
=1表示输入数字正确*/
for(k=0;kif(k!
=i&&strcmp(wor[k].number,wor[i].number)==0)/*判断输入的职工号是否已经重复*/
{puts("Thisrecordisexist.pleasereinput!
\n");
w1=1;break;}
}
while(w1==1);/*w1==1表示输入数字有误或者输入的职工号重复*/
}
(4)输入整一个记录函数input(inti)
[说明]:
形参i表示第i个职工记录。
[程序]:
voidinput(inti)
{no_input(i,i);/*调用职工号输入函数*/
printf("name:
");scanf("%s",wor[i].name);
printf("age:
");scanf("%s",wor[i].age);
printf("sex:
");scanf("%s",wor[i].sex);
printf("adress:
");scanf("%s",wor[i].adress);
printf("telephone:
");scanf("%s",wor[i].telephone);
printf("salary:
");scanf("%s",wor[i].salary);
printf("xueli:
");scanf("%s",wor[i].xueli);
}
(5)显示一个记录的函数printf_one(inti)
[说明]:
形参i表示第i个职工记录。
[程序]:
voidprintf_one(inti)
{
printf("%11s%6s%9s%3s%8s%11s%7s%6s\n",
wor[i].number,wor[i].name,wor[i].age,wor[i].sex,wor[i].adress,
wor[i].telephone,wor[i].salary,wor[i].xueli);
}
(6)一个任务结束时的选择浏览还是返回的函数printf_back()
voidprintf_back()
{intk,w;
printf("\n\n\tOK!
!
!
^-^.\n\n");
printf("Whatdoyouwanttodo?
\n\n\t1).Browseallnow\t2).Back:
[]\b\b");
scanf("%d",&w);
if(w==1)browse();/*输入1再次浏览*/
elsemenu();}/*返回主菜单*/
(7)修改整条数据记录函数modify_data(inti,intn)
[说明]:
形参i表示第i个职工记录,形参n表示有n个记录,此函数带回保存控制值w1,当w1=1时表示确认保存。
[程序]:
modify_data(inti,intn)
{intc,w1;
do/*判断输入数字是否在选择范围之内*/
{puts("\nmodifyby=>\n\n1).number2).name3).cancelandback");
printf("Whichyouneeded?
:
[]\b\b");
scanf("%d",&c);
if(c>3||c<1)/*输入数字不在选择范围之内*/
{puts("\nChoiceerror!
pleaseagain!
");getchar();}
}
while(c>3||c<1);
do/*按照选择输出对应数据块*/
{switch(c)
{case1:
no_input(i,n);break;
case2:
printf("name:
");scanf("%s",wor[i].name);break;
case3:
m