资源描述
C语言课程设计仪器仪表管理系统报告优质资料
(可以直接使用,可编辑 优质资料,欢迎下载)
报告
语言课程设计
C
学院: 自动化学院
专业: 自动化
班级: 231XXX
姓名: XXX
学号: 231XXX-XX
目录
1. 题目概述,总体设计--------------------------------第 1页
2. 详细设计,菜单函数--------------------------------第 2页
3. 功能模块:录入模块--------------------------------第 3页
4. 状态改变模块--------------------------------------第 4页
5. 状态改变,借出归还--------------------------------第 6页
6. 状态改变,维修------------------------------------第 7页
7. 状态改变,删除------------------------------------第 8页
8. 状态查询模块--------------------------------------第 9页
9. 按名称查询----------------------------------------第11页
10.按时间点/段查询----------------------------------第12页
11.公共函数-----------------------------------------第13页
12.上机实践-----------------------------------------第14页
13.程序的亮点与不足---------------------------------第17页
14.总结---------------------------------------------第18页
题目:仪器仪表管理系统[要求]系统功能的基本要求:(1) 新的仪器仪表信息录入。(2) 在借出、归还、维修时对仪器仪表信息的修改。(3) 对报废仪器仪表信息的删除。(4) 按照一定的条件查询、统计符合条件的仪器仪表信息; 查询功能至少应包括仪器仪表基本信息的查询、按时间段(如在2004 年1月1日到2004 年10 月10 日购买、借出、维修的仪器仪表等) 查询、按时间点(借入时间、借出时间、归还时间) 查询等,统计功能至少包括按时间段统计、按仪器仪表的基本信息统计等。(5) 对查询、统计的结果打印输出。
[提示]
数据结构采用结构体。仪器仪表信息包括仪器仪表名、仪器仪表编号、购买时间、借入时间、借出时间、归还时间、维修时间、状态信息(0 代表可借出,1代表可借入,2 代表正在维修) 等。
需求分析:
根据题目要求,由于仪器仪表信息是存放在文件,所以应提供文件的输入、输出等操作; 在程序中要浏览仪器仪表的信息。应提供录入、显示、查找,修改等操作; 另外还应提供键盘式选择菜单实现功能选择。
总体设计:
根据上面的需求分析,可以将这个系统的设计分为三个大的模块: 仪表
仪器录入、仪表仪器修改(删除)、仪表仪器查询
仪器仪表管理系统
查询
录入
修改
详细设计
(一) 主函数
主函数一般设计得比较简洁,只提供输入、处理和输出部分的函数调用。其中各功能模块用菜单方式选择。其中流程图如下:
[程序]其中为主函数设定了一个菜单函数,方便用于选择其他模块函数。用getch0;获得所按下的键值,用函数内的局部静态变量储存键值对应的其他功能函数。
void menu(char c) /*菜单函数*/
{static int n=0; //内部变量
if(c=='s'||c=='S') n++;
if(c=='w'||c=='W') n--;
if(n==5) n=1;
if(n==0) n=4;
if(c==13)
{switch(n)
{case 1:if(insert ()==0) insert (); break; //录入
case 2:change();break; //修改
case 3:serch(); break; //查询
开始
case 4:exit(0); //退出程序 };
}
system("cls");
显示一系列功能选项
printf("\n\n");
printf(" 仪器仪表管理系统 \n");
printf("\n");
选择一个功能
printf(" 姓名:xxx ");
printf("班级231xxx");
printf("\n\n");
根据选择的功能调用功能模块函数
if(n=1)
printf(" -->仪器仪表录入<-- \n");
else
结束
printf(" 仪器仪表录入 \n");
printf("\n");
if(n=2)
printf(" -->仪器仪表借还/删除<-- \n");
else
printf(" 仪器仪表借还/删除 \n");
printf("\n");
if(n=3)
printf(" -->仪器仪表查询 <-- \n");
else
printf(" 仪器仪表查询 \n");
printf("\n");
if(n=4)
printf(" -->退出程序<-- \n");
else
printf(" 退出程序 \n");
printf("\n");
//主函数
void main()
{system("cls");
printf("\n\n\n\n");
printf(" -->仪器仪表管理系统<-- \n");
printf("\n");
printf(" -->按W向上选择<-- \n");
printf(" -->按S向下选择<-- \n");
printf(" -->按回车确定选择<-- \n");
printf("\n");
printf("\n");
printf(" -->按任意键进入系统<-- \n");
printf(" <-----------------> \n");
getch();
menu('s');
while(1) menu(getch());}
(二)各功能模块设计[数据结构]数据结构选用结构体数组。这里只简单的给仪器仪表两个部分,一个为仪器仪表的名称、字符串函数,一个为仪器仪表的各个时间点的状态(定义一个time的三维数组,数组下标表示年月日,数组的值表示仪器的状态)。
#define buy 1 //购买
#define lean 2 //借出
#define repair 3 //维修
#define inlib 4 //空闲
#define year_max 3000
#define month_max 12
#define day_max 31
#define N 100 //预设仪器最大数
int n;//仪器数
struct equment
{char name[100];int time [year_max+1][month_max+1][day_max+1];}equ[N];
(1) 录入模块
开始
通过strcpy函数实现仪器名称的录入,state函数实现仪器状态的更改。
输入仪器仪表名称
【程序】void insert()
{int i,j_year,j_month,j_day,year,month,day;
char equ_input[100];
是否已录入入
system("cls");
是
printf("\n\n\n\n");
否
printf(" -->仪器仪表管理系统<-- \n");
printf("\n\n\n\n");
返回主菜单
输入买入时间
printf(" 请输入仪器的名称:");
scanf("%s",&equ_input);
结束
if(presence(equ_input)!=0)
{
printf("\n");
printf("\n");
printf(" 对不起!此仪器已购买\n ");
printf("\n");
printf(" 录入失败,请按任意键返回主菜单\n" );
printf("\n");
printf(" <-----------------> \n");
getch();
}
else
{int state (int year,int month,int day,int n,int s);
n++;
strcpy(equ[n].name,equ_input); //将equ_input复制给equ[equ_num].name
printf("\n");
printf(" 请输入购买时间(年/月/日)(例如1998/2/15):");
scanf("%d/%d/%d",&year,&month,&day);
state(year,month,day,n,inlib); // equ[n] 将当天状态改为空闲
equ[n].time[year][month][day]=buy; //equ[n] 将该天以后状态改为购入
//printf("%d",equ[n].time[year][month][day]);
printf("\n");
printf("\n");
printf(" 录入成功,请按任意键返回主菜单\n");
printf("\n");
printf("\n");
printf(" <-----------------------------> \n");
getch();}}
(二) 状态改变模块
该模块包括对仪器仪表的借出、归还、维修、报废等小模块的操作,仍然用getch();函数获取键值来做上下选择。本函数只考虑对一种仪器仪表的修改,故先要输入该仪器仪表的名称并查找是否已经购买。
开始
【程序】
int change()
输入仪器仪表名称
{char equ_input[100],c='s';
int j,x=0;
system("cls");
是否已购买
printf("\n\n\n\n");
否
printf(" <----仪器仪表管理系统--->\n");
是
printf("\n\n");
选择需要进行的操作
printf(" 请输入仪器名称: ");
返回主菜单
scanf("%s",&equ_input);
结束
j=presence(equ_input);
//printf("\n%d",j); system("pause");
if(j!=0)
{while(1)
{if(c=='s'||c=='S') x++;
if(c=='w'||c=='W') x--;
if(x==6) x=1;
if(x==0) x=5;
if(c==13)
{switch(x)
{case 1:mylean(j);break;
case 2:myback(j);break;
case 3:myrepair(j);break;
case 4:mydel(j);break;
case 5:return(1);
}
}
system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表管理系统--->\n");
printf("\n\n");
/*printf(" 请输入仪器名称: ");scanf("%s",equ_input); printf("\n\n");*/
if(x==1)
printf(" --->仪器仪表借出<------\n");
else
printf(" 仪器仪表借出 \n");
printf("\n\n");
if(x==2)
printf(" --->仪器仪表归还<------\n");
else
printf(" 仪器仪表归还 \n");
printf("\n\n");
if(x==3)
printf(" --->仪器仪表维修<------\n");
else
printf(" 仪器仪表维修 \n");
printf("\n\n");
if(x==4)
printf(" --->仪器仪表报废<------\n");
else
printf(" 仪器仪表报废 \n");
printf("\n\n");
if(x==5)
printf(" --->返回主菜单<------\n");
else
printf(" 返回主菜单 \n");
printf(" <----------------------------------->\n");
c=getch();
}
}
else
{
/*system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表管理系统--->\n");
printf("\n\n");*/
printf("\n\n");
printf(" 对不起!找不到该仪器\n");
printf(" 可能是由于您输入仪器的名称错误,\n");
printf(" 也可能是由于无此仪器,还没购买。\n");
开始
printf("\n\n");
printf(" 修改失败,请按任意键返回主菜单 \n");
输入仪器仪表名称
printf(" <----------------------------------->\n");
getch();
//return; } }
是否空闲
(1) 借出模块
首先输入借出的时间,然后在仪器仪表的结构体数组中查
是
否
找该仪器仪表在这个输入的时间点上有无其他状态。若无
其他状态则可以借出,否则不可借出。
返回主菜单
标记状态为借出
【程序】
int mylean(int j)
{int year,month,day;
结束
system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表借出系统--->\n");
printf("\n\n");
printf(" 请输入借出时间(年/月/日): ");
scanf("%d/%d/%d",&year,&month,&day);
//system("pause");
//printf("%d",equ[j].time[year][month][day]);
if (equ[j].time[year][month][day]==inlib) //判断仪器是否空闲
{printf("\n\n");
printf(" 借出成功,请按任意键返回上一级菜单 \n");
printf("\n");
printf(" <----------------------------------->\n");
state(year,month,day,j,lean); //状态改为借出
getch(); return(1);
}
else
{printf("\n\n");
printf(" 对不起!\n");
printf(" 此仪器还没有购买或没有归还或正在维修中,\n");
printf(" 故无法借出。\n");
printf(" 借出失败,请按任意键返回上一级菜单 \n");
printf("\n\n");
printf(" <----------------------------------->\n");
getch(); return(0); } }
(2) 归还模块
首先输入借出的时间,然后在仪器仪表的结构体数组中查找该仪器仪表在这个输入的时间点上有无其他状态。若无其他状态则可以借出,否则不可借出。
【程序】
int myback(int j)
{int year,month,day;
system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表归还系统--->\n");
printf("\n\n");
printf(" 请输入归还时间(年/月/日): ");
scanf("%d/%d/%d",&year,&month,&day);
if (equ[j].time[year][month][day]==lean) //判断状态是否为借出
开始
输入仪器仪表名称
是
是否借出
标记状态为空闲
返回主菜单
否
结束
{printf("\n\nn");
printf(" 归还成功,请按任意键返回上一级菜单 \n");
printf("\n\n");
printf(" <----------------------------------->\n");
state(year,month,day,j,inlib); //改状态为空闲
getch(); return(1);
}
else
{printf("\n\n");
printf(" 对不起!\n");
printf(" 此仪器还没有购买或还没有借出\n");
printf(" 或正在维修中,故无法归还。\n");
printf(" 归还失败,请按任意键返回上一级菜单 \n");
printf("\n");
printf(" <----------------------------------->\n");
getch(); return(0); } }
(3)维修模块
同样是首先输入维修开始的时间和维修结束的时间,然后在仪器仪表的结构体数组中查找该仪器仪表在这个归还的时间点上有其他状态。若有为空闲状态则可以维修,否则不可维修。
开始
输入维修开始结束时间
是
是否空闲
标记状态为维修
返回主菜单
否
结束
【程序】
int myrepair(int j)
{int year,month,day;
system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表管理系统--->\n");
printf("\n\n");
printf(" 请输入开始维修时间(年/月/日):");
scanf("%d/%d/%d",&year,&month,&day);
if (equ[j].time[year][month][day]==inlib)
{state(year,month,day,j,repair); //改状态为维修
printf("\n\n");
printf(" 请输入维修结束时间(年/月/日):");
scanf("%d/%d/%d",&year,&month,&day);
state(year,month,day,j,inlib);
printf("\n\n");
printf(" 维修成功,请按任意键返回上一级菜单 \n");
printf("\n");
printf(" <----------------------------------->\n");
getch(); return(1);
}
else
{printf("\n\n");
printf(" 对不起!\n");
printf(" 此仪器还没有购买或借出,\n");
printf(" 故无法维修。\n");
printf("\n\n");
printf(" 维修失败,请按任意键返回上一级菜单 \n");
printf("\n\n");
printf(" <----------------------------------->\n");
getch(); return(0); } }
(4)删除模块
删除模块将删除本仪器仪表,具体删除过程为将需要删除的后一项覆盖至删除的这一项,即需删除以后的每一个结构体元素都向前移一个单位。
开始
是
是否删除
循环将需删除的后面所有元素整体向前移动一个单位
返回主菜单
否
结束
【程序】
int mydel(int j)
{char c='s';
int x=0;
while(1)
{system("cls");
if(c=='s'||c=='S') x++;
if(c=='w'||c=='W') x--;
if(x==3) x=1;
if(x==0) x=2;
if(c==13)
{if(x==1)
{int i;
for(i=n;i<n;i++)
equ[i]=equ[i-1]; n--;
system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表管理系统--->\n");
printf("\n\n");
printf(" 报废仪表已删除!\n ");
printf("\n\n");
printf(" 请按任意键返回上一级菜单 \n");
printf("\n");
printf(" <----------------------------------->\n");
getch(); return;
}
else
return;
}
printf(" <----仪器仪表管理系统--->\n");
printf("\n\n");
printf(" 请问确定要报废仪器%s吗?\n ",equ[j].name);
printf("\n\n\n\n");
if (x==1)
printf(" --->确定要报废仪器<--- \n");
else
printf(" 确定要报废仪器 \n");
printf("\n\n");
if(x==2)
printf(" --->我要考虑考虑<--- \n");
else
printf(" 我要考虑考虑 \n");
printf("\n\n");
printf(" <----------------------------------->\n");
c=getch(); } }
(三)仪器仪表查找模块
仪器仪表查找分为按名称查找、按时间点查找、按时间段查找三个模块,通过键盘w s进行选择,分别用三个小模块来表示,通过状态函数condition_p输出仪器仪表状态。
【程序】
void search()
{char c='s';
int x=0;
while(1)
{if(c=='s'||c=='S') x++;
if(c=='w'||c=='W') x--;
if(x==6) x=1;
if(x==0) x=5;
if(c==13)
{switch(x)
{case 1:name();break;
case 2:time_d();break;
case 3:time_p();break;
case 4:return; };
};
system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表管理系统--->\n");
printf("\n\n");
if(x==1)
printf(" --->按名称查询<------\n");
else
printf(" 按名称查询 \n");
printf("\n\n");
if(x==2)
printf(" --->按时间段查询<------\n");
else
printf(" 按时间段查询 \n");
printf("\n\n");
if(x==3)
printf(" --->按时间点查询<------\n");
else
printf(" 按时间点查询 \n");
printf("\n\n");
if(x==4)
printf(" --->返回主菜单<------\n");
else
printf(" 返回主菜单 \n");
printf("\n\n");
printf(" <----------------------------------->\n");
c=getch(); } }
因为不管查找条件是什么,最终都会对应到需查找的仪器仪表上,故补充一个公共函数condition_p();,输出查找一个仪器仪表的结果。
【程序】
void condition_p(int year,int month,int day,int n,int *bool_repair,int *bool_lean)
{//printf("%d",equ[n].time[year][month][day]); //system("pause");
if (equ[n].time[year][month][day]==buy)
printf(" %4d年%2d月%2d日购买%s仪器仪表\n",year,month,day,equ[n].name);
//借出/归还
if ((equ[n].time[year][month][day]==lean)&&((*bool_lean)==0))
{printf(" %4d年%2d月%2d日借出%s仪器仪表\n",year,month,day,equ[n].name);
(*bool_lean)=1; }
//printf("%d\n",equ[n].time[year][month][day]==lean); //printf("%d\n");
if (equ[n].time[year][month][day]==inlib&&(*bool_lean)==1)
{printf(" %4d年%2d月%2d日归还%s仪器仪表\n",year,month,day,equ[n].name);
(*bool_lean)=0; //printf("%d",equ[n].time[year][month][day]); }
//维修/修完
if (equ[n].time[year][month][day]==repair&&(*bool_repair)==0)
{printf(" %4d年%2d月%2d日开始维修%s仪器仪表\n",year,month,day,equ[n].name);
(*bool_repair)=1; }
if (equ[n].time[year][month][day]==inlib&&(*bool_repair)==1)
{printf(" %4d年%2d月%2d日结束维修%s仪器仪表\n",year,month,day,equ[n].name);
(*bool_repair)=0; } }
(1)按名称查找
首先输入仪器仪表的名称,然后在结构体数组中查找是否存在,这个仪器仪若是则循环该仪器仪表的所有时间点来判断改时间点处于什么状态,并用公共函数condition_p来输出。
【程序】
int name()
开始
输入仪器仪表名称
是
是否存在
循环并输出
返回主菜单
否
结束
{char equ_input[100];
int i;
system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表管理系统--->\n");
printf("\n\n");
printf(" 请输入仪器名字: ");
scanf("%s",equ_input);
i=presence(equ_input);
if (i!=0)
{int j_y,j_d,j_m,bool_lean=0,bool_repair=0;
for(j_y=0;j_y<=year_max;j_y++)
for(j_m=0;j_m<=month_max;j_m++)
for(j_d=0;j_d<=day_max;j_d++)
{//P(j_y,j_m,j_d,m);systen("pause")
condition_p(j_y,j_m,j_d,i,&bool_lean,&bool_repair);
}
printf("\n\n");
printf(" 查询完成,请按任意键返回上一级菜单 \n");
printf("\n\n");
printf(" <----------------------------------->\n");
getch(); return(1);
}
else
{printf("\n\n");
printf(" 对不起!\n");
printf(" 可能是由于您输入错误,\n");
开始
输入时间点
结束
循环每个仪器仪表的判断状态并输出
返回主菜单
printf(" 也有可能是由于无此仪器,还未购买。\n");
printf("\n\n");
printf(" 查询失败,请按任意键返回主菜单 \n");
printf("\n\n");
printf(" <----------------------------------->\n");
getch(); return(0); } }
(2)按时间点查询
【程序】
int time_p()
{int i,year,month,day,equ_tmp,
bool_lean[101],bool_repair[101];
for(i=0;i<10;i++)
{bool_lean[i]=0;bool_repair[i]=0; }
system("cls");
printf("\n\n\n\n");
printf(" <----仪器仪表管理系统--->\n");
printf("\n\n");
printf(" 请输入时间点(年/月/日): ");
scanf("%d/%d/%d",&year,&month,&day);
printf("\n\n");
for(equ_tmp=1;equ_tmp<=n;equ_tmp++)
condition_p(year,month,day,equ_tmp,&bool_lean[equ_tmp],&bool_repair[equ_tmp]); //每个仪器
printf("\n\n");
printf(" 查询完成,请按任意键返回上一级菜单 \n");
printf("\n");
printf(" <----------------------------------->\n");
getch(); return(0);
}
(3)按时间段查询
首先输入起始时间点和结束时间点,应为每个月的天数不完全一样,用三重循环来做比较麻烦,故采用模拟法,设三个变量i、j、k,分别对应年,月,日,然后赋予初值为起始时间点,设置一无限循环,循环内设有判断是否i、j、k的值为结束时间点的语句。若是则跳出循环,否则继续循环。同时,在循环内k总是自加,当k 自加至当月最大天数时,j就自加,当j自加至当年最大月数时,i自加。
【程序】
int time_d()
开始
输入起始、结束时间点
结束
循环每个仪器仪表,判
展开阅读全文