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

因其独特,因其始终如一
文章目录
一、学生成绩管理系统介绍
二、学生成绩管理系统设计思路
三、源代码
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.…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

