二○一五~二○一六学年第一学期电子与信息工程系课程设计报告书课程名称:程序设计基础实践
班级:
学号:
姓名:
指导教师:
二○一五年十二月
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]; //型号bnm
char 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:0514-******** \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 { 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 { 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 { 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 { 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 { 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; } 来判定是否跳出循环。在系统中输入相关信息流程图如图2所示。 图2. 实验设备信息录入模块流程图程序如下: void Equipment_Insert() { while(1) { printf("\n\n\n请输入实验设备编号→"); scanf("%s",&equipment[num].bianhao); printf("请输入实验设备名称→"); scanf("%s",&equipment[num].name); printf("请输入实验设备型号→"); scanf("%s",&equipment[num].model); printf("请输入实验设备采购价格→"); scanf("%s",&equipment[num].price); printf("请输入实验设备购买日期→"); scanf("%s",&equipment[num].buy_date); num++; printf("\n是否继续信息录入? →(y/n)" ); getchar() if (getchar()=='n') { break; } } } 程序运行如下: 3.4实验设备信息更改模块设计(Void Equipment_Modify( )) 修改信息,系统要求用户输入要修改的设备编号,用户只需将设备新的信息按要求输入即可对信息进行修改,流程图如图3.其调用 index=Equipment_SearchByIndex(id);通过编号返回其下标,并对结构体对应的数组进行重新赋值从而达到修改的效果。 图3. 实验设备信息更改模块流程图 程序如下: void Equipment_Modify() { while(1) { char id[20]; int index; printf("\n\n\n\n\n请输入需要修改的实验设备编号→"); scanf("%s",&id); index=Equipment_SearchByIndex(id); if (index==-1) { printf("**该设备不存在! 抱歉**\n"); } else { printf("你需要修改的设备信息为→\n"); Equipment_DisplaySingle(index); printf("--* 请输入修改新值*--\n"); printf("\n\n\n** 请输入设备编号**:"); scanf("%s",&equipment[index].bianhao); printf("请输入设备名称→"); scanf("%s",&equipment[index].name); printf("请输入设备型号→"); scanf("%s",&equipment[index].model); printf("请输入设备价格→"); scanf("%s",&equipment[index].price); printf("请输入设备购买日期→"); scanf("%s",&equipment[index].buy_date); } printf(" 是否继续? →(y/n)"); getchar(); if (getchar()=='n') { break; } } } 程序运行如下: 3.5报废设备信息删除模块设计(void Equipment_Delete( ) ) 删除报废设备信息,系统要求用户输入要删除的设备编号,输入后即可删除设备信息,设计思想:流程图如图3. 图3. 报废设备信息删除模块流程图 程序如下: void Equipment_Delete() { int i; while(1) { char id[20]; int index; printf("\n\n\n\n请输入要删除的设备编号→"); scanf("%s",&id); index=Equipment_SearchByIndex(id); if (index==-1) { printf("设备不存在! 抱歉\n"); } else { printf("你要删除的设备信息为→\n"); Equipment_DisplaySingle(index); printf("是否真的要删除该设备? →(y/n)"); if (getchar()=='y') { for (i=index;i { equipment[i]=equipment[i+1]; } num--; } getchar(); } printf("是否继续? →(y/n)"); getchar(); if (getchar()=='n') { break; } } } 3.6 实验设备信息查询模块设计 按器材名称查询:Equipment_nameSelect(); 按器材编号查询:Equipment_bianhaoSelect(); 设备信息的查找,系统要求用户输入要查找的设备编号,输入后即可得到设备信息,流程图如图4. 图4. 实验设备查找模块流程图 3.7实验设备信息排序模块设计 (void Equipment_paixu( ) ) 设备信息显示,可显示所有设备信息,流程图如图5. 图7. 设备信息排序模块流程图 程序如下: void Equipment_paixu() { int i,j; struct Equipment paixu; for (i=0;i { for (j=1;j { if (strcmp(equipment[j-1].bianhao,equipment[j].bianhao)>0) { paixu=equipment[j-1]; equipment[j-1]=equipment[j]; equipment[j]=paixu; } } } } 4.调试分析与总结 经过一周的调查、学习、研究和设计,实验室器材管理系统的设计接近了尾声。程序设计之初在for循环的初值没有安排好,导致输出结果与预期相差甚远。还有一些中英文状态等问题,漏输分号。最主要的就是程序的逻辑结构没有把握好导致程序并不是所想的那样执行下去。在这里我将本次设计做如下总结: 本系统的功能已经达到设计的要求。系统中各个模块的功能均已实现,为整体系统的构建奠定了基础。 系统模块的功能可以被进一步扩展。 系统中模块划分明确,模块功能设计有较强的针对性。 系统的设计遵循软件开发的全过程,使我对软件系统的开发过程有了更深刻的认识。 当然系统的设计没有完美无缺的,本次系统在某些地方可能存在不足,囿于时间的原因在许多方面还需做出进一步的改进和完善。还有一些想法没能很好的体现在本次设计上。在课后还将进一步的思考整合所学知识做出创新。在最后感谢严迪新老师精彩的授课,使我对C语言以及C++有了更深层次的认知,有了入门编程的思维。 附录: 源代码 #include "stdio.h" #include"string" /*定义实验器材结构体*/ struct Equipment { char bianhao[20]; //设备编号 char name[20]; //设备名称 char model[20]; //设备型号 char price[20]; //设备价格 char buy_date[20]; //设备购买日期 }; /*声明实验器材数组及实验器材数量*/ struct Equipment equipment[1000]; int num=0; /*通过设备编号返回数组下标*/ int Equipment_SearchByIndex(char id[]) { int i; for (i=0;i { if (strcmp(equipment[i].bianhao,id)==0) { return i; } } return -1; } /*通过设备名称返回数组下标*/ int Equipment_SearchByName(char name[]) { int i; for (i=0;i { if (strcmp(equipment[i].name,name)==0) { return i; } } return -1; } /*显示单条设备记录*/ void Equipment_DisplaySingle(int index) { printf("\n\n\n设备编号设备名称设备型号设备价格设备购买日期\n"); printf("-------------------------------------------------------------\n"); printf("%5s%12s%10s%12s%15s\n",equipment[index].bianhao,equipment[i ndex].name, equipment[index].model,equipment[index].price,equipment[index].buy_date) ; } /*插入设备信息*/ void Equipment_Insert() { while(1) { printf("\n\n\n请输入实验设备编号→"); scanf("%s",&equipment[num].bianhao); printf("请输入实验设备名称→"); scanf("%s",&equipment[num].name); //getchar(); printf("请输入实验设备型号→");