C语言程序设计职工信息管理系统Word文档格式.docx
《C语言程序设计职工信息管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言程序设计职工信息管理系统Word文档格式.docx(39页珍藏版)》请在冰点文库上搜索。
charname[20];
/*设备名称*/
chartype[20];
/*设备类型*/
intprice;
/*设备价格*/
structDatebuy;
/*购入日期*/
charifbroken;
/*是否报废*/
structDatebroken;
/*报废日期*/
}information;
structDate{
intyear;
intmonth;
intday;
};
3.2主要功能函数
voidStartwork();
/*实验设备管理系统开始*/
voidEndwork();
/*实验设备管理系统结束*/
voidinitiSystem();
/*系统初始化*/
voidaddequipment();
/*录入实验设备信息*/
voidinquireequipment();
/*查询实验设备信息*/
voidrecomposeequipment();
/*修改实验设备信息*/
voidclassifyequipment();
/*实验设备分类统计*/
3.3关键函数的流程图
1、主函数:
begin(算法开始)
输出"
请选择功能(1-5):
"
输入数字=ch
ifch等于5
输出"
您将退出管理系统!
是否继续退出?
break;
else
switch(ch)
{
case'
1'
:
录入设备信息;
break;
2'
查询设备信息;
3'
修改设备信息;
case'
4'
分类设备信息;
default:
出错;
}
end(算法结束)
输出"
按任意键退出。
2、录入实验设备信息
begin
输出“请输入设备的名称、种类、价格、购买日期、报废情况”
输入名称、种类、价格、购买日期、报废情况
If已报废
输入“报废日期”
Else
不需输入
end
3、查询设备信息
输出“请选择查询的方式:
1--按设备编号查询;
2--按设备名称查询;
3--按设备种类查询;
”
switch(ch)
{
查询方式1;
查询方式2;
查询方式3;
default:
}
4、修改设备信息
请选择修改的方式:
1--按设备编号修改;
2--按设备名称修改;
其他键--退出修改功能"
修改方式1;
修改方式2;
default:
5、分类统计设备信息
输出“选择分类方式:
1--按种类分类统计;
2--按报废情况分类统计;
其他键--退出分类统计功能”
按种类分类统计1;
按报废情况分类统计2;
4系统调试
1,首次打开系统,进行系统初始化:
2,进入管理系统界面:
3,选择功能1,按提示开始录入信息:
4,选择功能2,按提示查询信息:
5,选择功能3,选择修改的方式,系统找出设备信息显示给用户,按提示修改信息:
6,选择功能4,按提示进行设备信息的分类统计:
7,选择功能5,退出系统:
5总结
问题1:
录入实验设备信息的报废情况,未报废的日期录不录入问题;
解方:
首先,设备的信息都定义在结构体中,存储时以结构体的长度存储,可以对某项信息不进行录入,所以在录入报废情况后,写一个判断语句,根据判断是否报废来决定是否录入报废日期;
问题2:
如何实现设备信息的存放、查询、修改等;
(1),可通过结构体数组来存放数据;
(2),最好的方法是通过文件指针,将数据存放在文件中,用文件指针函数可以很方便的调用这些数据;
问题3:
输入数据时,数据不被读取;
在需要输入数据前,加上一个fflush(stdin);
清空输入缓冲区,才能不影响后面的数据读取,包含于"
stdlib.h"
;
问题4:
某个功能结束后,想继续进行该功能;
while循环语句,并且是总进行循环,最后面定义一个if语句来询问用户是否要继续该功能,否的话就用break语句,从而跳出while循环;
问题5,:
按设备名称查询(修改、分类统计),如何逐个比较名称是否相符;
解房:
从文件头开始,从文件中读出数据放在&
equipment,用while判断是否读完,while语句里面用字符串比较函数比较查询的设备名称是否与存在文件的设备名称相符,相符就输出数据,不符继续读出数据放在&
equipment,再进行while,直至比较字符串相符输出数据后跳出循环或者数据读完就结束循环;
问题6:
每次运行程序后,数据保存只能在此次运行时能用,关闭程序后再打开时无数据;
程序首先就要打开一个可读可写文件,如fp=fopen("
equipment.dat"
"
rb+"
),然后再把后续的数据通过文件指针来存放在这个文件中。
必须说明的是,如果是首次运行程序,则文件新建并打开一个二进制文件,反之,文件打开已存在的文件;
问题7:
设备编号是系统自动编号的,实现系统准确累加并编号;
定义全局变量,但应该定义好每次打开运行程序时此时的默认编号,分两大类来进行数据的累加和编号,
(1),文件中未存储数据,此时文件还没有存储数据,不必对数据处理;
(2),文件中已存储数据,存储了数据的话,就读出最后一个设备的编号,即为此次的默认编号了;
6源程序清单
主函数开始
voidmain()
{
charch,con;
Startwork();
/*提供菜单界面*/
while
(1)
{
system("
cls"
);
/*执行清屏操作*/
printf("
\n#################实验设备管理系统###################\n"
####################################################\n"
###1---录入实验设备信息###\n"
###2---查询实验设备信息###\n"
###3---修改实验设备信息###\n"
###4---实验设备分类统计###\n"
###5---退出系统###\n"
\n请选择功能(1-5):
\n"
fflush(stdin);
/*清空输入缓冲区,才能不影响后面的数据读取。
包含于"
*/
ch=getchar();
您选择了功能%c:
ch);
if(ch=='
5'
)
printf("
(y或者Y--退出,其他键--不退出)\n"
fflush(stdin);
con=getchar();
/*当输入y或者Y时退出,其他键则继续了while循环*/
if(con=='
y'
||con=='
Y'
)/*con=='
||'
Y将变成任意键都退出,因为==优先级大于||。
addequipment();
inquireequipment();
recomposeequipment();
classifyequipment();
fault();
}
printf("
按任意键继续退出。
Endwork();
}
/*实验设备管理系统开始*/
voidStartwork()
longlen;
informationequipment;
fp=fopen("
/*首先打开存在的一个文件equipment.dat,rb+的方式是打开一个存在的文件,允许读写*/
if(fp==NULL)/*当不存在文件equipment.dat,进行系统初始化,即建立一个新的二进制文件*/
不能打开文件equipment.dat,自动执行系统初始化功能!
initiSystem();
按任意键继续执行!
getch();
else/*当存在文件equipment.dat,并打开equipment.dat,这里要注意的是no_total是全局变量,将作为设备的编号,每次打开系统时no_total=0,因此要找到每次打开系统时准确的no_total值,即已存储的设备编号*/
fseek(fp,0,SEEK_END);
len=ftell(fp);
if(len>
=sizeof(information))/*文件存有数据*/
fseek(fp,sizeof(information)*(-1),SEEK_END);
fread(&
equipment,sizeof(information),1,fp);
no_total=equipment.no;
elseif(len==0)/*文件未存有数据*/
no_total=0;
else/*其他错误情况*/
系统初始化文件失败!
退出程序\n"
getch();
exit
(1);
/*实验设备管理系统退出*/
voidEndwork()/*在退出系统前把打开的文件关闭*/
fclose(fp);
/*系统初始化*/
voidinitiSystem()
no_total=0;
remove("
wb+"
/*建立一个新的二进制文件,wb+的方式是建立一个新的二进制文件,允许读和写,*/
if(fp==NULL)
系统初始化失败!
exit
(1);
系统初始化完成!
/*在菜单栏输入了错误的功能号后,进行的操作*/
voidfault()
输入了错误的功能号!
\n\n按任意键返回到菜单!
fflush(stdin);
getch();
/*录入实验设备信息*/
voidaddequipment()
charch;
~~~~~~~~~~~~~~~~~~~~~~\n"
~~录入实验设备信息~~\n"
系统已经存储了%d个设备的信息。
\n由系统对设备编号进行自动逐加编号。
no_total);
no_total++;
/*对设备编号逐加*/
equipment.no=no_total;
/*自行录入设备编号*/
该次需要录入的设备的编号为:
%d号。
请输入%d号设备名称:
scanf("
%s"
&
equipment.name);
请输入%d号设备种类:
equipment.type);
请输入%d号设备价格:
%d"
equipment.price);
请输入购买日期(如:
20130101):
%d%d%d"
equipment.buy.year,&
equipment.buy.month,&
equipment.buy.day);
请输入%d号设备是否报废(Y或者y--报废,N或者n--尚未报废):
loop:
%c"
equipment.ifbroken);
if(equipment.ifbroken=='
||equipment.ifbroken=='
)/*分成报废和未报废,报废输入报废日期*/
请输入报废日期(如:
scanf("
equipment.broken.year,&
equipment.broken.month,&
equipment.broken.day);
elseif(equipment.ifbroken=='
N'
n'
)/*未报废,不需要输入日期*/
该设备尚未报废!
无需输入报废日期!
\n\n"
/*若存入文件中有误,则再添加equipment.broken.year=0;
equipment.broken.month=0;
equipment.broken.day=0;
输入有误,请重新输入:
gotoloop;
fseek(fp,0,SEEK_END);
/*将文件读写位置指针读到文件尾,数据就可以一直往下保存*/
fwrite(&
\n*****************************************************************************\n"
**编号\t名称\t种类\t价格\t购入日期是否报废报废日期**\n"
*****************************************************************************\n"
**%d\t\t%s\t%s\t%d\t%4d%2d%2d\t%c\t%4d%2d%2d**\n"
equipment.no,equipment.name,equipment.type,equipment.price,equipment.buy.year,equipment.buy.month,equipment.buy.day,equipment.ifbroken,equipment.broken.year,equipment.broken.month,equipment.broken.day);
else
printf("
**%d\t\t%s\t%s\t%d\t%4d%2d%2d\t%c\t\t**\n"
equipment.no,equipment.name,equipment.type,equipment.price,equipment.buy.year,equipment.buy.month,equipment.buy.day,equipment.ifbroken);
}
录入%d号设备%s的信息(如上)完成。
\n继续录入下一个设备请按'
或'
,退出录入并返回菜单请按'
任意其他键'
no_total,equipment.name);
if(ch!
='
&
ch!
break;
/*查询实验设备信息*/
voidinquireequipment()
~~查询实验设备信息~~\n"
if(no_total==0)/*文件中还没有存数据时,选择查询功能将弹出得退出的提示*/
\n请输入任意键退出查询功能并返回菜单!
/*结束while循环*/
请选择查询的方式:
其他键--退出查询功能\n"
wayone();
waytwo();
waythree();
printf("
您输入了其他键,系统将退出查询功能!
\n请再次确认是否退出查询功能!
继续查询功能请输入'
或者'
,退出查询功能并返回菜单请输入'
其他任意键'
con=getchar();
if(con!
con!
/*1--按设备编号查询*/
voidwayone()
informations;
请输入设备编号:
scanf("
no);
if(no>
no_total||no<
1)
系统中没有编号为%d的设备,最大编号为%d,请重新输入设备编号:
no,no_total);
gotoloop;
else
fseek(fp,sizeof(information)*(no-1),SEEK_SET);
/*从文件首移动到第n-1个长度为sizeof(information)的位置,即该设备信息存放在文件中的首位置*/
fread(&
s,sizeof(information),1,fp);
if(s.ifbroken=='
||s.ifbroken=='
s.no,s.name,s.type,s.price,s.buy.year,s.buy.month,s.buy.day,s.ifbroken,s.broken.year,s.broken.month,s.broken.day);
**%d\