C语言实现设备管理系统:源码解析与逻辑梳理

七月
七月
发布时间:2026-10-16| 6人浏览过
原创

利用C语言结构体与文件IO操作,构建一个具备设备信息增删改查及统计功能的终端管理系统,适合初学者理解数据结构与内存管理的实际应用。

系统设计目标

本系统旨在解决部门级设备信息管理问题,支持对同一部门购买的相同设备进行合并记录。核心需求包括:

  • 持久化存储:建立本地文件保存设备数据,确保程序重启后数据不丢失。
  • 基础CRUD操作:提供新增、修改、删除、查找设备信息的接口。
  • 统计分析:能够统计设备总价值或按部门/状态分类汇总数量。

数据结构设计

系统采用 struct 定义单条设备记录,包含以下关键字段:

  1. devno (char[]): 设备唯一编号。
  2. devsort (int): 所属部门标识(1-A部门, 2-B部门, 3-C部门)。
  3. devmaster (char[]): 当前领用人姓名。
  4. devname (char[]): 设备通用名称。
  5. devprice (int): 单价。
  6. devbuydate (char[]): 购买日期。
  7. devstate (int): 运行状态(1-在用, 0-报废)。
  8. devdonenumber (char[]): 数量描述(注:原代码此处为字符串,实际业务建议改为 int)。

所有记录集中存放在一个全局数组 dev[COUNT] 中,并通过 count 变量追踪当前有效条目数。

核心功能模块实现

第1步:菜单交互与流程控制

目的:为用户提供清晰的操作入口并处理退出逻辑。

主循环中调用 start() 函数打印菜单,根据用户输入的 chi 值分发至具体功能函数。输入非法选项时提示错误,输入 6 则调用 exit(0) 终止进程。

第2步:设备信息录入 (input())

目的:批量采集新设备数据并存入内存数组。

通过 do-while 循环让用户连续录入。录入时需依次获取编号、部门、领用人、名称、价格、日期、状态和数量。
完成录入后,会自动触发 save() 将内存数据刷入文件,并调用 output() 预览当前库存。

第3步:数据保存机制 (save())

目的:实现内存到磁盘的持久化。

以二进制写入模式 ("wb") 打开 shebei.txt。遍历数组,将 sizeof(struct information) 大小的数据块写入文件。
注意:原代码保存部分存在硬编码索引问题,实际使用中需修正为遍历整个 count 计数范围,否则可能漏存数据。

第4步:数据查询与修改 (search() & change())

目的:定位特定设备并进行字段更新或查看。

  • 查找:扫描数组,匹配 devname 若找到则打印详细信息。
  • 修改:同样先通过名称定位目标记录。确认后,逐项询问是否修改名称、领用人、编号、部门、价格等字段。修改成功后再次调用 save() 同步磁盘。

第5步:删除与统计 (dele() & sort())

目的:清理无效数据并生成报表。

  • 删除:通过名称找到目标索引 i,将后续元素依次前移覆盖,最后将 count--。此方法会导致数组出现“空洞”,下次读取需注意边界。
  • 统计:选择统计维度。可选统计报废设备总数(判断 devstate==0),或按部门编号(1/2/3)分别累加计数并输出结果。

第6步:整体架构概览

系统通过模块化函数设计,实现了从界面展示到底层数据操作的闭环。以下是各模块依赖关系的核心示意图:

代码实现细节

以下是完整的 C 语言源码实现,涵盖了上述所有功能的逻辑拼接:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define COUNT 30

void start(); 
void input();
void save();
void change();
void sort();
void dele();
void output();
void search();

struct information{
    char devno[30];            //编号 
    int devsort;               //所属部门 
    char devmaster[30];        // 领用人 
    char devname[30];          //设备名字 
    int devprice;              //设备价格 
    char devbuydate[30];       //购买日期 
    int devstate;              // 设备状态 
    char devdonenumber[30];    //设备数量

}dev[COUNT];                    //结构体变量 

int count=0;
FILE *fp;                     //文件指针 

main()   
{
    while(1)
    start(); 
}

void start()  //启动菜单
{
int chi;
 printf("                            设备管理系统\n");
 printf("            ********************************************\n");
 printf("            *           1.设备信息的录入:             *\n");         
 printf("            *           2.设备信息的修改:             *\n");
 printf("            *           3.设备信息的分类统计:         *\n");
 printf("            *           4.删除某个设备:               *\n");
 printf("            *           5.查找某个设备:               *\n");
 printf("            *           6.退出系统:                   *\n");
 printf("            ********************************************\n");
 printf("      >>*^_^*输入你的选择: ");
 scanf("%d",&chi);
 printf("\n");
 if(chi==1) input();
 else if(chi==2) change();
 else if(chi==3) sort();
 else if(chi==4) dele();
 else if(chi==5) search();
 else if(chi==6) { printf("谢谢使用,再见!*^_^*\n");  exit(0);}
 else {  printf(" You Enter The Choice Is Not valid ! \n");  }
}

