课程设计 | 教学设备管理系统

news2024/12/30 2:28:15

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、功能介绍

1.1 查看设备信息

1.2 显示记录

1.3 修改设备信息

1.4 查找设备信息

1.5 删除设备信息

1.6 恢复设备信息

1.7 添加设备信息

1.8 统计设备信息

1.9 保存数据文件

1.10 打开数据文件

二、设计思路

2.1 数据的存储

2.2 数据的写入

2.3 数据的读取

2.4 程序流程图

三、主要功能

3.1 查看设备信息

3.2 显示记录

3.3 修改设备信息

3.4 查找设备信息

3.5 删除设备信息

3.6 恢复设备信息

3.7 添加设备信息

3.8 统计设备信息

3.9 保存数据文件

3.10 打开数据文件

四、总结


本篇文章主要针对想学习 C 语言或者想提升 C 语言实践能力的同学,当然,如果你需要一份这样的课程设计那这正合适,下面就来详细讲解 C 语言教学设备管理系统。

一、功能介绍

教学设备管理系统的主界面如下所示。

图1 主界面

 教学设备管理系统有 10 个主要功能,如下所示:

1.1 查看设备信息

显示所有存储设备的详细信息,包括:设备号、设备名称、产地、购置日期、台数、单价、金额等。

1.2 显示记录

显示记录可以选择根据具体记录进行显示或者根据设备号进行显示。

1.3 修改设备信息

根据设备号查询具体设备,可以修改对应设备的设备号、设备名称、产地、购置日期、台数、单价、金额等。

1.4 查找设备信息

可以根据设备编号、设备名称、产地、购置日期、台数、单价、金额等进行查询设备。

1.5 删除设备信息

根据设备编号进行设备的删除。

1.6 恢复设备信息

根据设备编号进行设备的恢复。

1.7 添加设备信息

输入设备的设备号、设备名称、产地、购置日期、台数、单价、金额等进行添加。

1.8 统计设备信息

可以根据所有设备的总价值、设备总台数及总金额或按字符表打印教学设备进行统计。

1.9 保存数据文件

将数据保存到文件中。

1.10 打开数据文件

从数据文件中读取数据。

二、设计思路

2.1 数据的存储

数据通过如下结构进行存储。

struct Array
{   //设备编号    设备名称   产地         购置日期         台数        单价           金额        备注
    char ano[20], aname[20], origin_place[20], buy_time[20], aamount[20], unit_price[20], aprice[20], remark[20];
    int del;       //判断是否删除,值为0为未删除,1为已删除。恢复是把1改为0
} a[SIZE];

其中,通过字符串数组 ano、aname、origin_place、buy_time、aamount、uint_price、aprice、remark 分别存储设备编号、设备名称、产地、购置日期、台数、单价、金额以及备注。

del 表示设备是否被删除。

2.2 数据的写入

数据写入文件通过自定义的 write 函数来实现,如下所示。

void write()
{
    Print_Start();
    Print_Space(60, "保存数据文件\n\n\n");
    FILE *fp=fopen("infor.txt","w+");
    if(fp == NULL){
        printf("open infor.txt error\n");
        getchar();
        getchar();
        return;
    }
    int i;
    for (i = 0; i < No; i++)
        fwrite(&a[i],sizeof(struct Array),1,fp);
    fclose(fp);
    Print_Space(60, "成功保存数据\n\n\n");
    getchar();
    getchar();
}

通过系统函数 fopen 获得文件句柄 fp,将数组 a 中的数据存储到文件 infor.txt 中。 

2.3 数据的读取

读取数据通过自定义的函数 read 来实现,如下所示。

//读取内容
void read()
{
    Print_Start();
    Print_Space(60, "读入数据\n\n\n");
    No = 0;
    FILE *fp = fopen("infor.txt","r+");            //读写功能
	if(fp == NULL){
		fp = fopen("infor.txt","w+");              //若没有则创建一个txt
		fclose(fp);
	}
    int i;
    for(i = 0; !feof(fp); i++)
    {
    	fread(&a[i],sizeof(struct Array),1,fp);      //一次读取一个
    	No++;
	}
	No = No-1;
	Print_Space(58, "成功读入数据!\n\n\n");
	Print_Space(5, "输入任意键返回主菜单: ");
	getchar();
	getchar();
    fclose(fp);
}

