【期末课程设计】学生成绩管理系统

因其独特,因其始终如一
文章目录
一、学生成绩管理系统介绍
二、学生成绩管理系统设计思路
三、源代码
1. test.c
2. Student Management System.c
3.Stu_System.c
4.Teacher.c
5.Student Management System.h
前言:
学生成绩管理系统含教师登录入口和学生登录入口,可实现学生信息的添加,删除,查找,排名、保存等
一、学生成绩管理系统介绍
该项目分为5个文件,其中4个 .c源文件和1个 .h头文件
test.c 项目实现的整体框架及成绩管理系统的初始登录界面等
Student Management System.c 实现教师系统和学生系统的登录界面和系统成员数据的初始化
Stu_System.c 实现学生登录系统等相关功能
Teacher.c 实现老师登录系统等相关功能
Student Management System.h 存放项目中的各种头文件、#define 定义的常变量、函数、结构体的声明等
推荐使用集编译链接于一体的翻译环境
推荐环境:
Visual Studio 2017版及或更高、Dev-C++、Visual Studio Code等 C/C++编译器
学生成绩管理系统介绍
该成绩管理系统有两个登录入口,分为教师入口和学生入口。
一个学生的成绩信息包括:学生姓名,年龄、性别,学号,专业、成绩。
教师系统可以添加学生信息、删除学生信息、查询学生信息、查看学生总排名;学生系统可以查看所输入的学生的信息、排名等。教师每添加一个学生,在退出学生成绩管理系统后,程序会自动将学生信息以二进制文本的形式保存为一个txt文件,下次登录成绩管理系统时,程序会自动加载信息,教师也可以手动将某个或所有学生信息永久删除
学生成绩管理系统运行界面
二、学生成绩管理系统设计思路
首先要封装一个系统总界面,这个比较简单,只需要控制好间距,用printf即可实现,然后用 switch...case 语句来选择教师登录还是学生登录,并用do...while循环封装,保证该系统可以多次使用;在教师系统和学生系统中,也用类似的printf、switch...case选择语句加do...while循环来实现相应的选择功能。
其次是对学生系统进行初始化,为了节省内存,达到系统运行效率最大化,项目使用了动态内存管理的方法,初始化时先用动态内存函数开辟三个学生的空间,后面随着学生数量的增加,当系统空间被填满后,就再多开辟两个学生的空间,满了之后继续开辟,如此往复,每次只多开辟两个学生的空间。这里使用动态内存管理可以避免内存过度浪费。
接下来是老师录入信息,删除学生等。录入信息直接采用scanf函数即可,删除学生信息首先得找到这个学生,所以得单独再封装一个由学生姓名查找学生信息的函数,也方便后面查学生信息时使用,找到这个学生后,用这个学生个的下一个学生的数据覆盖它,然后用后面的进皆覆盖前面的信息,最后使学生人数减1即可,这里的覆盖使用memset函数完成即可。
还有对学生的成绩排名的功能,在教师系统和学生系统的排名处都要展示排名。因为学生信息在结构体中,所以推荐用 qsort快速排序函数完成,但需要将qsort函数由原来的升序改为降序。
最后就是学生信息的保存及加载。在整个项目的最后可以添加一个而进行写文件的语句,并将学生信息逐条通过rwrite函数循环写入文件中;而加载文件中的二进制学生信息则是在初始化学生信息的时候,单独封装一个读文件的函数,用来加载学生数据。读写文件都用二进制的方式是为了防止学生信息泄露。
三、源代码
1. test.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"void menu()
{printf("————————————————————————————————————————————————————————————————\n");printf(" 学生成绩管理系统 \n");printf("————————————————————————————————————————————————————————————————\n");printf(" 1.教师登录 2.学生登录 \n");printf(" 0.退出系统 \n");printf("————————————————————————————————————————————————————————————————\n");
}
int main()
{int input = 0;System Mge;Init_System(&Mge);int ret = 0;do{menu();printf("请选择:-> ");scanf("%d", &input);switch (input){case 1://进入教师系统Teacher_System(&Mge);break;case 2:Stu_System(&Mge);break;case 3:break;case 0:break;default:break;}} while (input);return 0;
}
2. Student Management System.c
#define _CRT_SECURE_NO_WARNINGS#include "Student Management System.h"
int Increase_Capacity2(System* Mge)//先判断是否够
{assert(Mge);if (Mge->sz == Mge->Max_Space){Stu* tmp = (Stu*)realloc(Mge->data, (Mge->Max_Space + Add_Connt) * sizeof(Stu));if (Mge->data == NULL){perror("realloc");return 1;}Mge->data = tmp;Mge->Max_Space += Add_Connt; /*printf("增容成功\n");*/return 0;}elsereturn 0;
}
void Load_Sy(System* Mge)
{assert(Mge);FILE* pf = fopen("data.txt", "rb");if (pf == NULL){return;}else{Stu tmp = { 0 };while (fread(&tmp, sizeof(Stu), 1, pf)){if (1 == Increase_Capacity2(Mge))return;//开辟失败else{Mge->data[Mge->sz] = tmp;Mge->sz +=1;}}}fclose(pf);pf = NULL;
}
void Menu_Teacher()
{printf("\n—————————— 教师系统 ————————————\n");printf(" 1.录入学生信息 2.删除学生信息 \n");printf(" 3.显示所有学生信息 4.查看排名 \n");printf(" 5.查询学生信息 6.一键删除所有学生信息 \n");printf(" 0.退出教师系统 \n");printf("————————————————————————————————————————————————————————————————\n");}
void Menu_Stu()
{printf("\n—————————— 学生系统 ————————————\n");printf(" 1.查看我的信息 \n");printf(" 0.退出学生系统 \n");printf("————————————————————————————————————————————————————————————————\n");
}
void Init_System(System* Mge)
{//初始化系统assert(Mge);Mge->data = (Stu*)malloc(Inti_Data * sizeof(Stu));//初始化三个学生的空间if (Mge->data == NULL){perror("malloc");return;}else{Mge->sz=0;Mge->Max_Space = Inti_Data;//加载通讯录Load_Sy(Mge);}
}
void Teacher_System(System* Mge)//教师系统
{assert(Mge);int input = 0;do {Menu_Teacher();printf("请选择:->");scanf("%d", &input);switch (input){case 1:Add_Stu(Mge);//增加学生信息break;case 2:Del_Stu(Mge);//删除学生信息break;case 3:Show_Stu(Mge);//打印break;case 4:Sort(Mge);//查看排名break;case 5:SearchStu(Mge);//查找学生break;case 6:Del_Exit(Mge);//删除所有信息break;case 0:De_System(Mge);break;default:printf("退出教师系统\n");break;}} while (input);
}void Stu_System(System* Mge)
{assert(Mge);int input = 0;do{Menu_Stu();printf("请选择:->");scanf("%d", &input);switch (input){case 1:View(Mge);break;case 0:break;default:printf("输入错误,请重新输入:");break;}} while (input);
}
3.Stu_System.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"
int FindName1(System* Mge, char* str1)
{int i = 0;for (i = 0; i < Mge->sz; i++){if (strcmp(str1, Mge->data[i].Name) == 0)return i;//找到了}return Mge->sz;
}
int Comper2(const void* p1, const void* p2)
{return(((Stu*)p2)->Garde-(((Stu*)p1)->Garde));
}
void View(System* Mge)
{assert(Mge);printf("请输入你的名字:->\n");char str1[10] = "0";scanf("%s",str1);qsort(&(Mge->data[0]), Mge->sz, sizeof(Stu), Comper2);int i=FindName1(Mge,str1);if (i == Mge->sz){printf("请检查你的信息是否正确或找老师查询信息是否录入\n");return;}else{printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s%5s\n","姓名", "年龄", "学号", "性别", "专业", "成绩", "排名");printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d%5d\n",Mge->data[i].Name,Mge->data[i].Age,Mge->data[i].Id,Mge->data[i].Sex,Mge->data[i].Pro,Mge->data[i].Garde,i+1);}}
4.Teacher.c
#define _CRT_SECURE_NO_WARNINGS
#include "Student Management System.h"int FindName(System* Mge,char*str1)
{assert(Mge && str1);int i = 0;for (i = 0; i < Mge->sz; i++){if (strcmp(str1, Mge->data[i].Name) == 0)return i;//找到了}return Mge->sz;
}
int Increase_Capacity(System* Mge)//先判断是否够
{assert(Mge);if (Mge->sz == Mge->Max_Space){Stu* tmp = (Stu*)realloc(Mge->data, (Mge->Max_Space + Add_Connt) * sizeof(Stu));if (Mge->data == NULL){perror("realloc");return 1;}Mge->data = tmp;Mge->Max_Space += Add_Connt; /*printf("增容成功\n");*/return 0;}elsereturn 0;
}
void Add_Stu(System* Mge)//录入学生信息
{assert(Mge);int z = Increase_Capacity(Mge);if (z == 1)printf("增容失败\n");else//不用增容{printf("请输入姓名:\n");scanf("%s", Mge->data[Mge->sz].Name);printf("请输入年龄:\n");scanf("%d",&(Mge->data[Mge->sz].Age));printf("请输入学号:\n");scanf("%s",Mge->data[Mge->sz].Id);printf("请输入性别:\n");scanf("%s",Mge->data[Mge->sz].Sex);printf("请输入专业:\n");scanf("%s",Mge->data[Mge->sz].Pro);printf("请输入成绩:\n");scanf("%d",&(Mge->data[Mge->sz].Garde));Mge->sz += 1;}
}void Show_Stu(System* Mge)//打印学生信息
{assert(Mge);printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s\n","姓名", "年龄", "学号", "性别", "专业","成绩");int i = 0;for (i = 0; i < Mge->sz; i++){printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d\n",Mge->data[i].Name,Mge->data[i].Age,Mge->data[i].Id,Mge->data[i].Sex,Mge->data[i].Pro,Mge->data[i].Garde);}
} void Del_Stu(System* Mge)//删除学生信息
{assert(Mge);printf("请输入你要删除学生的名字:\n");char str1[10] = "0";scanf("%s", str1);//先找到学生int z=FindName(Mge,str1);if (z == Mge->sz){printf("未找到该学生\n");return;}else{int i = 0;for (i = z; i < Mge->sz; i++){memmove(&Mge->data[i], &Mge->data[i + 1], sizeof(Stu));}Mge->sz--;}
}
int Comper(const void* p1, const void* p2)
{return(((Stu*)p2)->Garde - (((Stu*)p1)->Garde));
}
void Sort(System* Mge)
{assert(Mge);qsort(&(Mge->data[0]), Mge->sz, sizeof(Stu), Comper);printf("学生排名为:\n");printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s%5s\n","姓名", "年龄", "学号", "性别", "专业", "成绩","排名");int i = 0;for (i = 0; i < Mge->sz; i++){printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d%5d\n",Mge->data[i].Name,Mge->data[i].Age,Mge->data[i].Id,Mge->data[i].Sex,Mge->data[i].Pro,Mge->data[i].Garde, i+1);}
}void SearchStu(System* Mge)
{assert(Mge);char str1[15] = "0";printf("请输入要查找的学生的姓名");scanf("%s", str1);int i = FindName(Mge, str1);if (i == Mge->sz){printf("未找到该学生\n");return;}else{printf("%10s\t%-4s\t%-15s\t%5s\t%24s\t%5s\n", "姓名", "年龄", "学号", "性别", "专业", "成绩");printf("%10s\t%-4d\t%-15s\t%5s\t%24s\t%5d\n",Mge->data[i].Name,Mge->data[i].Age,Mge->data[i].Id,Mge->data[i].Sex,Mge->data[i].Pro,Mge->data[i].Garde);}
}
void De_System(System* Mge)//写入文件
{assert(Mge);FILE* pf = fopen("data.txt", "wb");Stu tmp = { 0 };int i = 0;for (i = 0; i < Mge->sz; i++){//以二进制的形式写入文件fwrite(Mge->data + i, sizeof(Stu), 1, pf);}//关闭文件free(Mge->data);Mge->data = NULL;fclose(pf);pf = NULL;
}void Del_Exit(System* Mge)
{assert(Mge);memset(Mge->data, 0, sizeof(Stu) * (Mge->sz));Mge->sz= 0;
}
5.Student Management System.h
#pragma once
#define Inti_Data 3
#define Add_Connt 2
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
#include<string.h>
//学生信息
typedef struct Stu
{//结构体类型重命名为Stuchar Name[15];int Age;char Id[19];//学号char Sex[5];//性别char Pro[24];//专业int Garde;//成绩
}Stu;
typedef struct System
{Stu* data;int sz;//学生人数int Max_Space;//系统最大容量
}System;void Teacher_System(System* Mge);int FindName(System* Mge, char* str1);
void Init_System(System* Mge);
void Add_Stu(System* Mge);
void Show_Stu(System* Mge);
void Del_Stu(System* Mge);
void Sort(System* Mge);
void SearchStu(System* Mge);
void Stu_System(System* Mge);
void View(System* Mge);
void De_System(System* Mge);
void Del_Exit(System* Mge);

博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你的真是 泰 裤 辣 !!!
相关文章:
【期末课程设计】学生成绩管理系统
因其独特,因其始终如一 文章目录 一、学生成绩管理系统介绍 二、学生成绩管理系统设计思路 三、源代码 1. test.c 2. Student Management System.c 3.Stu_System.c 4.Teacher.c 5.Student Management System.h 前言: 学生成绩管理系统含教师…...
【论文笔记】KDD2019 | KGAT: Knowledge Graph Attention Network for Recommendation
Abstract 为了更好的推荐,不仅要对user-item交互进行建模,还要将关系信息考虑进来 传统方法因子分解机将每个交互都当作一个独立的实例,但是忽略了item之间的关系(eg:一部电影的导演也是另一部电影的演员)…...
ES6:基础使用,积累
一、理解ES6 ES6是ECMAScript 6.0的简称,也被称为ES2015。它是ECMAScript的第六个版本,是JavaScript标准的下一个重大更新。ES6于2015年6月发布,新增了许多新的语言特性和API,包括箭头函数、let和const关键字、模板字符串、解构赋…...
Android端上传文件到Spring Boot后端
准备 确定好服务器端文件保存的位置确定好请求参数名(前后端要保持一致的喔)如果手机是通过usb连接到电脑的,需要执行一下: adb reverse tcp:8080 tcp:8080 AndroidManifest.xml的<application/>节点中加上: android:usesC…...
使用GGML和LangChain在CPU上运行量化的llama2
Meta AI 在本周二发布了最新一代开源大模型 Llama 2。对比于今年 2 月发布的 Llama 1,训练所用的 token 翻了一倍,已经达到了 2 万亿,对于使用大模型最重要的上下文长度限制,Llama 2 也翻了一倍。 在本文,我们将紧跟趋…...
微服务基础理论
微服务简介 微服务Microservices之父,马丁.福勒,对微服务大概的概述如下: 就目前而言,对于微服务业界并没有一个统一的、标准的定义(While there is no precise definition of this architectural style ) 。但通在其…...
《向量数据库指南》:向量数据库Pinecone管理数据教程
目录 连接到索引 指定索引端点 调用whoami以检索您的项目名称。 描述索引统计信息 获取向量 更新向量 完整更新 ℹ️注意 部分更新 ⚠️注意 ℹ️注意 删除向量...
以深度为基础的Scikit-learn: 高级特性与最佳实践
Scikit-learn是一个广受欢迎的Python库,它用于解决许多机器学习的问题。在本篇文章中,我们将进一步探索Scikit-learn的高级特性和最佳实践。 一、管道机制 Scikit-learn的Pipeline类是一种方便的工具,它允许你将多个步骤(如数据…...
Autosar MCAL-S32K324Dio配置-基于EB
文章目录 DioPost Build Variant UsedConfig VariantDioConfigDioPortDioChannelDioChannelGroupDioConfigDio Development Error DetectSIUL2 IP Dio Development Error DetectDio Version Info ApiDio Reverse Port BitsDio Flip Channel ApiDio Rea...
【Spring Boot】单元测试
单元测试 单元测试在日常项目开发中必不可少,Spring Boot提供了完善的单元测试框架和工具用于测试开发的应用。接下来介绍Spring Boot为单元测试提供了哪些支持,以及如何在Spring Boot项目中进行单元测试。 1.Spring Boot集成单元测试 单元测试主要用…...
Flink CEP (一)原理及概念
目录 1.Flink CEP 原理 2.Flink API开发 2.1 模式 pattern 2.2 模式 pattern属性 2.3 模式间的关系 1.Flink CEP 原理 Flink CEP内部是用NFA(非确定有限自动机)来实现的,由点和边组成的一个状态图,以一个初始状态作为起点&am…...
vue3+taro+Nutui 开发小程序(二)
上一篇我们初始化了小程序项目,这一篇我们来整理一下框架 首先可以看到我的项目整理框架是这样的: components:这里存放封装的组件 custom-tab-bar:这里存放自己封装的自定义tabbar interface:这里放置了Ts的一些基本泛型,不用…...
Transformer 模型实用介绍:BERT
动动发财的小手,点个赞吧! 在 NLP 中,Transformer 模型架构是一场革命,极大地增强了理解和生成文本信息的能力。 在本教程[1]中,我们将深入研究 BERT(一种著名的基于 Transformer 的模型)&#…...
Spring详解(学习总结)
目录 一、Spring概述 (一)、Spring是什么? (二)、Spring框架发展历程 (三)、Spring框架的优势 (四)、Spring的体系结构 二、程序耦合与解耦合 (一&…...
【JavaEE】Spring中注解的方式去获取Bean对象
【JavaEE】Spring的开发要点总结(3) 文章目录 【JavaEE】Spring的开发要点总结(3)1. 属性注入1.1 Autowired注解1.2 依赖查找 VS 依赖注入1.3 配合Qualifier 筛选Bean对象1.4 属性注入的优缺点 2. Setter注入2.1 Autowired注解2.2…...
【基于CentOS 7 的iscsi服务】
目录 一、概述 1.简述 2.作用 3. iscsi 4.相关名称 二、使用步骤 - 构建iscsi服务 1.使用targetcli工具进入到iscsi服务器端管理界面 2.实现步骤 2.1 服务器端 2.2 客户端 2.2.1 安装软件 2.2.2 在认证文件中生成iqn编号 2.2.3 开启客户端服务 2.2.4 查找可用的i…...
解决安装依赖时报错:npm ERR! code ERESOLVE
系列文章目录 文章目录 系列文章目录前言一、错误原因二、解决方法三、注意事项总结 前言 在使用 npm 安装项目依赖时,有时会遇到错误信息 “npm ERR! code ERESOLVE”,该错误通常发生在依赖版本冲突或者依赖解析问题时。本文将详细介绍出现这个错误的原…...
98、简述Kafka的rebalance机制
简述Kafka的rebalance机制 consumer group中的消费者与topic下的partion重新匹配的过程 何时会产生rebalance: consumer group中的成员个数发生变化consumer 消费超时group订阅的topic个数发生变化group订阅的topic的分区数发生变化 coordinator: 通常是partition的leader节…...
【人工智能】监督学习、分类问题、决策树、信息增益
文章目录 Decision Trees 决策树建立决策树分类模型的流程如何建立决策树?决策树学习表达能力决策树学习信息论在决策树学习中的应用特征选择准则一:信息增益举例结论不足回到餐厅的例子从12个例子中学到的决策树:Decision Trees 决策树 什么是决策树 —— 基本概念 非叶节…...
Pytorch迁移学习使用Resnet50进行模型训练预测猫狗二分类
目录 1.ResNet残差网络 1.1 ResNet定义 1.2 ResNet 几种网络配置 1.3 ResNet50网络结构 1.3.1 前几层卷积和池化 1.3.2 残差块:构建深度残差网络 1.3.3 ResNet主体:堆叠多个残差块 1.4 迁移学习猫狗二分类实战 1.4.1 迁移学习 1.4.2 模型训练 1.…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