void input() //数据录入
{
     
     char flag[20];
     do{
     printf("*^_^*请输入你的设备信息:\n");
     printf("设备编号:");
     scanf("%s",dev[count].devno);
     printf("所属部门(1,A部门  2,B部门  3,C部门):\");
     scanf("%d",&dev[count].devsort);
     printf("领用人;");
     scanf("%s",dev[count].devmaster); 
     printf("设备名字:");
     scanf("%s",dev[count].devname);
     printf("设备价格:");
     scanf("%d",&dev[count].devprice);
     printf("设备购买日期:");
     scanf("%s",dev[count].devbuydate);
     printf("设备状态(1未报废 0报废):\");
     scanf("%d",&dev[count].devstate);
     printf("设备数量:");
     scanf("%s",dev[count].devdonenumber);
     count++;
     printf("是否继续输入数据 y是  n否 : ");
     scanf("%s",flag);
     }while(strcmp(flag,"y")==0||strcmp(flag,"Y")==0);
     output();
     save();
}
void save()                           //数据保存     
{
    int i;
    FILE *fp;
    if((fp=fopen("shebei.txt","wb"))==NULL)
    {
        printf("cannot open file\n");
        return;
    }
    for(i=0;i<2;i++)
        if(fwrite(&dev[i],sizeof(struct information),1,fp)!=1)
            printf("file write error\n");
    fclose(fp);
    printf("已保存设备信息到文件中*^_^*\n");
}

void change()  //数据修改
{
     char ch[20],a[20];
      int i;
       printf("\nyou sure want change devInfor y/n): ");
        scanf("%s",ch);
        if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
    { printf("\nenter you want change devName:");
  scanf("%s",a);
  for(i=0;i<count;i++)
  {
   if(strcmp(dev[i].devname,a)==0)
   {  printf("\nyou sure want change dev name(y/n): ");
      scanf("%s",ch);
      if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\nname:"); scanf("%s",dev[i].devname);}
      printf("\nyou sure want change dev master(y/n): ");
      scanf("%s",ch);
      if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\nmaster:"); scanf("%s",dev[i].devmaster);}
      printf("\nyou sure want change dev no(y/n): ");
      scanf("%s",ch);
      if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\nno"); scanf("%s",dev[i].devno);}
      printf("\nyou sure want change dev sort(y/n): ");
      scanf("%s",ch);
      if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\nsort"); scanf("%d",&dev[i].devsort);}
      printf("\nyou sure want dev price(y/n): ");
      scanf("%s",ch);
      if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\nprice"); scanf("%d",&dev[i].devprice);}
      printf("\nyou sure want dev done date(y/n): ");
      scanf("%s",ch);
      if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)   { printf("\ndone date"); scanf("%s",dev[i].devdonenumber);}
   
}
    } 
   save();
    }
output();

}
void sort()  //数据分类显示
{ 
   int i,chi,sum=0,wei=0,da=0,sao=0;
 printf("输入你想要统计的信息: 1(报废的设备数目) 2(设备所属部门分类)");
 scanf("%d",&chi);
 if(chi==1) {
    for(i=0;i<count;i++) {
      if(dev[i].devstate==0) sum++;
    }
   printf("报废的设备数目为 %d \n",sum);
 }
 else if(chi==2){
  for(i=0;i<count;i++) {
     if(dev[i].devsort==1) wei++;
      else  if(dev[i].devsort==2) da++;
      else  if(dev[i].devsort==3) sao++; 
     } 
   printf("A部门数量为 %d  B部门数量为 %d C部门数量和为 %d",wei,da,sao);
 }else { printf("你输入的选项不符合要求!\n");}

}
void dele()  //数据删除
{
int i,j;
char c[20];
 printf("\nenter you want delete name :\n");
  printf("name:");
  scanf("%s",c);
  for(i=0;i<count;i++)
  if(strcmp(c,dev[i].devname)==0)  break;
   for(j=i;j<count-1;j++)
   dev[j]=dev[j+1];
   printf("\t\t\tyou had delete %s\n",c);
   count--;
 output();

}
void output()  //数据输出
{
   int i;
   for(i=0;i<count;i++)
   {
    printf("%s %d %s %s %d %s %d %s\n",dev[i].devno,dev[i].devsort,dev[i].devmaster,dev[i].devname,dev[i].devprice,dev[i].devbuydate,dev[i].devstate,dev[i].devdonenumber);
   
   }

}

void search()  //数据查找
{
int i;
char a[20],ch[10];
  printf("\nenter you want look name:");
  scanf("%s",a);
  for(i=0;i<count;i++)  
   if(strcmp(dev[i].devname,a)==0)  printf("%s %d %s %s %d %s %d %s\n",dev[i].devno,dev[i].devsort,dev[i].devmaster,dev[i].devname,dev[i].devprice,dev[i].devbuydate,dev[i].devstate,dev[i].devdonenumber);
}

注意事项与优化建议

在使用该源码进行二次开发或学习时,请注意以下潜在风险点:

  • 内存溢出风险:结构体数组大小固定为 30,当设备超过限制时程序将不再接受新录入,建议在入口处增加容量检查。
  • 输入安全:多处使用 scanf 直接读入字符串,若用户输入长度超过缓冲区(如 devname),可能导致越界。实际项目中应配合 gets_s 或指定长度的 scanf(如 %29s)。
  • 文件保存逻辑偏差:save() 函数中的循环条件写死为 <2,导致只保存了前两笔数据。修复方式是将循环上限改为当前变量 count。

以上就是C语言实现设备管理系统的详细内容,更多关于C语言数据结构与系统设计的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。