《C语言系统设计》正文.docx
《《C语言系统设计》正文.docx》由会员分享,可在线阅读,更多相关《《C语言系统设计》正文.docx(29页珍藏版)》请在冰点文库上搜索。
《C语言系统设计》正文
目录
1.实训题目…………………………………………………………1
2.系统的功能与目标………………………………………………1
3.系统设计的必要性………………………………………………3
4.系统运行的环境…………………………………………………2
5.系统设计…………………………………………………………3
5.1模块结构………………………………………………………
5.2模块说明………………………………………………………
5.3程序(代码)清单……………………………………………
6.实训总结………………………………………………………..
7.参考文献…………………………………………………………
1.实训题目
职工管理系统
2.系统的功能与目标
2.1功能:
当用户运行系统时,展现给用户的功能界面,用户可从此界面选择功能号,来实现其想要的功能。
2.2目标:
本次课程实训须运用如下知识:
数组,结构体或共用体;指针;选择结构程序设计,循环结构程序设计;自定义函数及其调用;简单的文件操作。
基于C语言设计出一个职工管理系统。
3.系统设计的必要性
C语言课程实训是将所学的专业理论知识运用于实践的过程。
通过编程来解决实际问题,培养独立解决问题的能力和理论联系实际的能力,为后续课程的学习、毕业设计、乃至走向社会打好基础。
4.系统运行的环境
MicrosoftVisualC++
5.系统设计
5.1模块结构
5.1.1入口函数
5.1.2展示系统功能菜单
5.1.3创建员工库
5.1.4每一条员工数据的缓存
5.1.5向原有员工库添加信息
5.1.6返回原有库中所有员工的记录
5.2模块说明
5.2.1入口函数
函数名:
main()
参数说明:
无
功能:
提供应用系统运行的入口
返回类型:
void
备注说明:
在此函数中调用menu(),向用户展示系统功能菜单。
5.2.2展示系统功能菜单
函数名:
menu()
参数说明:
无
功能:
向用户展示系统功能菜单
返回类型:
void
备注说明:
每个功能菜单前加阿拉伯数字,来提示用户根据数字选择菜单功能。
5.2.3创建员工库
函数名:
build()
功能:
根据用户输入的员工的人数及每个员工的信息,缓存采用struct来处理,当用户输入完毕后,把缓存的信息一次性存储到文件worker.data中。
返回类型:
void
备注说明:
在menu()函数中调用此函数
5.2.4每一条员工数据的缓存
函数名:
input(inti)
参数说明:
i,员工的记录编号(也即结构体数组的索引编号)
功能:
把用户在屏幕上输入的每个员工的信息存入对应的结构体数组中,此时结构体起到一个缓存的作用。
返回类型:
void
备注说明:
在build()函数或add()函数中调用此函数
5.2.5向原有员工库添加信息
函数名:
add()
参数说明:
无
功能:
向原有员工库添加新的员工信息
返回类型:
void
备注说明:
在menu()函数中调用此函数,在menu()中判断,当用户选择数字”2”的时候,通过此函数来完成在职员工信息的增加
5.2.6返回原有库中所有员工的记录数
函数名:
load()
参数说明:
无
功能:
把文件中的员工数据都读取出来存储到缓存中(即结构体数组中)
返回类型:
int,如果返回值得
备注说明:
在add()函数中调用此函数,以确定当前库的记录条数。
5.3程序代码
#include
#include
#include
#defineN100
//---------声明变量--------------------------------------------------
typedefstruct{
intnum;
charname[10];
intsex;
charage[7];
charwdate[7];
intedu;
intzw;
charzhengzhi[10];
charaddress[30];
}employee;//存储职工信息的一个结构
employeeem[N],s;
inttotal;
intp;
voidmenu();
voidbuild();
voidinput(inti);
input_num();
voiddisplay();
intmodify_data(int);
voidsave(intn);
voidprintf_face();
voidprintf_one(intk);
voidprintf_back();
intload();
voiddel();
voidadd();
voidchange();
voidsname();
voids_name();
voidorder();
voidbrowse();
voidquit();
voiddaochu();
//-----------------------函数声明---------------------------------------
/**********************************************************************/
/*函数名:
main()***/
/*参数说明:
无***/
/*功能:
提供应用系统运行的入口***/
/*返回类型:
void***/
/*作者:
王苗苗***/
/**********************************************************************/
voidmain()
{
menu();
}
//-----------------------------------------------------------------------
/**********************************************************************/
/*函数名:
menu()***/
/*参数说明:
无***/
/*功能:
向用户展示系统功能菜单***/
/*返回类型:
void***/
/*作者:
王苗苗***/
/**********************************************************************/
voidmenu()
{
inta=0;
charinput='y';
while(input=='y'||input=='Y')
{
printf("\n");
printf("功能菜单\n");
printf("\n");
printf("0.创建并初始化员工信息库\n");
printf("\n");
printf("1.删除员工信息\n");
printf("\n");
printf("2.添加员工信息\n");
printf("\n");
printf("3.依据姓名检索员工信息\n");
printf("\n");
printf("4.检索所有员工信息\n");
printf("\n");
printf("5.修改员工信息\n");
printf("\n");
printf("6.员工信息排序\n");
printf("\n");
printf("7.退出系统\n");
printf("\n");
printf("\t请输入一个编号:
[]\b\b");
scanf("%d",&a);
switch(a){
case0:
build();//输入职工信息
break;
case1:
del();//删除一个职工信息
break;
case2:
add();//添加一个职工信息
break;
case3:
sname();//依据姓名检索一个职工信息
break;
case4:
browse();//检索一个职工信息
break;
case5:
change();//修改职工信息
break;
case6:
order();//员工信息排序
break;
case7:
quit();//退出系统
break;
printf("谢谢您的使用\n");
return;
default:
printf("你的输入错误\n");
}
printf("是否继续管理?
(y/n)");
scanf("%s",&input);
}
if(input=='N'||input=='n')
{
printf("输入完毕,回车键返回\n");
getchar();
return;
}
}
//---------------------------------------------------------------------------
/**********************************************************************/
/*函数名:
build()***/
/*参数说明:
无***/
/*功能:
根据用户输入的员工的人数及每个员工的信息,缓存采用
struct来处理,当用户输入完毕后,把缓存的信息一次性
存储到文件worker.data中。
***/
/*返回类型:
void***/
/*作者:
王苗苗***/
/**********************************************************************/
voidbuild()
{
FILE*fp;
inti=0,total,j;
printf("请输入员工人数(0-%d):
[]\b\b",N);
scanf("%d",&total);
for(i=0;i{
input(i);
}
if((fp=fopen("employee.txt","w"))==NULL)
{
printf("打开文件出错!
\n");
exit(0);
}
else{
for(j=0;j{
fprintf(fp,"%d\t%s\t%s\t%d\t%s\t%d\t%d\t%s\t%s\n",em[j].num,em[j].name,em[j].sex,em[j].age,em[j].wdate,em[j].edu,em[j].zw,em[j].zhengzhi,em[j].address);
}
printf("****导出成功(另存为employee.txt)****\n");
if(fclose(fp))
{
printf("关闭文件出错!
\n");exit(0);
}
}
}
//-----------------------------------------------------------------------------
voidquit()
{
printf("谢谢使用本系统!
");
}
//-----------------------------------------------------------------------------
/**********************************************************************/
/*函数名:
input(inti)***/
/*参数说明:
i,员工的记录编号(也即结构体数组的索引编号)***/
/*功能:
把用户在屏幕上输入的每个员工的信息存入对应的结构体数组中,
此时结构体起到一个缓存的作用。
***/
/*返回类型:
void***/
/*作者:
王苗苗***/
/**********************************************************************/
voidinput(inti)
{charm,y,n;
printf("第%d个职工\n",i+1);
printf("\n");
printf("工号:
\n");
scanf("%d",&em[i].num);
printf("\n");
printf("姓名:
\n");
scanf("%s",em[i].name);
printf("\n");
printf("性别:
\n");
printf("1.男2.女\n");
scanf("%d",&em[i].sex);
printf("\n");
printf("年龄:
\n");
scanf("%s",em[i].name);
printf("\n");
printf("入职时间:
(如1986-10)\n");
scanf("%s",em[i].wdate);
printf("\n");
printf("学历:
\n");
printf("1.小学2.初中3.高中\n4.大学5.研究生6.博士\n");
scanf("%d",&em[i].edu);
printf("\n");
printf("职位:
\n");
printf("1.董事长2.部门经理3.秘书\n4.技术员5.领班6.员工\n");
scanf("%d",&em[i].zw);
printf("\n");
printf("政治面貌:
\n");
scanf("%s",em[i].zhengzhi);
printf("\n");
printf("地址:
\n");
scanf("%s",em[i].address);
printf("是否继续输入?
(y/n)\n");
scanf("%s",&m);
if(m==y){
daochu();
}
else
menu();
}
//-----------------------------------------------------------------------------voiddisplay()
{
FILE*fp;
inti;
if((fp=fopen("employee.txt","rb"))==NULL)return;
printf("输出结果:
\n");
printf("工号姓名性别年龄入职时间学历职位政治面貌地址\n");
printf("\n");
for(i=0;fread(&em[i],sizeof(employee),1,fp)!
=0;i++)
{
printf("%-6s",em[i].num);
printf("%-10s",em[i].name);
printf("%-10d",em[i].sex);
printf("%-10s",em[i].age);
printf("%-10s",em[i].wdate);
printf("%-10d",em[i].edu);
printf("%-10d",em[i].zw);
printf("%-10s",em[i].zhengzhi);
printf("%-30s\n",em[i].address);
}
printf("完毕,按回车键返回\n");
getchar();
fclose(fp);
return;
}
//-----------------------------------------------------------------------------
/**********************************************************************/
/*函数名:
add()***/
/*参数说明:
无***/
/*功能:
向原有员工库添加新的员工信息***/
/*返回类型:
void***/
/*作者:
王苗苗***/
/**********************************************************************/
voidadd()//添加一个职工信息
{
inti,m,n,k,p,j;
FILE*fp;
n=load();
if(n==-1)
menu();
printf("输入要增加的员工数(0-%d):
[]\b\b\b",N-n);
scanf("%d",&m);
k=m+n;
for(i=n;iprintf("输入第%d个员工记录:
\n",i++);
input(i);
if((fp=fopen("employee.txt","a+"))==NULL)
{
printf("\n\t\t员工库打开失败!
\n");
return;
}
for(p=0;p{
fprintf(fp,"%d\t%s\t%s\t%d\t%s\t%d\t%d\t%s\t%s\n",em[j].num,em[j].name,em[j].sex,em[j].age,em[j].wdate,em[j].edu,em[j].zw,em[j].zhengzhi,em[j].address);
}
fclose(fp);
}
//-----------------------------------------------------------------------------
voiddel()//删除一个职工信息
{
inti=0,tag=0;
chardelname[10];
FILE*fp;
printf("要删除的人的姓名:
\n");
scanf("%s",delname);
for(i=0;i{
if(strcmp(em[i].name,delname)==0)
{
tag=1;
total--;
for(;iem[i]=em[i+1];
}//把删除的数据以后的数据向前移一位
}
if(tag==0){
printf("没有此员工!
\n");
getchar();
return;
}
if((fp=fopen("employee.dat","wb"))==NULL)
{
printf("打开文件错误\n");
printf("按回车键返回\n");
getchar();
return;
}
i=0;
fwrite(&em[i],sizeof(employee),total,fp);
fclose(fp);
}
//-----------------------------------------------------------------------------voidsname(){
inti,n,k,p,em1=1,em2,em3,em4;
n=load();
do{
k=-1;
printf("\n\n请输入要检索的姓名!
\n\t\t姓名:
[]\b\b");
scanf("%s",s.name);
for(i=0;iif(strcmp(s.name,em[i].name)==0)
{
k=1;
printf_one(k);
break;
}
if(k==-1){
printf("\n\n此人员不存在!
");
printf("\n\n要继续操作吗?
\n\t\t\t1\t继续\n\t\t\t2\t取消检索并返回功能菜单\n\t\t[]\b\b");
scanf("%d",&em1);
if(em1==1)
{
sname();
break;
}
if(em1==2){
menu();
break;
}
}
}
while(k==-1&&em1==1);
em4=0;
em3=0;
if(k!
=-1)
printf("\n想要进行操作:
\n\t\t1\t检索其它员工信息\n\t\t2\t修改员工信息\n\t\t3\t删除员工信息\n\t\t4\t返回主菜单\n\t\t");
scanf("%d",&em2);
switch(em2){
case1:
sname();
break;
case2:
em3=modify_data(k);
break;
case3:
{
printf("\n确定删除吗?
\n\t\t1\t确定\n\t\t2\t取消检索并返回功能菜单\n\t\t[]\b\b");
scanf("%d",&em4);
em[p]=em[p+1];
break;
}
case4:
menu();
break;
}
if(em3==1||em4==1){
save(n);
printf("操作成功!
");
printf("\n想要进行的操作?
\n\t\t1\t检索其它员工数据\n\t\t2\t返回功能菜单\n\t\t");
scanf("%d",&em2);
}
while(em2==1);
menu();
}
modify_data(intk)
{
intc,em1,j;
do
{
printf("%s\t%s\t%d\t%s\t%s\t%d\t%d\t%s\t%s\n","\n要修改的属性:
\n\t\t1\t编号\n\t\t2\t姓名\n\t\t3\t性别\n\t\t4\t职务\n\t\t5\t年t6\t学历\n\t\t7\t入职时间\n\t\t8\t政治面貌\n\t\t9\t地址\n\t\t");
scanf("%d",&c);
if(c>10||c<1)
printf("选择要修改的内容");
getchar();
}
while(c>10||c<1);
do{
switch(c){
case1:
printf("\n已有编号为:
%s",em[j].num,"