目录
1 绪论
1.1 研究的目的及意义
面对日益增多的实验教学需求,古老的人工管理方式和人工预约方式受到了强烈的冲击,更加简便、清晰、规范的实验室管理系统也应运而生。 通过使用实验室管理系统实现高校实验室、实验仪器与实验耗材管理的规范化、信息化;提高实验教学特别是开放实验教学的管理水平与服务水平;为实验室评估、实验室建设及实验教学质量管理等决策提供数据支持;智能生成每学年教育部数据报表,协助高校轻而易举完成数据上报工作。
2需求分析
2.1 关键问题
在使用C语言完成实验设备管理系统时,因为需要实现增删改查的功能,所以在编写代码时遇到了以下的问题:
- 整个代码需要采用模块化的设计,所以在设计模块化系统时,需要合理划分各个模块,将功能相近的代码封装到一个模块中,但是在实际操作中,可能会遇到模块划分不清晰的问题。
- 代码设计中,用户主界面需要与其他功能相联系,从而实现通过用户界面快捷使用系统的功能,但用什么代码形式来实现这种功能,需要设计。
- 数据结构设计:需要设计适合存储设备信息的数据结构,如链表、数组或树等。这需要考虑到设备的属性和关系,以便实现方便的增删改查操作。
1.解决模块化问题时,运用模块化思想,将整个系统的功能分为多个板块,即:录入,输出(显示),查询,修改,删除以及主界面等6个板块,并使用不同函数来表示不同功能,使整个系统更加清晰。
2.为了实现主界面与各种功能的联系,我采用switch函数来实现。
3.关于数据结构的设计,我使用结构体数组与全局变量来完成,我先定义设备结构体包括设备id等等,然后定义全局变量devicecount来实现设备数量这一数据的共享。
3总体设计
3.1 模块设计
重庆城市科技大学实验设备管理系统总共分为六大模块,分别为录入,输出,查询,修改,删除以及主界面,系统功能结构图如图3.1。

图3.1 重庆城市科技大学实验设备管理系统功能结构图
3.2 数据存储设计
针对数据存储的设计,可以使用链表,结构体,数组,树,图,队列以及栈,但我能熟练使用的使结构体和数组,所以在实现重庆城市科技大学实验设备管理系统的数据存储设计时,我采用了结构体和数组的方式来存储数据,具体如下:
首先,定义了一个结构体Device,用来储存设备信息,包含了设备的名称、ID和类型。然后定义了一个全局变量devices(Device数组),它可以存储多个设备的信息,当然我设置的“多个”的上限为100个,即MAXSHEBEI = 100。又因为这个系统要存储已经录入设备的信息,所以需要另外一个全局变量numDevice来存储已录入的设备信息
4系统实现
4.1 开发环境
开发工具: vscode
开发语言: C语言
开发平台:Windows 11
数据库:
4.2 录入设备模块功能设计及实现
这是对实验设备进行录入的模块功能设计,该模块的程序流程图如图4.1。

图4.1录入功能流程图
录入功能难点在于存储录入的设备信息,运用数组和结构体可以实现存储,同时也可以使信息共享。
4.3 输出设备模块功能设计及实现
输出设备功能,即将录入模块中存储的数据输出出来,该模块的程序流程图如图4.3。

图4.3 输出设备模块流程图
输出功能较为简单,重点在于使用for循环来遍历数组,找寻录入模块的信息,并使其依次打印出来
查询设备的功能带入找东西的思维,首先需要设定一个锚点found,我们可以通过输入关键字来进行匹配,再通过for循环遍历设备列表查询,使用strstr函数来实现输入的关键字与锚点的配对,配对成功则输出设备信息,失败则输出未找到匹配设备,流程图如图4.13。

图4.13 查询设备模块流程图
与查询功能模块相似,修改设备模板也需要使用for循环遍历设备列表来找到要修改的设备,再对设备信息进行修改。该模块的程序流程图如图4.14