和写入数据一样,通过系统函数 fopen 获取文件句柄 fp,将文件 infor.txt 中的数据读取到结构 a 中。

2.4 程序流程图

程序的主要流程图如下所示。

图1 流程图

三、主要功能

下面对教学设备管理系统主要功能进行介绍。

3.1 查看设备信息

显示所有存储设备的详细信息,包括:设备号、设备名称、产地、购置日期、台数、单价、金额等。

void chec()
{
    Print_Start();
    Print_Space(60, "查看设备信息\n\n\n");
	int i;
    printf("      设备号              设备名称            产地            购置日期                台数                单价              金额                备注\n\n");
	printf("\n");
	for(i=0;i<No;i++)
	{
		if(a[i].del == 0)
			printf("%8s%20s%20s%20s%20s%20s%20s%20s\n",a[i].ano,a[i].aname,a[i].origin_place,a[i].buy_time,a[i].aamount,a[i].unit_price,a[i].aprice,a[i].remark);
	}
	printf("\n\n");
	Print_Space(5, "输入任意键返回主菜单 :");
	getchar();
	getchar();
	menu();
}

如上所示,打印所有设备的信息,排除已经删除的设备。 运行界面如下所示。

图2 查看设备信息

3.2 显示记录

显示记录可以选择根据具体记录进行显示或者根据设备号进行显示。

//显示设备信息
void Display()
{
    Print_Start();
    Print_Space(50, "显示记录\n\n\n");
    int space = 39;
    Print_Space(space, "1.  根据具体记录进行显示\n");
    Print_Space(space, "2.  根据设备号进行显示\n");
    Print_Space(10, "请输入:");
    int choose;
    scanf("%d", &choose);
    if(choose == 1){
        Display_Record();
        Return_Confirm(Display);
    }else if(choose == 2){
        Display_Id();
        Return_Confirm(Display);
    }
}

根据用户选择显示设备信息。 运行界面如下所示。

图3 显示记录

3.3 修改设备信息

根据设备号查询具体设备,可以修改对应设备的设备号、设备名称、产地、购置日期、台数、单价、金额等,运行界面如下所示。

图4 修改设备信息

3.4 查找设备信息

可以根据设备编号、设备名称、产地、购置日期、台数、单价、金额等进行查询设备。

//查找记录
void Find()
{
    Print_Start();
    Print_Space(60, "查找记录\n\n\n");
    //char ano[20], aname[20], origin_place[20], buy_time[20], aamount[20], unit_price[20], aprice[20];
    int space = 39;
    Print_Space(space, "1.  设备编号\n");
    Print_Space(space, "2.  设备名称\n");
    Print_Space(space, "3.  产地\n");
    Print_Space(space, "4.  购置日期\n");
    Print_Space(space, "5.  台数\n");
    Print_Space(space, "6.  单价\n");
    Print_Space(space, "7.  金额\n");
    Print_Space(space, "8.  备注\n");
    Print_Space(10, "请输入编号: ");
    int choose;
    scanf("%d", &choose);
    Print_Space(10, "请输入要查找的内容: ");
    char s[100];
    scanf("%s", s);
    //设备编号    设备名称   产地         购置日期         台数        单价           金额
    printf("      设备号              设备名称            产地            购置日期                台数                单价              金额                备注\n\n");
    //printf("      设备号              设备名称            领用人              所属部门            数量                购买时间            价格\n\n");
    bool flag = false;
    int i, m = 0;
    for(i = 0; i < No; i++)
    {
        if(a[i].del == 0){
            flag = Judge(s, a[i], choose);
            if(flag) {
                m++;
                printf("%8s%20s%20s%20s%20s%20s%20s%20s\n",a[i].ano,a[i].aname,a[i].origin_place,a[i].buy_time,a[i].aamount,a[i].unit_price,a[i].aprice,a[i].remark);
            }
        }
    }
    if(m > 0){
        Print_Space(62, "查找成功!\n\n");
    }else {
        Print_Space(58, "查找失败,并不存在此设备!\n\n");
    }
    printf("\n\n");
    Return_Confirm(Find);
}

运行界面如下所示。 

图5 查找设备信息

