资源描述
C语言课程实习与报告——《仪器仪表管理》
制作人:庞明 制作时间:7月13日
一. 题目规定
仪器仪表管理
【规定】
系统功能基本规定:
(1) 新仪器仪表信息录入;
(2) 在借出、归还、维修时对仪器仪表信息修改;
(3)对报废仪器仪表信息删除;
(4)按照一定条件查询符合条件仪器仪表信息;查询功能至少应当涉及仪器仪表基本信息(如仪器仪表名字、仪器仪表编等)查询、准时间点(借入时间、借出时间、归还时间)查询等,记录功能至少涉及准时间段记录,按仪器仪表基本信息记录等。
(5)对查询,记录成果打印输出。
【提示】
数据构造采用构造体。仪器仪表信息涉及仪器仪表名、仪器仪表编号、购买时间、借入时间、借出时间、归还时间、维修时间、状态信息(0代表可借出,1代表已借出,2代表正在维修)等。
二.分析需求
依照题目规定,需要把仪器仪表信息数据存储在文献里,因此需要提供文献输入输出等操作;在程序中要提供修改,删除,查找等操作;此外还应当提供键盘式选取菜单实现功能选取。系统功能图如下:
仪器仪表管理系统
添加
显示
修改
记录
退出
查询
删除
系统功能模块图
三.详细设计
需调用函数名:
void save(int n,int m);
int load_equ();
void menu();
void add_new_message();
void input(int i);
void load_record();
void printf_one(int i);
void printf_n(int n);
void modify();
void delete();
void search();
void sb_buy_tq();
void sb_gb_tq();
void sb_par_number();
void sb_name();
void statistic();
void tb_par_number();
void tb_name();
void tb_buy_tq();
void tb_gb_tq();
1. 主函数
主函数普通设计得比较简洁,只提供输入输出和功能解决函数调用。其各功能模块用菜单方式选取。本题将main()函数体内界面选取某些语句单独抽取出来作为一独立函数,目在于系统执行完每某些功能模块后可以以便返回到系统界面。
菜单某些设计如下:
【流程图】
显示一系列功能选项
输入n,判断n与否是1-7
NO
YES
依照n值调用各功能模块函数
主函数菜单流程图
【程序】相应如下:
main()
{
system("cls");/**********清屏************/
menu();
}
void menu()
{
int w,n;
do
{
system("cls");
printf("\t\t WELCOME TO THE EQUIPMENT MANAGEMENT SYSTEM\n\n\n");
printf("\n\n\t\t====================******====================\n\n\n");
printf("\t\t\t1:Add message of new equipmen\n\n");
printf("\t\t\t2:Load the message of all equipment\n\n");
printf("\t\t\t3:Correct the message of equipment\n\n");
printf("\t\t\t4:Delete the message of broken equipment\n\n");
printf("\t\t\t5:Search the message of equipment\n\n");
printf("\t\t\t6:Search of all the equipment\n\n");
printf("\t\t\t7:Exit\n");
printf("\n\n\t\t====================******====================\n\n\n");
printf("Please choice your number:[ ]\b\b");
scanf("%d",&n);
if(n<1||n>7) w=1;
else w=0;
}
while (w==1);
/****************选取功能****************/
switch(n)
{
case 1:add_new_message();break;/*添加模块*/
case 2:load_record();break;/*显示模块*/
case 3:modify();break;/*修改模块*/
case 4:search();break;/*查询模块*/
case 5:statistic();break;/*记录模块*/
case 6:delete();break;/*删除模块*/
case 7:exit(0);break;/*退出模块*/
}
}
2. 各功能模块设计
(1)添加信息模块
【分析】
单独看各数据信息,仪器仪表名是字符型,可采用字符型数组;仪器仪表编号、购买时间、借入时间、借出时间、归还时间、维修时间应采用实型;状态信息是整数,采用整型。事实上操作时发现只有字符型数据可以在文献中成功被保存,因此本题所有数据一律采用字符型。
struct equip
{
char number[4];
char name[11];
char b_time[11];
char bin_time[11];
char bout_time[11];
char giveb_time[11];
char repair_time[11];
int state;
}equ[M];
/* equ[M]中每个数组元素相应一种仪表仪器*/
【注意】
equ[M]中M是仪表仪器个数,程序中采用宏定义方式,可以随时在源程序宏定义中改,本程序宏定义#define M 50。
顾客要添加仪器个数m
【流程图】
i从0到m-1调用输入函数void input(int i)
i!=0
Y
显示添加仪器信息
输入模块流程图
【程序】
/*************************添加模块***********************/
void add_new_message()
{int t,i,m;
system("cls");
t=load_equ();
printf("How many groups datas do you want to add?\n");
printf("input the number:[ ]\b\b\b");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("\nInput %dth equipment record.\n",i+1);
input(t+i);/*调用输入函数*/
}
save(t+m,0);/*调用保存函数 保存t+m组数据*/
system("cls");/**********清屏************/
menu();/*返回登陆界面*/
}
/****************输入函数****************/
void input(int i)
{
printf("Please input:\nnumber name b_time b_in_time b_out_time g_back_time repair_time state\n");
scanf("%s%s%s%s%s%s%s%d",&equ[i].number,&equ[i].name,&equ[i].b_time,&equ[i].bin_time,&equ[i].bout_time,&equ[i].giveb_time,&equ[i].repair_time,&equ[i].state);
}
(2)显示记录模块
分析:通过调用函数显示所有仪器一切信息,最后将main()函数体内界面选取某些语句单独抽取出来作为一独立函数,目在于系统执行完每某些功能模块后可以以便返回到系统界面。
显示记录仪器个数t
流程图:
i从0到t - 1调用显示函数void printf_n(int n)
i!=0
Y
显示仪器记录
void load_record()
{
int t;
t=load_equ();
printf_n(t);
printf("\n\n\nPress any key to go back...\n\n");
getchar();
menu(); /*返回登陆界面*/
}
/*显示一种仪器记录函数*/
void printf_one(int i)
{
printf("%-3s %-10s %-10s %-10s %-10s %-10s %-10s %d.\n\n",equ[i].number,equ[i].name,equ[i].b_time,equ[i].bin_time,equ[i].bout_time,equ[i].giveb_time,equ[i].repair_time,equ[i].state);
}
/**显示n个仪器记录函数*/
void printf_n(int n)
{
int j;
system("cls");/*清屏*/
printf("number name b_time b_in_time b_out_time g_back_time repair_time s\n");
for(j=0;j<n;j++)
{
printf_one(j);/*调用显示一种仪器记录函数*/
}
}
(3)修改模块
[需求分析]
顾客输入要修改仪器仪表编号或名称,依照编号或名称查找仪器仪表记录,并提示顾客修改该记录哪某些信息,是仪器仪表借出时间、归还时间、修理时间还是状态,依照顾客选取修改相应信息。
输入要修改仪器仪表编号或名称
[流程图]
与否找到此记录
Y N
显示找到记录,调用修改函数
提示没有找到
保存修改后记录
Y
N
返回主菜单
修改模块流程图
[程序]
void modify()
{
struct equip mod;
int t,i,m,w,addr=-1;
char number[4]={' '},name[11]={' '};
system("cls");/*清屏*/
t=load_equ();
do
{
printf("\nInput the equipment'number or name ( 1:the number 2:the name ):\n\n");
printf("What is your choice:[ ]\b\b");
scanf("%d",&m);
if(m==1||m==2) w=0;
else w=1;
}while(w==1);
switch(m)
{
case 1:
printf("\n\nPlease input the equipment's number:[___]\b\b\b\b");
scanf("%s",number);break;
case 2:
printf("Please input the equipment's name:[__________]\b\b\b\b\b\b\b\b\b\b\b");
scanf("%s",name);break;
}
for(i=0;i<t;i++)/*查找要修改仪器*/
{
if(strcmp(equ[i].name,name)==0||strcmp(equ[i].number,number)==0)
{
addr=i;
printf("\n\nPlease input the new information:\n\n");
printf("number name b_time b_in_time b_out_time g_back_time repair_time s\n");
scanf("%s%s%s%s%s%s%s%d",mod.number,mod.name,mod.b_time,
mod.bin_time,mod.bout_time,mod.giveb_time,mod.repair_time,&mod.state);
strcpy(equ[i].number,mod.number); strcpy(equ[i].name,mod.name); strcpy(equ[i].b_time,mod.b_time);
strcpy(equ[i].bin_time,mod.bin_time); strcpy(equ[i].bout_time,mod.bout_time);
strcpy(equ[i].giveb_time,mod.giveb_time);
strcpy(equ[i].repair_time,mod.repair_time);equ[i].state=mod.state;
printf("%-3s %-10s %-10s %-10s %-10s %-10s %-10s %d.\n\n",equ[i].number,equ[i].name,equ[i].b_time,
equ[i].bin_time,equ[i].bout_time,equ[i].giveb_time,equ[i].repair_time,equ[i].state);
break;
}
}
if(addr==-1)
{
printf(" Cannot find the equipment which you want to modify!\n\n");
printf(" Press any key to go back...\n\n");
getchar();
menu();
}
save(t,0);/*修改后信息保存*/
printf(" Press any key to go back...\n\n");
getchar();
menu();
}
(4)查询模块
显示一系列功能选项
[流程图]
输入n,判断n与否是1-4
N
Y
依照n值调用各子功能模块函数
查找模块流程图
[程序]
/*查找模块*/
void search()
{
int w,n;
do
{
system("cls");
printf("\n\t\t*********************************************\n\n");
printf("\t\tby b_time quantum to search?Input[1]\n");
printf("\t\tby give_back_time quantum to search?Input[2]\n");
printf("\t\tby number to search?Input[3]\n");
printf("\t\tby name to search?Input[4]\n");
printf("\t\t*********************************************\n\n");
printf(" Choice your number(1-4):[ ]\b\b\b");
scanf("%d",&n);
if(n<1||n>4) w=1;
else w=0;
}
while (w==1);
/*选取功能*/
switch(n)
{
case 1:sb_buy_tq();break;/*按购买时间段查询函数*/
case 2:sb_gb_tq();break;/*按归还时间段查询*/
case 3:sb_par_number();break;/*按指定编号查询*/
case 4:sb_name();break;/*按仪器名称查询*/
}
(1.1) 按购买或归还时间段查找
[流程图]
调用加载函数n=load();并计算可以查找记录个数n
顾客选取
1 2
输入仪器仪表购买时间
3
输入仪器仪表归还时间
与否找到该仪器仪表记录
Y N
显示找到记录
提示没有找到
询问顾客与否继续查找
Y N
让顾客选取1).查找另一种2).修改3).删除4).返回主菜单
返回主菜单
时间点查找模块流程图
void sb_buy_tq()/*按购买时间段查询函数*/
{
char year1[11],year2[11];
int t,i,sum=0;
t=load_equ();
system("cls");
printf("Please input the start time:[____.__.__]\b\b\b\b\b\b\b\b\b\b");
scanf("%s",year1);
printf("\n");
printf("Please input the finish time:[____.__.__]\b\b\b\b\b\b\b\b\b\b");
scanf("%s",year2);
printf("\n");
for(i=0;i<t;i++)
{
if((strcmp(equ[i].b_time,year1)>=0)&&(strcmp(equ[i].b_time,year2)<=0))
{
printf_one(i);/*把符合条件记录显示出来*/
sum++;
save(1,1);/*把符合条件记录保存在查询记事本里*/
}
}
if(sum==0)
{
printf("Sorry!Cannot find the equipment which you want to.\n\n");
}
printf("Press any key to go back the former step...\n");
getchar();
menu();
}
(1.2)按指定编号和仪器名查询
[分析]
基本信息查找涉及了仪器仪表名称以及编号查找,因此该子功能模块功能是按仪器仪表名称和按仪器仪表编号查找。
void sb_name()/*按仪器名称查询*/
{
char name[11];
int t,i,sum=0;
t=load_equ();
system("cls");
printf("Please input the equipment name:[__________]\b\b\b\b\b\b\b\b\b\b\b");
scanf("%s",name);
printf("\n");
for(i=0;i<t;i++)
{
if(strcmp(equ[i].name,name)==0)
{
printf_one(i);/*把符合条件记录显示出来*/
sum++;
save(1,1);/*把符合条件记录保存在查询记事本里*/
}
}
if(sum==0)
{
printf("Sorry!Cannot find the equipment which you want to.\n\n");
}
printf("Press any key to go back the former step...\n");
getchar();
menu();
}
(5)记录模块
分析:可以按购买时间段记录,按归还时间段记录,按指定编号记录,按仪器名称记录。
流程图与查询模块类似.
程序:
void statistic()
{
int w,n;
do
{
system("cls");
printf("\n\t\t*********************************************\n\n");
printf("\t\tby b_time quantum to statistic?Input[1]\n");
printf("\t\tby give_back_time quantum to statistic?Input[2]\n");
printf("\t\tby number to statistic?Input[3]\n");
printf("\t\tby name to statistic?Input[4]\n");
printf("\t\t*********************************************\n\n");
printf(" Choice your number(1-4):[ ]\b\b\b");
scanf("%d",&n);
if(n<1||n>4) w=1;
else w=0;
}
while (w==1);
/****************选取功能****************/
switch(n)
{
case 1:tb_buy_tq();break;
case 2:tb_gb_tq();break;
case 3:tb_par_number();break;
case 4:tb_name();break;
}
}
void tb_par_number()
{
char number[4];
int t,i,sum=0;
t=load_equ();
system("cls");
printf("Please input the equipment number(000~999):[___]\b\b\b\b");
scanf("%s",number);
printf("\n");
for(i=0;i<t;i++)
{
if(strcmp(equ[i].number,number)==0)
{
sum++;
save(1,2);
}
}
if(sum==0)
{
printf(" Sorry! Cannot find the equipment which you want to!\n\n");
}
else
{
printf(" There are[%-2d]equipment(s) which you want to statistic in the record!\n\n",sum);
}
printf("Press any key to go back the former step...\n");
getchar();
menu();
}
(6)删除模块
[需求分析]
该模块功能与修改模块同样先显示所有仪器仪表信息,同样考虑到记录较多,建议采用分屏显示。显示完所有记录后,顾客输入要修改仪器仪表编号,依照编号查找仪器仪表记录,并提示顾客与否拟定要删除。
显示所有记录,让顾客看哪个要删除
[流程图]
输入要删除仪器仪表编号
与否找到此记录
Y N
显示找到记录
提示没有找到
询问顾客与否继续删除
Y
N
返回主菜单
删除模块流程图
[程序]
void delete()
{
FILE *fp1;
struct equip mod;
int t,i,m,w,addr=-1,u;
char number[4]={' '},name[11]={' '};
char a1[2],a2[2];
system("cls");/*清屏*/
t=load_equ();
if((fp1=fopen("record.txt","w"))==NULL)/*以只写方式打开*/
{
printf("\nCannot open file\n");
exit(0);
}
system("cls");
do
{
system("cls");
printf("\nPlease Input the equipment'number or name to find it( 1:the number 2:the name ):\n\n");
printf("What is your choice:[ ]\b\b");
scanf("%d",&m);
if(m==1||m==2) w=0;
else w=1;
}while(w==1);
switch(m)
{
case 1:
printf("\n\nPlease input the equipment's number:(___)\b\b\b\b");
scanf("%s",number);break;
case 2:
printf("Please input the equipment's name:(__________)\b\b\b\b\b\b\b\b\b\b\b");
scanf("%s",name);break;
}
for(i=0;i<t;i++)/*查找要删除仪器*/
{
if(strcmp(equ[i].name,name)==0||strcmp(equ[i].number,number)==0)
{
addr=i;
printf("%-3s %-10s %-10s %-10s %-10s %-10s %-10s %d.\n\n",equ[i].number,equ[i].name,equ[i].b_time,
equ[i].bin_time,equ[i].bout_time,equ[i].giveb_time,equ[i].repair_time,equ[i].state);
printf("Congratunations !You have been successful to delete it's information. ^_^\n");
continue;
}
fwrite(&equ[i],sizeof(struct equip),1,fp1);/*把不想删除保存在记事本里,想删除不保存即为删除*/
}
fclose(fp1);/*关闭文献*/
if(addr==-1)
{
printf(" Cannot find the equipment which you want to delete!\n\n");
}
printf(" \n\n\nPress any key to go back...\n\n");
getchar();
menu();
}
四.上机操作
1. 数据源:
为了保存数据,需要建立一种data.txt文献
2. 编译、连接和运营
3. 成果
下面是各个模块界面图:
主界面:
添加模块:
修改模块:
五. 总结
通过该题实习,能进一步理解和运用构造化程思想和办法,初步掌握设计一种小型实用系统基本办法,学会了如何调试一种较长程序基本办法,学会运用流程图表达算法,进一步掌握了如何运用C语言进行程序设计。
展开阅读全文