C语言实现设备管理系统:源码解析与逻辑梳理
利用C语言结构体与文件IO操作,构建一个具备设备信息增删改查及统计功能的终端管理系统,适合初学者理解数据结构与内存管理的实际应用。
系统设计目标
本系统旨在解决部门级设备信息管理问题,支持对同一部门购买的相同设备进行合并记录。核心需求包括:
- 持久化存储:建立本地文件保存设备数据,确保程序重启后数据不丢失。
- 基础CRUD操作:提供新增、修改、删除、查找设备信息的接口。
- 统计分析:能够统计设备总价值或按部门/状态分类汇总数量。
数据结构设计
系统采用 struct 定义单条设备记录,包含以下关键字段:
devno(char[]): 设备唯一编号。devsort(int): 所属部门标识(1-A部门, 2-B部门, 3-C部门)。devmaster(char[]): 当前领用人姓名。devname(char[]): 设备通用名称。devprice(int): 单价。devbuydate(char[]): 购买日期。devstate(int): 运行状态(1-在用, 0-报废)。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语言数据结构与系统设计的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









