1、 设备管理系统目 录1.课程实训目的22.需求分析22.1要求22.2任务描述22.3运行环境32.4开发工具33.总体设计33.1系统流设计33.2系统模块设计44.详细设计54.1数据结构设计54.2模块接口设计64.3 以下是几个主要模块的流程图:75.运行结果85.1主菜单界面:8 5.2输入设备编号和名称界面.95.3购买设备界面:105.4 报废设备界面:105.5查询指定设备编号的购买历史界面115.6查询指定部门设备报废历史的界面125.7统计指定日期公司各设备可以使用的数量的界面135.8保存信息界面135.9退出系统界面 .146.程序调试与测试147.编程体会148.程序
2、源代码:159.参考文献2910.用户使用手册291.课程实训目的1) 通过课程实训,加深对结构化程序设计思想的理解,能对系统功能进行分析,并设计合理的模块化结构。2) 通过课程实训,进一步掌握C语言中重要的数据结构。掌握并熟练运用指针、链表、结构体、文件等数据结构。3) 通过课程实训,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。4) 通过课程实训,培养C语言知识运用和自学能力,真正的把课堂上获得的知识运用起来,培养自己对程序编写的兴趣,并能独立设计和实现一个小型系统。5) 通过课程实训,加强了自己的程序分析能力。2.需求分析2.1要求1) 遵循软件开发过程的基本规范;能灵活应用,
3、初步具备运用C程序解决实际问题的能力。2) 运用结构化程序设计方法,按照课程实训题目要求,完成包括需求分析、数据结构设计、概要设计、详细设计、编写代码、调试和测试C程序等过程。3) 学会利用数组、结构体、链表进行相关信息表示。4) 功能模块划分清晰,系统结构图符合功能操作要求,且有详尽的功能描述5) 各主要功能模块有详尽的流程图及描述,用函数的形式实现,且调用入口、功能、出口等关系正确。6) 所设计的C程序较好的可读性和可靠性;程序书写风格规范,注释清晰。7) 界面友好(良好的人机互交),凡需要输入信息时,都有较详尽的提示信息,并对输入信息有较完善的值域分析。8) 程序经上机调试通过,不应出现
4、语法型、功能型错误,并获得满意的结果。9) 学会通过各功能性测试用例测试程序的能力,尽可能避免原则性错误的出现。10) 掌握编写、调试和测试C语言程序的基本技巧,充分理解结构化程序设计的基本方法。11) C语言课程实训报告的内容反应实际设计过程,且符合格式要求,无抄袭现象。2.2任务描述1、问题:根据需求,该系统所应包含的信息有以下一些:公司设备管理的基本信息:设备编号10个、设备名称10个、部门编号4个、部门名称4个、购买日期、购买单价、购买数量、购买金额、报废日期、报废数量。根据需求,该系统所应实现的功能有以下一些:1) 购买:输入设备编号、设备部门、购买日期、设备数量、设备单价,完成购买
5、功能。2) 报废:输入设备编号、设备部门、报废日期、设备数量,完成报废功能。3) 查询指定设备编号的购买历史。4) 查询指定部门的设备报废历史。5) 统计指定日期公司各设备可以使用的数量。2.3运行环境1) WindowsXP/7系统2) VC+6.0编译环境2.4开发工具C语言3.总体设计3.1系统流设计本系统的功能模块如图1所示,主要有以下模块:主界面模块:完成系统菜单的显示功能选择模块:根据用户的选择,完成其相应的功能设备购买:完成用户从界面输入购买信息,在系统中购买定位,并将购买金额累加到购买总价格的功能。设备报废:完成用户从界面输入报废信息,在系统中报废定位,并将从设备总数减去报废数
6、量。指定设备编号的购买历史查询:完成用户从界面输入查询条件,在系统查询符合条件的设备购买信息,并在界面上显示的功能。指定部门的设备报废历史查询:完成用户从界面输入查询条件,在系统查询符合条件的设备报废信息,并在界面上显示的功能。统计指定日期公司各设备可以使用的数量:完成用户从界面输入查询条件,在系统查询符合条件的设备记录链表,并在界面上显示的功能。3.2系统模块设计1) 课程名称界面:构造函数void auther(),实现课程实训名称以及作者的显示。2) 系统欢迎界面:构造函数void welcome(),实现欢迎使用学生简历管理系统的显示。3) 主菜单界面:构造函数void menu(),
7、实现系统主菜单的显示。4) 设备信息录入:构造函数void loadRec(),实现设备购买、报废记录的录入。5) 购买设备:构造函数void buy(),实现对设备的购买功能。6) 报废设备:构造函数void abandon (),实现对设备的报废7) 查询购买历史:构造函数int find_buyhistory(),实现对指定设备的购买设备记录的查询。8) 查询报废历史:构造函数int find_abahistory(),实现对指定部门的报废设备记录的查询。9) 统计指定日期可用设备:构造函数int find_equip(),实现对指定日期之前的可用设备。10) 保存并退出:构造函数voi
8、d save(),实现对设备购买、报废记录的保存。设备信息管理系统主界面显示功能选择设备购买信息设备报废信息指定设备编号的购买历史查询指定部门的设备报废历史查询统计指定日期公司各设备可以使用的数量图1系统功能模块图4.详细设计4.1数据结构设计根据系统要求,系统中需要保存的数据信息,其结构如下:数据项名称数据项系统表示数据类型数据长度备注部门编号depart_ID字符串20部门名称depart_name字符串20设备编号equip_ID字符串20设备名称equip_name字符串20设备购买数量b_number整型设备报废数量a_number整型设备价格price整型购买年份buy_date.
9、year整型购买月份buy_date.month整型购买日期buy_date.day整型报废年份aban_data.year整型报废月份aban_data.month整型报废日期aban_data.day整型为此,先声明类型为struct equipment、struct department、truct information、struct data的四个结构体,其成员分别为设备和部门的编号以及名称信息。然后通过对指针、链表、文件等数据结构的操作,实现对设备和部门的编号以及名称信息的录入,插入,存盘,查询,等功能。定义的结构体如下:定义如下:/*描述保存信息的链表类型*/typedef st
10、ruct informationDEPARTINFO depar;EQUIPINFO equip;struct information *next;infor;/*描述部门信息的结构体类型*/typedef structchar depart_ID20;char depart_name20;DEPARTINFO;/*描述设备信息的结构体类型*/typedef structchar equip_ID20;char equip_name20;DATA buy_date;DATA aban_data;int b_number;int price;int a_number;EQUIPINFO;/*描述
11、时间的结构体类型*/typedef structint year;int month;int day;DATA;4.2模块接口设计所有函数模块声明如下:1) void auther();/*显示课程名称*/2) void welcome();/*显示欢迎界面*/3) void menu();/*主菜单函数*/4) void loadRec();/*设备信息录入*/5) void buy();/*购买设备*/6) void abandon ()/*报废设备*/7) int find_buyhistory();/*查询购买历史*/ 8) int find_abahistory();/*查询报废历史
12、*/9) int find_equip();/*统计指定日期可用设备*/10) void save();/*保存购买报废记录*/11) int sysTime();/*取系统时间*/12) int DAY();/*判断该月天数*/13) void gotoxy(int x,int y);/*光标函数*/14) 主要模块的实现系统以主函数void main()为入口,首先通过system(color 0f);将文本颜色置为白色,背景颜色置为黑色。调用void auther()函数,显示课程实训名称及作者信息。进入主菜单界面。系统接收用户输入的选择,调用相应的函数,进入到下一级菜单进行相关工作。4
13、.3以下是主菜单的流程图:1) 主菜单函数:否打印主菜单接收用户选项是否合法调用对应选项函数进入下一级菜单退出系统是否是是否为0图2 主函数流程图5.运行结果5.1主菜单界面:主界面:根据系统要求,设计一个字符界面,显示系统的菜单,为了体现友好性,将在每个菜单前显示该菜单项对应的数字用户输入菜单项前面的数字,主菜单消失,进入该模块的相应界面,进行相应的操作,完成后,回到主界面。输入的主界面:图5主菜单界面输入功能选择,系统自动进入相应功能界面。5.2欢迎界面图6 输入设备编号和名称的界面:5.3购买设备界面: 图7购买设备界面5.4报废设备界面: 图8报废设备界面 5.5查询指定设备编号的购买
14、历史界面:图9查询指定设备编号的购买历史界面5.6查询指定部门设备报废历史的界面 图10查询指定部门设备报废历史的界面5.7统计指定日期公司各设备可以使用的数量的界面:6.程序调试与测试各个模块在调试与分析的过程中往往会碰到一些错误和警告,从而导致了程序的无法正确运行,这时候我们往往是从错误开始分析,然后分步调试程序。 7.编程体会通过本学期实训课与C语言课相结合的学习模式,以上机实验操作为主,平时理论课程相结合的特点,让我对C语言的认识更加深刻,更加深了我对语言的理解和运用能力。在学习期间遇到的问题先翻看书本再查找资料使我更深入的接触和了解到更多的C语言知识。平时上理论课老师就强调C语言知识
15、的重要性和实用性,学习的过程中也慢慢觉得要想把C语言学好必须要花费大量的精力和时间。就像这次的最后的大实训,一个人就一道题,却花费了三四天的时间去做,先自己做个框架,然后再一步步做函数,不仅请教同学帮忙,还请教了老师帮助我改错,虽然最后完成了任务,但是程序还做得不是很好,程序运行的不是很好,有些功能没有完全实现。在这几天的实训中,让我认识到C语言的实用性,纵观同学们做的题目,让C语言实现大大小小不同的功能,这就是C语言的应用广泛性。同时还得出一个结论:理论知识必须通过实践应用才能实现其价值!有些东西在理论方面以为学会了,但真正到应用的时候才发现是两回事,看书的时候我以为函数功能很简单,但是我在
16、用的时候,却漏洞百出,不是这错就是那错,找老师好几遍才改过来。学习C语言就需要缜密的思维,良好的习惯,这样才能把C语言编的又快又好! 8.程序源代码:#include #include #include #include #include #include #include #define LEN sizeof(infor)/*描述时间的结构体类型*/typedef structint year;int month;int day;DATA;/*描述设备信息的结构体类型*/typedef structchar equip_ID10;char equip_name10;DATA buy_date
17、;DATA aban_data;int b_number;int price;int a_number;EQUIPINFO;/*描述部门信息的结构体类型*/typedef structchar depart_ID30;char depart_name20;DEPARTINFO;/*描述保存信息的链表类型*/typedef struct informationDEPARTINFO depar;EQUIPINFO equip;struct information *next;infor;infor *p1,*p2,*head;int flag=-1;/*函数声明*/void welcome();v
18、oid auther();int buy();int abandon();int find_buyhistory();int find_abahistory();int sysTime();int DAY(int year,int month);int find_equip();void loadRec();void save();void gotoxy(int x,int y);/*主函数*/int main()system(color 0a);auther();/*软件名称及开发者显示*/welcome();/*欢迎界面显示*/loadRec();while(1)switch(menu()
19、system(cls);case 1:buy();break;case 2:abandon();getchar();break;case 3:find_buyhistory();break;case 4:find_abahistory();break;case 5:find_equip();break;case 0:save();exit(0);break;default:printf(n选择错误,请按主菜单提示输入您的正确选择(04)n);printf(按任意键返回继续:);rewind(stdin);/*清空缓冲区*/getch();return 0;/*菜单*/int menu()int
20、 choice;system(cls);gotoxy(33,5);printf(主菜单nn);Sleep(500);gotoxy(33,7);printf(1.购买设备nn);Sleep(500);gotoxy(33,9);printf(2.报废设备nn);Sleep(500);gotoxy(33,11);printf(3.查询设备购买历史nn);Sleep(500);gotoxy(33,13);printf(4.查询设备报废历史nn);Sleep(500);gotoxy(33,15);printf(5.统计指定日期公司各设备可以使用的数量nn);Sleep(500);gotoxy(33,17
21、);printf(0.保存并退出nnn);Sleep(500);gotoxy(33,19);printf(请输入您的选择(05):);Sleep(500);rewind(stdin);/*清空缓冲区*/choice=-1;scanf(%d,&choice);rewind(stdin);return choice;/*返回用户的选择*/*软件名称及开发者显示*/void auther()system(cls);printf(nnnnnnnttt 软件名称:设备管理系统nn);printf(ttt 学生:k1223-5 nn);printf(ttt 指导老师:胡宁亚nn);printf(ttt 时
22、间:%ldnn,sysTime();printf(ttt 按回任意键进入系统:);getch();/*欢迎界面显示*/void welcome()int i,x,y;char ch;system(cls);for(i=0;inext!=NULL) p=p-next; p1=(infor *)malloc(LEN);/为新节点分配空间 scanf(%s%s%s%s%d%d,p1-depar.depart_ID,p1-depar.depart_name,p1-equip.equip_ID,p1-equip.equip_name,&p1-equip.b_number,&p1-equip.price)
23、; p1-equip.a_number=0; p1-equip.buy_date.year=1900+timeinfo-tm_year; p1-equip.buy_date.month=1+timeinfo-tm_mon; p1-equip.buy_date.day=timeinfo-tm_mday; printf(花费了%d元n,p1-equip.price*p1-equip.b_number); rewind(stdin); printf(是否继续(y/n)?); scanf(%c,&choice); p-next=p1; p1-next=NULL; if(choice=y|choice=
24、Y) goto loop1;elsehead=(infor *)malloc(LEN);p=head;flag=1;dop1=(infor *)malloc(LEN);/为新节点分配空间 p1-next=NULL;printf(请输入部门编号 部门名称 设备编号 设备名称 设备数量 设备价格:n); scanf(%s%s%s%s%d%d,p1-depar.depart_ID,p1-depar.depart_name,p1-equip.equip_ID,p1-equip.equip_name,&p1-equip.b_number,&p1-equip.price);p1-equip.a_numbe
25、r=0;p1-equip.buy_date.year=1900+timeinfo-tm_year;p1-equip.buy_date.month=1+timeinfo-tm_mon;p1-equip.buy_date.day=timeinfo-tm_mday;printf(花费了%d元n,p1-equip.price*p1-equip.b_number);rewind(stdin);printf(是否继续(y/n)?);scanf(%c,&choice); p-next=p1;p=p1;while(choice=y|choice=Y);int abandon()if(flag=1)int a,
26、c,i=0;DATA time1,time2;char d_ID20,e_ID20;infor *p,*h;system(cls);printf(请输入要报废设备的部门编号、设备编号n);scanf(%s%s,d_ID,e_ID);p1=head-next;while(p1!=NULL)if(strcmp(e_ID,p1-equip.equip_ID)=0&strcmp(d_ID,p1-depar.depart_ID)=0&p1-equip.b_number0)i+;a=p1-equip.b_number;time2=p1-equip.buy_date;h=p1;p1=p1-next;if(i
27、=0)printf(设备%s不存在,e_ID);getch();return ;elsedosystem(cls);printf(请输入要报废时间的年(=%d )n,time2.year);scanf(%d,&time1.year);if(time1.yeartime2.year) continue;else if(time1.year=time2.year)doprintf(请输入要报废时间的月(%d=month12|time1.month1);if(time1.monthtime2.month) continue;else if(time1.month=time2.month)doprin
28、tf(请输入要报废时间的日(%d=day=%d)n,time2.day,DAY(time1.year,time1.month);scanf(%d,&time1.day);rewind(stdin);while(time1.dayDAY(time1.year,time1.month);if(time1.daytime2.day) continue;else goto loop;else doprintf(请输入要报废时间的日(1=day=%d)n,DAY(time1.year,time1.month);scanf(%d,&time1.day);rewind(stdin);while(time1.
29、dayDAY(time1.year,time1.month);goto loop;elsedoprintf(请输入要报废时间的月(1=month12|time1.month1);doprintf(请输入要报废时间的日(1=day=%d)n,DAY(time1.year,time1.month);scanf(%d,&time1.day);rewind(stdin);while(time1.dayDAY(time1.year,time1.month);goto loop;while(1);loop:do printf(请输入报废台数(1%d)n,a); scanf(%d,&c);rewind(st
30、din); while(ca|cnext; while(p1!=NULL) if(strcmp(e_ID,p1-equip.equip_ID)=0&strcmp(d_ID,p1-depar.depart_ID)=0&p1-equip.b_number0) p1-equip.b_number-=c; p1=p1-next; p=head; while(p-next!=NULL) p=p-next; p2=(infor *)malloc(LEN);/为新节点分配空间 p2=h; strcpy(p2-depar.depart_ID,d_ID); strcpy(p2-equip.equip_ID,e_
31、ID); p2-equip.a_number=c; p2-equip.aban_data=time1; p2=p2-next; printf(报废成功);elseprintf(无设备记录,请先购买设备n);getch();int find_buyhistory()if(flag=1)int i=0;char e_ID20;system(cls);printf(nnnnnttt 请输入要查询设备的设备编号n);scanf(%s,e_ID);p1=head-next;while(p1!=NULL)if(strcmp(e_ID,p1-equip.equip_ID)=0&p1-equip.b_numb
32、er0)i+;p1=p1-next;if(i!=0)p1=head-next;while(p1!=NULL)if(strcmp(e_ID,p1-equip.equip_ID)=0&p1-equip.b_number0) printf(部门编号: %sn部门名称: %sn设备编号: %sn设备名称: %sn购买台数:%dn购买时间: %d-%d-%dnn,p1-depar.depart_ID,p1-depar.depart_name,p1-equip.equip_ID,p1-equip.equip_name,p1-equip.b_number,p1-equip.buy_date.year,p1-
33、equip.buy_date.month,p1-equip.buy_date.day); p1=p1-next;elseprintf(无%s的购买历史,e_ID);getch();elseprintf(无设备记录,请先购买设备n);getch();int find_abahistory()if(flag=1)int i=0;char d_ID20;system(cls);printf(请输入要查询的部门编号n);scanf(%s,d_ID);p1=head-next;while(p1!=NULL)if(strcmp(d_ID,p1-depar.depart_ID)=0&p1-equip.a_n
34、umber0) i+;p1=p1-next;if(i!=0)p1=head-next;while(p1!=NULL)if(strcmp(d_ID,p1-depar.depart_ID)=0&p1-equip.a_number0) printf(部门编号: %sn部门名称: %sn设备编号: %sn设备名称: %sn报废台数: %dn报废日期: %d-%d-%dn,p1-depar.depart_ID,p1-depar.depart_name,p1-equip.equip_ID,p1-equip.equip_name,p1-equip.a_number,p1-equip.aban_data.ye
35、ar,p1-equip.aban_data.month,p1-equip.aban_data.day); p1=p1-next;elseprintf(无%s部门的报废历史,d_ID);getch();elseprintf(无设备记录,请先购买设备n);getch();int find_equip()if(flag=1)int i=0;unsigned long day;system(cls);printf(请输入要查询的日期n);scanf(%ld,&day);p1=head-next;while(p1!=NULL)if(p1-equip.aban_data.year*10000+p1-equ
36、ip.aban_data.month*100+p1-equip.aban_data.day)=day&p1-equip.b_number0) printf(部门编号: %sn部门名称: %sn设备编号: %sn设备名称: %sn台数: %d%nn,p1-depar.depart_ID,p1-depar.depart_name,p1-equip.equip_ID,p1-equip.equip_name,p1-equip.b_number); i+;p1=p1-next;getch();if(i=0)printf(nnnttt%ld之后无可用设备,day);elseprintf(无设备记录,请先购买设备n);getch();int DAY(int year,int month)if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)return 31;else if(month=4|month=6|month=9|month=11)return 30;elseif(year%4=0&year%100