图4.14 修改设备模块流程图
与修改设备模块相似,只需将修改部分的代码修改为删除的代码即可,其中删除的代码思路为:遍历设备列表找到要删除的设备,找到后则让要删除设备后面的设备依次向前移动一个位置,使删除设备的信息被其后面的设备覆盖,达到删除效果。
模块代码如下:
//删除功能函数
void deleteDevice() {
int deviceId;
printf("请输入要删除的设备编号:");
scanf("%d", &deviceId);
int i,found = 0;
for (i = 0; i < numDevices; i++) {
if (devices[i].id == deviceId) {
for (int j=i; j < numDevices-1; j++) {
devices[j] = devices[j + 1];
}
numDevices--;
printf("设备删除成功!\n");
found = 1;
break;
}//同样遍历设备列表找到要删除的设备
//找到后则让要删除设备后面的设备依次向前移动一个位置,使删除设备的信息被其后面的设备覆盖,达到删除效果
}
if (!found) {
printf("未找到匹配的设备!\n");
}
}
4.7 主用户界面模块设计及实现
主用户界面模块需要将前面5个功能模块连在一起,可用switch函数来进行设计,代码如下:
//主界面主函数
int main() {
int choice;
//进入一个无限循环,直到用户选择退出操作。
//用户主界面
while (1) {
printf("****************** 重大城科实验设备管理系统 ******************\n");
printf(" 请选择操作:\n");
printf(" 1. 设备录入\n");
printf(" 2. 设备输出\n");
printf(" 3. 设备查询\n");
printf(" 4. 设备修改\n");
printf(" 5. 设备删除\n");
printf(" 0. 退出\n");
printf("***********************************************************\n");
printf("请输入操作编号:");
scanf("%d", &choice);
//通过switch函数实现增删改查
switch (choice) {
case 1:
addDevice();
break;
case 2:
printDevices();
break;
case 3:
searchDevice();
break;
case 4:
modifyDevice();
break;
case 5:
deleteDevice();
break;
case 0:
printf("感谢使用!\n");
break;
default:
printf("无效的操作编号!\n");
break;//使操作者的输入选项固定在0~5之间
}
printf("\n");
}
return 0;
}
5系统测试
5.1 测试内容

5.2 测试结果