3.5 删除设备信息

根据设备编号进行设备的删除。

//删除设备信息,是按照设备号来删除设备的
void del()
{
    Print_Start();
    Print_Space(50, "删除设备信息\n\n");
	char ch[20], s;
	int i;
    printf("      设备号              设备名称            产地            购置日期                台数                单价              金额                备注\n\n");
	//printf("序号               设备号            设备名称              领用人            所属部门                数量            购买时间                价格\n");
	for(i = 0; i < No; i++)
	{
		if(a[i].del == 0)
			printf("%8s%20s%20s%20s%20s%20s%20s%20s\n",a[i].ano,a[i].aname,a[i].origin_place,a[i].buy_time,a[i].aamount,a[i].unit_price,a[i].aprice,a[i].remark);
	}
	printf("请输入要删除的设备编号:(0键返回菜单栏)  ");
	while (1)
	{
		scanf("%s", ch);
		i = atoi(ch);
		if (i >= 1 && i <= No)
			break;
		else if(i == 0)
			return;
		else puts("信息有误!请检查后重新输入\n");
	}
	//a[i-1].del = 1;
	for(i = 0; i < No; i++)
	{
		if(!strcmp(ch, a[i].ano)){
            a[i].del = 1;
            break;
		}
	}
	printf("是否继续删除?(Y/N)(不区分大小写)");
	while (1)
	{
		getchar();
		gets(&s);
		if (s=='Y'||s=='N'||s=='y'||s=='n')
			break;
		else puts("信息有误!请检查后重新输入\n");
	}
	if(s=='Y'||s=='y')
		del();
	else if(s=='N'||s=='n')
		system("cls");
	menu();
}

运行界面如下所示。

图6 删除设备信息

3.6 恢复设备信息

根据设备编号进行设备的恢复。

//恢复信息
void restore()
{
    Print_Start();
    Print_Space(60, "恢复信息\n\n\n");
    Print_Space(60, "已经删除的设备信息\n\n\n");
    printf("      设备号              设备名称            产地            购置日期                台数                单价              金额                备注\n\n");
    //printf("      设备号              设备名称            领用人              所属部门            数量                购买时间            价格\n\n");
    //显示已经删除的设备信息
    int i;
    for(i = 0; i < No; i++)
    {
        if(a[i].del == 1)
            printf("%8s%20s%20s%20s%20s%20s%20s%20s\n",a[i].ano,a[i].aname,a[i].origin_place,a[i].buy_time,a[i].aamount,a[i].unit_price,a[i].aprice,a[i].remark);
    }
    printf("\n\n");
    Print_Space(5, "请输入设备号 :  ");
    char choose[20];
    scanf("%s", choose);
    //寻找对应的设备
    bool flag = false;
    for(i = 0; i < No; i++){
        if(!strcmp(a[i].ano, choose)){
            a[i].del = 0;
            flag = true;
            break;
        }
    }
    if(flag){
        Print_Space(60, "恢复信息成功!\n");
    }
    Return_Confirm(restore);
}

 运行界面如下所示。

图 7 恢复设备信息

3.7 添加设备信息

输入设备的设备号、设备名称、产地、购置日期、台数、单价、金额等进行添加。运行界面如下所示。

图8 添加设备信息

3.8 统计设备信息

可以根据所有设备的总价值、设备总台数及总金额或按字符表打印教学设备进行统计。运行界面如下所示。

图9 统计设备信息

3.9 保存数据文件

将数据保存到文件中。

void write()
{
    Print_Start();
    Print_Space(60, "保存数据文件\n\n\n");
    FILE *fp=fopen("infor.txt","w+");
    if(fp == NULL){
        printf("open infor.txt error\n");
        getchar();
        getchar();
        return;
    }
    int i;
    for (i = 0; i < No; i++)
        fwrite(&a[i],sizeof(struct Array),1,fp);
    fclose(fp);
    Print_Space(60, "成功保存数据\n\n\n");
    getchar();
    getchar();
}

3.10 打开数据文件

从数据文件中读取数据。

