二○一五~二○一六学年第一学期电子与信息工程系课程设计报告书课程名称:程序设计基础实践班级:学号:姓名:指导教师:二○一五年十二月1..实验室设备信息管理系统功能(1). 每一条记录包括实验室的设备编号、设备名称、设备型号、设备价格、设备购买日期信息。
(2). 实验设备信息录入:可以一次完成诸多条记录的录入。
(3). 实验设备信息更改:可实现对实验设备信息更改的信息进行适当的修改。
(4). 报废设备信息删除:对实验损毁设备信息予以删除。
(5). 实验设备信息查询:本系统提供两种查询实验设备的方法:1.按器材名称查询.2.按器材编号查询.从而完成按实验设备的查找查找功能,并显示。
(6). 实验设备信息排序:根据实验设备的编号进行排序,以实现实验设备的有序全局查看。
实验设备信息显示功能:完成全部学生记录的显示。
(7). 简单帮助:提供实验室负责人简单的信息。
(8). 保存功能:将学生记录保存在任何自定义的文件中,如保存在:c:\score。
(9). 读取功能:将保存在文件中的学生记录读取出来。
(10). 有一个清晰美观界面来调用各个功能2.设计内容2.1 程序的总体设计整个系统除了主函数外,另外还有11个函数,实现以下功能:实验室设备录入功能、显示功能、查找功能、排序功能、读出与写入取功能。
各个函数的详细设计说明分别如下:2.2 数据结构使用C语言创建的结构体如下:typedef Equipment /*定义数据结构*/{char bianhao; //编号char name[20]; //名称char model[20]; //型号bnmchar price[20]; //价格char buy_date[20]; //购买日期};3 详细设计3.1实验设备管理系统主程序模块设计控制整个程序的运行,通过主函数模块分别调用各个模块,实现各项功能,流程如图1所示。
通过switch进入分支结构从而调用执行不同的函数,以实现菜单选择的功能。
程序如下:void main(){int choice;int choice2;IO_ReadInfo();system("cls");while(1){/*主菜单*/printf("\n\n\n\n\n\t\t------ 苏州科技学院实验器材管理系统------\n\n");printf("\t\t\t 1. 实验设备信息录入\n");printf("\t\t\t 2. 实验设备信息更改\n");printf("\t\t\t 3. 报废设备信息删除\n");printf("\t\t\t 4. 实验设备信息查询\n");printf("\t\t\t 5. 实验设备信息排序\n");printf("\t\t\t 6. 帮助\n");printf("\t\t\t 7. 退出\n");printf("\n\t\t------*------*-----*-----*-----*-----*------\n");printf("\n\n\n 请选择(1-7):");scanf("%d",&choice);getchar();system("cls");switch(choice){case 1:Equipment_Insert();break;case 2:Equipment_Modify();break;case 3:Equipment_Delete();break;case 4:printf("\n\n\n\n\n\t请选择(1/2) → 1.按器材名称查询\n");printf(" 2.按器材编号查询\n\n\n");scanf("%d",&choice2);switch(choice2){case 1:Equipment_nameSelect();break;case 2:Equipment_bianhaoSelect();break;}break;case 5:void Equipment_paixu();Equipment_Display();break;case 6:printf("\n\n\n\n\n\n\t\t\t---**---电子与通信工程学院实验室---**---\n\n");printf("\t\t\t\t 负责人:sdiwen \n\n");printf("\t\t\t\t 办公室:A-201 \n\n");printf("\t\t\t\t Tel:*************\n\n");printf("\t\t\t---**---**---**---**---**---**------**---\n\n");printf("\t\t\t\t\t|| →made by wangluoyang\n\n");break;case 7:exit(0);break;}system("Pause");system("cls");IO_WriteInfo();}}其运行界面如下:3.2一些辅助函数通过设备编号返回数组下标(int Equipment_SearchByIndex(char id[]))通过(strcmp(equipment[i].bianhao,id)==0) 进行比较,从而反馈回对应设备的数组下标。
以方便查询函数,与显示函数的执行。
程序如下:int Equipment_SearchByIndex(char id[]){int i;for (i=0;i<num;i++){if (strcmp(equipment[i].bianhao,id)==0){return i;}}return -1;}通过设备名称返回数组下标(int Equipment_SearchByName(char name[ ]))通过(strcmp(equipment[i].name, name)进行比较,从而反馈回对应设备的数组下标。
以方便查询函数,与显示函数的执行。
程序如下:int Equipment_SearchByName(char name[]){int i;for (i=0;i<num;i++){if (strcmp(equipment[i].name,name)==0){return i;}}return -1;}显示单条设备记录(void Equipment_DisplaySingl e(int ind ex))为报废设备删除提供信息的显示。
如下所示,即是调用单条显示函数。
void Equipment_DisplaySingle(int index){printf("\n\n\n设备编号设备名称设备型号设备价格设备购买日期\n");printf("-------------------------------------------------------------\n");printf("%5s%12s%10s%12s%15s\n",equipment[index].bianhao,equipment[index].name, equipment[index].model,equipment[index].price,equipment[index].buy_date); }显示在库设备信息( void Equipment_Display( ) )通过for循环语句将结构体数组中所有的内容显示出来,为排序函数提供显示提出,排序函数最后显示即需要调用显示函数。
void Equipment_Display(){int i;printf("设备编号设备名称设备型号设备价格设备购买日期\n");printf("-------------------------------------------------------------\n");for (i=0;i<num;i++){printf("%5s%12s%10s%12s%15s\n",equipment[i].bianhao,equipment[i].name,equipment[i].model,equipment[i].price,equipment[i].buy_date);}}将设备信息从文件读出void IO_ReadInfo()将设备信息写入文件void IO_WriteInfo()这两条函数即是将所录入系统的信息保存在database.txt中,以便下次使用时信息的读取与保存。
void IO_ReadInfo(){FILE *fp;int i;if ((fp=fopen("Database.txt","rb"))==NULL){printf("不能打开文件!\n");return;}if (fread(&num,sizeof(int),1,fp)!=1){num=-1;}else{for(i=0;i<num;i++){fread(&equipment[i],sizeof(struct Equipment),1,fp);}}fclose(fp);}/*将设备信息写入文件*/void IO_WriteInfo(){FILE *fp;int i;if ((fp=fopen("Database.txt","wb"))==NULL){printf("不能打开文件!\n");return;}if (fwrite(&num,sizeof(int),1,fp)!=1){printf("写入文件错误!\n");}for (i=0;i<num;i++){if (fwrite(&equipment[i],sizeof(struct Equipment),1,fp)!=1){printf("写入文件错误!\n");}}fclose(fp);}3.3 实验设备信息录入模块设计(Void Equipment_Insert( ))信息输入时,设计思想为通过while(1)死循环,不断输入字符串的值保存在结构体数组中,通过if (getchar()=='n'){break;}来判定是否跳出循环。