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

因其独特,因其始终如一
文章目录
一、学生成绩管理系统介绍
二、学生成绩管理系统设计思路
三、源代码
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.…...
避开这些坑!Sigma-Delta调制器设计中最容易忽略的5个稳定性问题(附MASH级联实测数据)
避开这些坑!Sigma-Delta调制器设计中最容易忽略的5个稳定性问题(附MASH级联实测数据) 在高速高精度ADC设计中,Sigma-Delta调制器因其优异的噪声整形特性成为首选方案。但当工程师们沉浸在理论计算的理想世界时,实验室示…...
PHPMailer OAuth2认证终极指南:安全挑战与架构实践深度解析
PHPMailer OAuth2认证终极指南:安全挑战与架构实践深度解析 【免费下载链接】PHPMailer The classic email sending library for PHP 项目地址: https://gitcode.com/GitHub_Trending/ph/PHPMailer PHPMailer作为PHP领域最经典的邮件发送库,其OAu…...
从零搭建企业级开源大模型平台:Ollama+Llama3+open-webui实战指南
1. 为什么选择OllamaLlama3open-webui组合? 最近两年大语言模型的发展速度简直让人瞠目结舌,从最初的GPT-3到现在的Llama3,模型能力突飞猛进的同时,部署门槛也在不断降低。作为一个在AI领域摸爬滚打多年的老手,我实测过…...
计算机毕业设计springboot彝族民族文化宣传网站 基于SpringBoot的彝族非物质文化遗产数字化展示平台 SpringBoot框架下彝族传统风俗文化传播系统
计算机毕业设计springboot彝族民族文化宣传网站l36tn9 (配套有源码 程序 mysql数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联xi 可分享 在当今数字化浪潮席卷全球的背景下,少数民族文化的保护与传承面临着前所未有…...
用ChatTTS打造你的专属AI语音助手:从音色定制到批量合成音频的完整工作流
用ChatTTS打造你的专属AI语音助手:从音色定制到批量合成音频的完整工作流 在内容创作领域,音频正成为越来越重要的媒介形式。无论是知识付费课程的讲解、播客节目的制作,还是智能设备的语音交互,一个稳定、个性化的语音合成系统都…...
突破Windows多显示器显示壁垒:SetDPI重新定义显示体验
突破Windows多显示器显示壁垒:SetDPI重新定义显示体验 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 在当今多设备协同工作的时代,显示器已成为我们与数字世界交互的重要窗口。然而,当程序员小李将笔…...
3步搞定ViGEmBus:Windows虚拟游戏手柄驱动终极指南 [特殊字符]
3步搞定ViGEmBus:Windows虚拟游戏手柄驱动终极指南 🎮 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 想要在Windows上体验更丰富的游…...
思源宋体终极指南:免费商用中文字体解决方案从入门到精通
思源宋体终极指南:免费商用中文字体解决方案从入门到精通 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目寻找高质量中文字体而烦恼?思源宋体这款…...
SEO_从入门到精通,掌握SEO的核心操作步骤
<h2>SEO从入门到精通,掌握SEO的核心操作步骤</h2> <p>在当今的互联网时代,搜索引擎优化(SEO)已经成为任何网站或网页希望获得高流量、高曝光的关键技能。无论你是一个初学者,还是已经有一些SEO基础的…...
网络舆情分析毕业设计:从数据采集到情感识别的技术实现与避坑指南
最近在帮学弟学妹们看网络舆情分析相关的毕业设计,发现大家普遍在几个地方卡壳:要么爬虫被封IP,数据拿不到;要么文本预处理一团糟,模型效果差;要么整个系统耦合在一起,改一处动全身,…...

