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

因其独特,因其始终如一

文章目录

一、学生成绩管理系统介绍

二、学生成绩管理系统设计思路

三、源代码

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);

在这里插入图片描述

  博主写了好长时间,如果你能给博主一个免费三连鼓励一下博主的话,那么我觉得你的真是 泰     裤    辣 !!!

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

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

相关文章

什么是Maven,Maven的概述及基本使用

MAVEN 一、Maven简介1.1、Maven概述1.2、Maven仓库1.3项目获取jar包过程 二、Maven使用2.1Maven安装配置2.1.1配置环境变量2.1.2配置本地仓库2.1.3配置阿里云私服 2.2Maven基本使用2.2.1Maven常用指令2.2.2Maven生命周期 总结 一、Maven简介 Apache Maven是一个项目管理和构建…

STM32 I2C OVR 错误

一、问题 STM32 I2C 用作从机时&#xff0c;开启如下中断并启用 callback 回调函数。 每一次复位后&#xff0c;从机都可以正常触发地址匹配中断ADDR&#xff0c;之后在该中断的回调函数中启用接收中断去收取数据时&#xff0c;却无法进入RXNE中断&#xff0c;而是触发了 OVR …

<C语言> 动态内存管理

1.动态内存函数 为什么存在动态内存分配&#xff1f; int main(){int num 10; //向栈空间申请4个字节int arr[10]; //向栈空间申请了40个字节return 0; }上述的开辟空间的方式有两个特点&#xff1a; 空间开辟大小是固定的。数组在申明的时候&#xff0c;必须指定数组的…

自然语言处理NLP介绍——NLP简介

目录 内容先进性说明内容大纲概要云服务器的使用 内容先进性说明 内容大纲概要 云服务器的使用

githack的安装步骤+一次错误体验

一.githack的安装步骤 1.要在Kali Linux上安装GitHack工具&#xff0c;您可以按照以下步骤操作&#xff1a; 打开终端并使用以下命令克隆GitHack存储库&#xff1a; git clone https://github.com/lijiejie/GitHack.git2.进入GitHack目录&#xff1a; cd GitHack3.安装依赖项…

一种分解多种信号模式非线性线性调频的方法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Elasticsearch

文章目录 分布式搜索引擎elasticsearch介绍elasticsearch作用ELK技术栈elasticsearch和lucene 倒排索引正向索引倒排索引正向和倒排比较 es的一些概念文档和字段索引和映射mysql与elasticsearch elasticsearch安装部署单点es部署kibana安装IK分词器扩展词词典停用词典 索引库操…

Go语言基础语法八万字详解,对小白友好

基本语法——变量var 变量的使用 什么是变量 变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。 所以变量的本质就是一小块内存&#xff0c;用于存储数据&#xff0c;在程序运行过程中数值可以改变 声明变量 var名称类型是声明单个变量的语法…

PaddleOCR #PP-OCR常见异常扫雷

异常一&#xff1a;ModuleNotFoundError: No module named ‘tools.infer’ 实验案例&#xff1a; PaddleOCR #使用PaddleOCR进行光学字符识别&#xff08;PP-OCR文本检测识别&#xff09; 参考代码&#xff1a; 图片文本检测实验时&#xff0c;运行代码出现异常&#xff1a;M…

【我们一起60天准备考研算法面试(大全)-第二十七天 27/60】【真分数】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

8.6 PowerBI系列之DAX函数专题-非日期类型的累计聚合

需求 需求1&#xff1a; 需求2&#xff1a; 实现 1.需求1实现&#xff1a; &#xff08;1&#xff09;在power query中添加列-添加索引列&#xff1b; &#xff08;2&#xff09;根据索引列进行累加计算。 度量值 累计聚合销售额 var current_pro_type selectedvalue(…

CHD6.2.1集群 Hive开启Iceberg

下载jar包 https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-runtime/1.0.0/iceberg-hive-runtime-1.0.0.jar 存放在/opt/cloudera/parcels/CDH/lib/hive/auxlib/ CDH集群修改hive配置 选择xml格式 粘贴即可 <property><name>iceberg.engine.hi…

华为认证HCIA-HCIP-HCIEdatacom题库解析+机构视频+实验

题库包含有2023年最新HCIA-datacom题库、HCIP-datacom题库&#xff0c;HCIE-datacom题库&#xff0c; 云计算HCIA&#xff0c;HCIP题库&#xff0c;云服务HCIA&#xff0c;HCIP题库&#xff0c;华为存储HCIP题库&#xff0c;华为安全HCIP题库 &#xff0c;学习笔记&#xff0c;…

MES管理系统中设备管理功能的原理是什么

制造执行系统MES是一种应用于制造工厂的实际操作系统&#xff0c;它通过实时监控和控制生产流程&#xff0c;为生产过程提供全面的管理和优化。在MES管理系统解决方案中&#xff0c;设备管理功能是非常重要的一部分&#xff0c;它可以实现设备实时监控、故障预警、维护保养等功…

【论文阅读】通过解缠绕表示学习提升领域泛化能力用于主题感知的作文评分

摘要 本文工作聚焦于从领域泛化的视角提升AES模型的泛化能力&#xff0c;在该情况下&#xff0c;目标主题的数据在训练时不能被获得。本文提出了一个主题感知的神经AES模型&#xff08;PANN&#xff09;来抽取用于作文评分的综合的表示&#xff0c;包括主题无关&#xff08;pr…

【打卡】Datawhale暑期实训ML赛事

文章目录 赛题描述任务要求数据集介绍评估指标 赛题分析基于LightGBM模型Baseline详解改进baseline早停法添加特征 赛题描述 赛事地址&#xff1a;科大讯飞锂离子电池生产参数调控及生产温度预测挑战赛 任务要求 初赛任务&#xff1a;初赛提供了电炉17个温区的实际生产数据&…

使用win10专业版自带远程桌面公司内网电脑

在现代社会中&#xff0c;各类电子硬件已经遍布我们身边&#xff0c;除了应用在个人娱乐场景的消费类电子产品外&#xff0c;各项工作也离不开电脑的帮助&#xff0c;特别是涉及到数据采集和储存的场景&#xff08;如安保监控、自动化流程等等&#xff09;&#xff0c;更是离不…

pytest自动化测试指定执行测试用例

1、在控制台执行 打开cmd,进入项目目录 指定执行某个模块 pytest testcases\Logistics\Platform\CarSource\test_CarSourceList.py 指定执行某个目录及其子目录的所有测试文件 pytest testcases\Logistics\Platform\CarSource 指定执行某个模块的某个类的某个测试用例 pyte…

音视频入门之音频采集、编码、播放

作者&#xff1a;花海blog 今天我们学习音频的采集、编码、生成文件、转码等操作&#xff0c;我们生成三种格式的文件格式&#xff0c;pcm、wav、aac 三种格式&#xff0c;并且我们用 AudioStack 来播放音频&#xff0c;最后我们播放这个音频。 使用 AudioRecord 实现录音生成…

文件系统总结

《本文件系统默认linux文件系统》 一、文件系统基本概念 文件系统是操作系统中负责存取和管理信息的模块&#xff0c;它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护&#xff0c;并为用户提供一整套方便有效的文件使用和操作方法文件系统是操作系统中管理文…