//读取内容
void read()
{
    Print_Start();
    Print_Space(60, "读入数据\n\n\n");
    No = 0;
    FILE *fp = fopen("infor.txt","r+");            //读写功能
	if(fp == NULL){
		fp = fopen("infor.txt","w+");              //若没有则创建一个txt
		fclose(fp);
	}
    int i;
    for(i = 0; !feof(fp); i++)
    {
    	fread(&a[i],sizeof(struct Array),1,fp);      //一次读取一个
    	No++;
	}
	No = No-1;
	Print_Space(58, "成功读入数据!\n\n\n");
	Print_Space(5, "输入任意键返回主菜单: ");
	getchar();
	getchar();
    fclose(fp);
}

四、总结

在上面的 C 语言教学设备管理系统中,主要有两部分,界面的显示和各个功能的实现,根据用户的选择执行对应的功能即可。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud微服务(二)——Eureka服务注册中心

Eureka服务注册中心 SpringCloud组件&#xff0c;Eureka已停更。 内容简介 1、Eureka是什么 Eureka 是 Netflix 开发的&#xff0c;一个基于 REST 服务的&#xff0c;服务注册与发现的组件&#xff0c;以实现中间层服务器的负载平衡和故障转移。服务注册&#xff1a;将服务…

[杂记]算法: 单调栈

0. 引言 单调栈, 顾名思义就是从栈底到栈顶元素单调递增或者单调递减的栈. 往往, 我们在解决寻找一个元素前面/后面的最远/最近处满足某条件的另一个元素的时候可以用到单调栈. 也是用两道算法题作为例子. 在这之前, 先简单写一下构造单调栈的模板. 如果我们需要从一个数组中…

ES6 入门教程 18 Iterator 和 for...of 循环 18.7 for...of 循环

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程18 Iterator 和 for...of 循环18.7 for...of 循环18.7.1 数组18.7.2 Set 和 Map 结构18.7.3 计算生成的数据结构18.7.4 类似…

供应叶酸PEG试剂Folic acid-PEG-Azide,FA-PEG-N3,叶酸-聚乙二醇-叠氮

1、名称 英文&#xff1a;Folic acid-PEG-Azide&#xff0c;FA-PEG-N3 中文&#xff1a;叶酸-聚乙二醇-叠氮 2、CAS编号&#xff1a;N/A 3、所属分类&#xff1a;Azide PEG Folic acid&#xff08;FA&#xff09; PEG 4、分子量&#xff1a;可定制&#xff0c;FA-PEG-N3 5…

Web安全之CTF测试赛

Web安全之CTF测试赛 1.000-我是谁 题目描述&#xff1a; 找到诈骗网站bsde.cn的域名注册人及邮箱&#xff0c;将域名注册人的126邮箱填写到下方答案框并点击送出 考察点&#xff1a;whois查询 whois查询网址&#xff1a; https://x.threatbook.com/ //微步在线 http://wh…

ES6 入门教程 17 Promise 对象 17.11 Promise.reject() 17.12 应用 17.13 Promise.try()

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程17 Promise 对象17.11 Promise.reject()17.12 应用17.12.1 加载图片17.12.2 Generator 函数与 Promise 的结合17.13 Promise…

ES6 入门教程 15 Proxy 15.2 Proxy 实例的方法 15.2.2 set() 15.2.3 apply()

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程15 Proxy15.2 Proxy 实例的方法15.2.2 set()15.2.3 apply()15 Proxy 15.2 Proxy 实例的方法 拦截方法的详细介绍。 15.2.…

【附源码】Python计算机毕业设计天润律师事务所管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

〖全域运营实战白宝书 - 运营角色认知篇③〗- 运营的底层逻辑是什么?

大家好&#xff0c;我是 哈士奇 &#xff0c;一位工作了十年的"技术混子"&#xff0c; 致力于为开发者赋能的UP主, 目前正在运营着 TFS_CLUB社区。 &#x1f4ac; 人生格言&#xff1a;优于别人,并不高贵,真正的高贵应该是优于过去的自己。&#x1f4ac; &#x1f4e…

【笔试题】【day24】

文章目录第一题&#xff08;完全二叉树的最多结点个数&#xff09;第二题&#xff08;哈夫曼树的带权路径长度&#xff09;第三题&#xff08;堆的重建&#xff09;第四题&#xff08;哈希映射的冲突&#xff09;第一题&#xff08;完全二叉树的最多结点个数&#xff09; 一棵…

