C语言结课设计——实验设备管理系统文档(附带代码)

本文详细描述了一款实验设备管理系统的设计过程,包括需求分析、模块划分(录入、输出、查询、修改、删除和主界面)、数据结构选择(结构体和数组)、以及各功能模块的详细实现,使用C语言在Windows11环境下完成,通过案例展示了如何解决模块化、用户界面设计和数据存储等问题。

目录

1 绪论

1.1 研究的目的及意义

面对日益增多的实验教学需求,古老的人工管理方式和人工预约方式受到了强烈的冲击,更加简便、清晰、规范的实验室管理系统也应运而生。 通过使用实验室管理系统实现高校实验室、实验仪器与实验耗材管理的规范化、信息化;提高实验教学特别是开放实验教学的管理水平与服务水平;为实验室评估、实验室建设及实验教学质量管理等决策提供数据支持;智能生成每学年教育部数据报表,协助高校轻而易举完成数据上报工作。

2需求分析

2.1 关键问题

在使用C语言完成实验设备管理系统时,因为需要实现增删改查的功能,所以在编写代码时遇到了以下的问题:

  1. 整个代码需要采用模块化的设计,所以在设计模块化系统时,需要合理划分各个模块,将功能相近的代码封装到一个模块中,但是在实际操作中,可能会遇到模块划分不清晰的问题。
  2. 代码设计中,用户主界面需要与其他功能相联系,从而实现通过用户界面快捷使用系统的功能,但用什么代码形式来实现这种功能,需要设计。
  3. 数据结构设计:需要设计适合存储设备信息的数据结构,如链表、数组或树等。这需要考虑到设备的属性和关系,以便实现方便的增删改查操作。

2.2 拟采用解决问题的方法

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循环来遍历数组,找寻录入模块的信息,并使其依次打印出来

4.4 查询设备模块设计及实现

查询设备的功能带入找东西的思维,首先需要设定一个锚点found,我们可以通过输入关键字来进行匹配,再通过for循环遍历设备列表查询,使用strstr函数来实现输入的关键字与锚点的配对,配对成功则输出设备信息,失败则输出未找到匹配设备,流程图如图4.13。

图4.13 查询设备模块流程图

4.5 修改设备模块设计及实现

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

图4.14 修改设备模块流程图

4.6 删除设备模块设计及实现

与修改设备模块相似,只需将修改部分的代码修改为删除的代码即可,其中删除的代码思路为:遍历设备列表找到要删除的设备,找到后则让要删除设备后面的设备依次向前移动一个位置,使删除设备的信息被其后面的设备覆盖,达到删除效果。

模块代码如下:

//删除功能函数
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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值