1、 . 报告 语言课程设计 C 学院:自动化学院 专业:自动化 班级: 231XXX XX: XXX 学号: 231XXX-XX - . 可修编. 目录 1. 题目概述,总体设计--------------------------------第 1页 2. 详细设计,菜单函数----------
2、第 2页 3. 功能模块:录入模块--------------------------------第 3页 4. 状态改变模块--------------------------------------第 4页 5. 状态改变,借出归还--------------------------------第 6页 6. 状态改变,维修------------------------------------第 7页 7. 状态改变,删除------------------------------------第 8页 8. 状态查询模块------
3、第 9页 9. 按名称查询----------------------------------------第11页 10.按时间点/段查询----------------------------------第12页 11.公共函数-----------------------------------------第13页 12.上机实践-----------------------------------------第14页 13.程序的亮点与缺乏---------------------------------第17页
4、 14.总结---------------------------------------------第18页 专业资料 题目:仪器仪表管理系统[要求] 系统功能的根本要求: (1) 新的仪器仪表信息录入。(2) 在借出、归还、维修时对仪器仪表信息的修改。(3) 对报废仪器仪表信息的删除。(4) 按照一定的条件查询、统计符合条件的仪器仪表信息; 查询功能至少应包括仪器仪表根本信息的查询、按时间段(
5、如在2004 年1月1日到2004 年10 月10 日购置、借出、维修的仪器仪表等) 查询、按时间点(借入时间、借出时间、归还时间) 查询等,统计功能至少包括按时间段统计、按仪器仪表的根本信息统计等。(5) 对查询、统计的结果打印输出。 [提示] 数据构造采用构造体。仪器仪表信息包括仪器仪表名、仪器仪表编号、购置时间、借入时间、借出时间、归还时间、维修时间、状态信息(0 代表可借出,1代表可借入,2 代表正在维修) 等。 需求分析: 根据题目要求,由于仪器仪表信息是存放在文件,所以应提供文件的输入、输出等操作; 在程序中要浏览仪器仪表的信息。应提供录入、显示、查找,修改等操作; 另外还
6、应提供键盘式选择菜单实现功能选择。 总体设计: 根据上面的需求分析,可以将这个系统的设计分为三个大的模块: 仪表 仪器录入、仪表仪器修改(删除)、仪表仪器查询 仪器仪表管理系统 查询 录入 修改 详细设计 〔一〕主函数 主函数一般设计得比拟简洁,只提供输入、处理和输出局部的函数调用。其中各功能模块用菜单方式选择。其中流程图如下: [程序]其中为主函数设定了一个菜单函数,方便用于选择其他模块函数。用getch0;获得所按下的键值,用函数的局部静态变量储存键值对应的其他功能函数。 void menu(char c) /*菜单函数*/ {
7、 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(
8、);break; //修改 case 3:serch(); break; //查询 开场 case 4:exit(0); //退出程序 }; } system("cls"); 显示一系列功能选项 printf("\n\n"); printf(" 仪器仪表管理系统 \n"); printf("\n"); 选择一个功能 printf("
9、 XX:xxx "); printf(" 班级231xxx"); printf("\n\n"); 根据选择的功能调用功能模块函数 if(n=1) printf(" -->仪器仪表录入<-- \n"); else 完毕 printf(" 仪器仪表录入 \n"); printf("\n"); if(n=2) printf(" -->仪器仪表借还/删除<-- \n"); else printf(" 仪器
10、仪表借还/删除 \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"); prin
11、tf("\n\n\n\n"); printf(" -->仪器仪表管理系统<-- \n"); printf("\n"); printf(" -->按W向上选择<-- \n"); printf(" -->按S向下选择<-- \n"); printf(" -->按回车确定选择<-- \n"); printf("\n"); printf("\n"); pri
12、ntf(" -->按任意键进入系统<-- \n"); printf(" <-----------------> \n"); getch(); menu('s'); while(1) menu(getch()); } 〔二〕各功能模块设计[数据构造] 数据构造选用构造体数组。这里只简单的给仪器仪表两个局部,一个为仪器仪表的名称、字符串函数,一个为仪器仪表的各个时间点的状态〔定义一个time的三维数组,数组下标表示年月日,数组的值表示仪器的状态〕。 #define buy 1
13、 //购置 #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][
14、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");
15、 否 printf(" -->仪器仪表管理系统<-- \n"); printf("\n\n\n\n"); 返回主菜单 输入买入时间 printf(" 请输入仪器的名称:"); scanf("%s",&equ_input); 完毕 if(presence(equ_input)!=0) { printf("\n"); printf("\n"); printf(" 对不起!此仪器已购置\n ");
16、 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].na
17、me 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]); print
18、f("\n"); printf("\n"); printf(" 录入成功,请按任意键返回主菜单\n"); printf("\n"); printf("\n"); printf(" <-----------------------------> \n"); getch(); } } (二) 状态改变模块 该模块包括对仪器仪表的借出、归还、维修、报废等小模块的操作,仍然用getch();函数获取键值来做上下选择。本函数只考虑对一种仪器仪表的修改,故先要输入该仪器仪表的名称
19、并查找是否已经购置。 开场 【程序】 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); // p
20、rintf("\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:myde
21、l(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
22、 printf(" 仪器仪表借出 \n"); printf("\n\n"); if(x==2) printf(" --->仪器仪表归还<------\n"); else printf(" 仪器仪表归还 \n"); printf("\n\n"); if(x==3) printf(" --->仪器仪表维修<------\n"); else printf(" 仪器仪表维修
23、\n"); printf("\n\n"); if(x==4) printf(" --->仪器仪表报废<------\n"); else printf(" 仪器仪表报废 \n"); printf("\n\n"); if(x==5) printf(" --->返回主菜单<------\n"); else printf(" 返回主菜单 \n"); printf(" <------------
24、>\n"); c=getch(); } } else { /*system("cls"); printf("\n\n\n\n"); printf(" <----仪器仪表管理系统--->\n"); printf("\n\n");*/ printf("\n\n"); printf(" 对不起!找不到该仪器\n"); printf(" 可能是由于您输入仪器的名称错误,\n"); printf(" 也可能是由于无此仪器,还没购置
25、\n"); 开场 printf("\n\n"); printf(" 修改失败,请按任意键返回主菜单 \n"); 输入仪器仪表名称 printf(" <----------------------------------->\n"); getch(); //return; } } 是否空闲 (1) 借出模块 首先输入借出的时间,然后在仪器仪表的构造体数组中查 是 否 找该仪器仪表在这个输入的时间点上有无其他状态。假设无 其他状态那么可以借出,否那么不可借出。 返回主菜单 标记状态为借出 【程序】 int my
26、lean(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].
27、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")
28、 printf(" 对不起!\n"); printf(" 此仪器还没有购置或没有归还或正在维修中,\n"); printf(" 故无法借出。\n"); printf(" 借出失败,请按任意键返回上一级菜单 \n"); printf("\n\n"); printf(" <----------------------------------->\n"); getch(); return(0); } } (2) 归还模块 首先输入借出的时间,然后在仪器仪表的构造体数组中查找该
29、仪器仪表在这个输入的时间点上有无其他状态。假设无其他状态那么可以借出,否那么不可借出。 【程序】 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][mont
30、h][day]==lean) //判断状态是否为借出 开场 输入仪器仪表名称 是 是否借出 标记状态为空闲 返回主菜单 否 完毕 { printf("\n\nn"); printf(" 归还成功,请按任意键返回上一级菜单 \n"); printf("\n\n"); printf(" <----------------------------------->\n"); state(year,month,day,j
31、inlib); //改状态为空闲 getch(); return(1); } else { printf("\n\n"); printf(" 对不起!\n"); printf(" 此仪器还没有购置或还没有借出\n"); printf(" 或正在维修中,故无法归还。\n"); printf(" 归还失败,请按任意键返回上一级菜单 \n"); printf("\n"); printf(" <----------------------------------->\
32、n"); getch(); return(0); } } 〔3〕维修模块 同样是首先输入维修开场的时间和维修完毕的时间,然后在仪器仪表的构造体数组中查找该仪器仪表在这个归还的时间点上有其他状态。假设有为空闲状态那么可以维修,否那么不可维修。 开场 输入维修开场完毕时间 是 是否空闲 标记状态为维修 返回主菜单 否 完毕 【程序】 int myrepair(int j) { int year,month,day; system("cls"); prin
33、tf("\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(" 请输入维修完毕时间〔年
34、/月/日〕:"); 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");
35、printf(" 对不起!\n"); printf(" 此仪器还没有购置或借出,\n"); printf(" 故无法维修。\n"); printf("\n\n"); printf(" 维修失败,请按任意键返回上一级菜单 \n"); printf("\n\n"); printf(" <----------------------------------->\n"); getch(); return(0); } } 〔4〕删除模块 删除模块将删除本仪器仪表,具体删除过程为
36、将需要删除的后一项覆盖至删除的这一项,即需删除以后的每一个构造体元素都向前移一个单位。 开场 是 是否删除 循环将需删除的后面所有元素整体向前移动一个单位 返回主菜单 否 完毕 【程序】 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)
37、 x=2;
if(c==13)
{if(x==1)
{ int i;
for(i=n;i
38、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("
39、>确定要报废仪器<--- \n"); else printf(" 确定要报废仪器 \n"); printf("\n\n"); if(x==2) printf(" --->我要考虑考虑<--- \n"); else printf(" 我要考虑考虑 \n"); printf("\n\n"); printf(" <----------------------------------->\n"); c=getch(); } }
40、三)仪器仪表查找模块 仪器仪表查找分为按名称查找、按时间点查找、按时间段查找三个模块,通过键盘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();brea
41、k; 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"); p
42、rintf("\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("
43、 --->返回主菜单<------\n"); else printf(" 返回主菜单 \n"); printf("\n\n"); printf(" <----------------------------------->\n"); c=getch(); } } 因为不管查找条件是什么,最终都会对应到需查找的仪器仪表上,故补充一个公共函数condition_p〔〕;,输出查找一个仪器仪表的结果。 【程序】 void condition_p(int year,int month,int day,in
44、t 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)&&(
45、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仪器仪表
46、\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
47、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() 开场 输入仪器仪表名
48、称 是 是否存在 循环并输出 返回主菜单 否 完毕 { 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
49、 (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("
50、 查询完成,请按任意键返回上一级菜单 \n"); printf("\n\n"); printf(" <----------------------------------->\n"); getch(); return(1); } else { printf("\n\n"); printf(" 对不起!\n"); printf(" 可能是由于您输入错误,\n"); 开场 输入时间点 完毕 循环每个仪器仪表的判断状态并输出 返回主菜单 printf(" 也有可