UE4 几种蓝图通信的方法

根据视频&#xff08;UE4 几种蓝图通讯的方法&#xff09;所做笔记 目录 方法一&#xff1a;通过公有变量 方法二&#xff1a;通过“获取类的所有actor”节点 方法三&#xff1a;通过蓝图接口 关卡蓝图与蓝图通信 方法一&#xff1a;通过公有变量 步骤&#xff1a; 1.新建…

一款php开发的非常好的OA办公管理系统源码

一款基于TP5 HAdmin Mysql打造的简单实用的开源的企业办公系统框架。可以帮助解决企业办公项目60的重复工作&#xff0c;让开发更多关注业务逻辑。既能快速提高开发效率&#xff0c;帮助公司节省人力成本&#xff0c;同时又不失灵活性。使用本系统可以简单快速地开发出企业级的…

如何将 MATLAB 源代码导出成 Java 的 JAR 包

文章目录编写 MATLAB 源文件安装 Java制作 JAR 包找到 MATLAB 的 JAR 包运行环境&#xff1a; MATLAB R2022a Java 8&#xff08;1.8.0_311&#xff09; Windows 10 教育版 64位 使用混合编程通常都不是好主意&#xff0c;但是有时候会遇到极端的情况。Java 擅长网络编程&am…

vivo霍金实验平台设计与实践-平台产品系列02

vivo 互联网平台产品研发团队 - Bao Dawei 本篇介绍了vivo霍金实验平台的系统架构以及业务发展过程中遇到的问题以及对应的解决方案。 《平台产品》系列文章&#xff1a; 1.vivo平台化实践探索之旅-平台产品系列01 一、前言 互联网企业经历过野蛮生长的开拓红利期之后&#xf…

UE4 TCP通信 (UE客户端与网络调试助手服务端、python服务端通信)

目录 一、使用UE4建立TCP客户端 二、使用网络调试助手建立服务端 三、基于网络调试助手的服务端与UE客户端通信 四、基于python的TCP服务端与UE客户端通信 一、使用UE4建立TCP客户端 1.在虚幻商城中搜索socket来下载TCP Socket Plugin插件 2.安装到引擎&#xff0c;目前…

面向对象分析与设计_类图

判断题 类与对象之间的关系&#xff0c;可以理解为模板与具体实例之间的关系 T 类是现实世界中客观存在的事物或实体。 F 类是具有相同属性和服务的一组对象的集合 T 对象的属性都有值&#xff0c;类的属性没有值 T 类的可见性描述了其属性和操作是否对于其他类可见&…

PHPer 开始使用 Java

出于工作需要&#xff0c;新项目要开始使用 Java 进行开发&#xff0c;注意力就要从 PHP 转移到 Java 上来。个人觉得这是一个挺好的机会&#xff0c;能接触被广泛使用的另一种开发语言和生态。 虽说语言之间存在许多相似之处&#xff0c;但真正落地的过程肯定会存在不少的曲折…

类加载与类文件结构

文章目录类加载机制为什么需要类加载类加载的时机类加载详细过程加载链接初始化类加载器类加载器的分类Java虚拟机自带的类加载器用户自定义类加载器ClassLoader的使用说明双亲委派机制沙箱安全机制类文件的结构类加载机制 为什么需要类加载 首先我们计算机的主要组成是输入设…

ES6 入门教程 15 Proxy 15.2 Proxy 实例的方法 15.2.10 ownKeys() ~ 15.2.12 setPrototypeOf()

ES6 入门教程 ECMAScript 6 入门 作者&#xff1a;阮一峰 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录ES6 入门教程15 Proxy15.2 Proxy 实例的方法15.2.10 ownKeys()15.2.11 preventExtensions()15.2.12 setPrototypeOf()15 Proxy 15.2 Pro…

算法题:SOJ1092: 欧几里得算法

一、BackGroud 在RSA密码体系中,欧几里得算法是加密或解密运算的重要组成部分。它的基本运算过程就是解 x*a1(mod n) 这种方程。 二、The Problem 整个解的过程是这样的&#xff0c;我们用一个例子来说明。 当a&#xff1d;1001 &#xff0c;n&#xff1d;3837时 方程为 x *…