6小结
6.1 程序实现小结
通过本次对实验设备管理系统的程序设计,我基本实现了该系统的目标功能,也强化了自身模块化思维的掌握,同时也巩固了结构体,数组以及函数等C语言知识。而通过编写该系统,也使我对于程序设计有了更深的体验,包括思考代码的编写思路,逻辑等。
6.2 尚未解决的问题及下一步工作思路
问题:
对于程序的问题,此次编写程序时,在数据存储设计方面,对于链表的实际运用不理解,从而使用结构体和数组来解决,也时在存储数据的代码编写过程中浪费了很多精力,所以对于链表的掌握需要加紧。
此次在实现程序的过程中,对于我在自己来说,面对代码的编写还有许多的知识漏洞,即使思考出了功能的实现逻辑,也没有足够的程序知识来支撑,导致编写程序的过程中,问题频发,不得不借用网络去查找对应的知识点,这也是面对一个简单的程序设计,却需要我用很多的时间来完成。
下一步:
通过自学完成对链表的了解,掌握,运用,之后通过链表的方式再一次实现该系统程序。
附 录
程序完整代码:
#include <stdio.h>
#include <string.h>
#define MAXSHEBEI 100//定义一个常量用来表示设备的最大数量
struct Device {
char name[50];
int id;
char type[20];
};//定义一个结构体Device,用来储存设备信息,它包含了设备的名称、ID和类型。
struct Device devices[MAXSHEBEI];//接着定义一个全局变量devices,用于存储多个设备的信息。
int numDevices = 0;//全局变量,用于记录当前已经存储的设备数量。
//录入功能函数
void addDevice() {
if (numDevices >= MAXSHEBEI) {
printf("设备数量已达上限!\n");
return;
}//防止录入设备过多,先检查设备的录入数量是否已经达到最大数量,即MAXSHEBEI的定义值
struct Device newDevice;//定义结构体变量newDevice来存储设备信息
printf("请输入设备名称:");
scanf("%s", newDevice.name);
printf("请输入设备编号:");
scanf("%d", &newDevice.id);
printf("请输入设备类型:");
scanf("%s", newDevice.type);
//将输入信息存储到newDevice中
devices[numDevices] = newDevice;
numDevices++;
//将newDevice添加到 devices数组中的第numDevices个位置,并将numDevices加1,表示设备数量增加了一个。
printf("设备录入成功!\n");
}
//输出功能函数
void printDevices() {
if (numDevices == 0) {
printf("暂无设备信息!\n");
return;
}//用于表示没有设备信息时的情况
int i;
printf("设备列表:\n");
for (i = 0; i < numDevices; i++) {
printf("设备名称:%s\n", devices[i].name);
printf("设备编号:%d\n", devices[i].id);
printf("设备类型:%s\n", devices[i].type);
printf("--\n");
}//使用一个for循环来遍历设备数组。对于每个设备,会依次打印设备名称、设备编号和设备类型。
}
//查询功能函数
void searchDevice() {
char keyword[50];
//定义数组用来存储输入的关键字
printf("请输入要查询的关键字:");
scanf("%s", keyword);
int i,found = 0;//定义一个变量来作为查找到关键字的定位
for ( i = 0; i < numDevices; i++) {
if (strstr(devices[i].name, keyword) != NULL || strstr(devices[i].type, keyword) != NULL)
//函数返回子串在字符串中第一次出现的位置,如果找不到则返回NULL。
{
printf("设备名称:%s\n", devices[i].name);
printf("设备编号:%d\n", devices[i].id);
printf("设备类型:%s\n", devices[i].type);
printf("--\n");
found = 1;
}//strstr函数:一个字符串处理函数,用于在一个字符串中查找指定子串的位置
//函数代码用法:char *strstr(const char *haystack, const char *needle);
//其中haystack是要被搜索的字符串,needle是要搜索的子串。
//该函数的实现原理是通过遍历字符串中的每个字符,逐个与子串进行比较。
//当找到子串的第一个字符匹配时,继续比较后续字符是否完全匹配。
//如果匹配成功,则返回子串在字符串中的位置。
}//遍历设备列表
if (!found) {
printf("未找到匹配的设备!\n");
}
}
//修改功能函数
void modifyDevice() {
int deviceId;
printf("请输入要修改的设备编号:");
scanf("%d", &deviceId);//先输入要修改的设备
int i,found = 0;
for (i = 0; i < numDevices; i++) {
if (devices[i].id == deviceId) {
printf("请输入新的设备名称:");
scanf("%s", devices[i].name);
printf("请输入新的设备类型:");
scanf("%s", devices[i].type);
printf("设备修改成功!\n");
found = 1;//查找并修改成功的标识
break;
}
}//遍历设备列表来查找要修改的设备
if (!found) {
printf("未找到匹配的设备!\n");
}
}
//删除功能函数
void deleteDevice() {
int deviceId;
printf("请输入要删除的设备编号:");
scanf("%d", &deviceId);
int i,found = 0;
for (i = 0; i < numDevices; i++) {
if (devices[i].id == deviceId) {
for (int j=i; j < numDevices-1; j++) {
devices[j] = devices[j + 1];
}
numDevices--;
printf("设备删除成功!\n");
found = 1;
break;
}//同样遍历设备列表找到要删除的设备
//找到后则让要删除设备后面的设备依次向前移动一个位置,使删除设备的信息被其后面的设备覆盖,达到删除效果
}
if (!found) {
printf("未找到匹配的设备!\n");
}
}
//主界面主函数
int main() {
int choice;
//进入一个无限循环,直到用户选择退出操作。
//用户主界面
while (1) {
printf("****************** 重大城科实验设备管理系统 ******************\n");
printf(" 请选择操作:\n");
printf(" 1. 设备录入\n");
printf(" 2. 设备输出\n");
printf(" 3. 设备查询\n");
printf(" 4. 设备修改\n");
printf(" 5. 设备删除\n");
printf(" 0. 退出\n");
printf("***********************************************************\n");
printf("请输入操作编号:");
scanf("%d", &choice);
//通过switch函数实现增删改查
switch (choice) {
case 1:
addDevice();
break;
case 2:
printDevices();
break;
case 3:
searchDevice();
break;
case 4:
modifyDevice();
break;
case 5:
deleteDevice();
break;
case 0:
printf("感谢使用!\n");
break;
default:
printf("无效的操作编号!\n");
break;//使操作者的输入选项固定在0~5之间
}
printf("\n");
}
return 0;
}
本文详细描述了一款实验设备管理系统的设计过程,包括需求分析、模块划分(录入、输出、查询、修改、删除和主界面)、数据结构选择(结构体和数组)、以及各功能模块的详细实现,使用C语言在Windows11环境下完成,通过案例展示了如何解决模块化、用户界面设计和数据存储等问题。
&spm=1001.2101.3001.5002&articleId=136754291&d=1&t=3&u=cec2f63374c64fd999838dd80cb36803)
3679

被折叠的 条评论
为什么被折叠?



