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

因其独特,因其始终如一

文章目录

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

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

三、源代码

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.rhkb.cn/news/77562.html

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

相关文章

刷题DAY16

题目一 给定两个字符串str1和str2&#xff0c;再给定三个整数ic、dc和rc&#xff0c;分别代表插入、删除和替换一个字符的代价&#xff0c;返回将str1编辑成str2的最小代价。【举例]str1"abc",str2“adc",ic5,dc3,rc2从“abc“编辑成adc",把b替换成d是代价…

Android学习之路(1) App工程的项目结构

一、App工程的项目结构 1.项目下面有两个分类 一个是app(代表app模块)&#xff0c;另一个是Gradle Scripts。其中app下面又有3个子目录&#xff0c;其功能说明如下&#xff1a; manifests 子目录下面只有一个XML文件&#xff0c;即AndroidManifest.xmljava子目录&#xff0c;…

华为QinQ技术的基本qinq和灵活qinq 2种配置案例

基本qinq配置&#xff1a; 运营商pe设备在收到同一个公司的ce发来的的包&#xff0c;统一打上同样的vlan &#xff0c;如上图&#xff0c;同一个家公司两边统一打上vlan 2&#xff0c;等于在原内网vlan 10或20过来的包再统一打上vlan 2的标签&#xff0c;这样传输就不会和其它…

PostMan调用gitlab接口,OAuth 2.0 身份认证 API ,copy完事~

获取token接口&#xff1a; https://gitlab.***.com/oauth/token &#xff0c;接下来就可以调用其他功能的接口了 例&#xff1a;创建账户&#xff0c;将获取到的access_token放置在接口请求的token中 其他接口调用同上

华为OD机试之报文回路(Java源码)

题目描述 IGMP 协议中响应报文和查询报文&#xff0c;是维系组播通路的两个重要报文&#xff0c;在一条已经建立的组播通路中两个相邻的 HOST 和 ROUTER&#xff0c;ROUTER 会给 HOST 发送查询报文&#xff0c;HOST 收到查询报文后给 ROUTER 回复一个响应报文&#xff0c;以维持…

【前端知识】React 基础巩固(四十六)——自定义Hook的应用

React 基础巩固(四十六)——自定义Hook的应用 一、自定义Hook的应用 自定义Hook本质上只是一种函数代码逻辑的抽取&#xff0c;严格意义上而言&#xff0c;它并不算React的特性。 实现组件创建/销毁时打印日志 import React, { memo, useEffect, useState } from "react…

嵌入式开发学习(STC51-13-温度传感器)

内容 通过DS18B20温度传感器&#xff0c;在数码管显示检测到的温度值&#xff1b; DS18B20介绍 简介 DS18B20是由DALLAS半导体公司推出的一种的“一线总线&#xff08;单总线&#xff09;”接口的温度传感器&#xff1b; 与传统的热敏电阻等测温元件相比&#xff0c;它是一…

神码ai火车头标题伪原创【php源码】

这篇文章主要介绍了如何把python 代码打包成可执行软件&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 火车头采集ai伪原创插件截图&#xff1a; Python 程序封装-打包成exe程…

【Apollo学习笔记】—— 相机仿真

文章目录 前言相关代码整理 测试实践文件目录包管理BUILD文件以及cyberfile.xml文件源程序BUILD运行结果其他参考CameraOutput channels启动camera驱动启动camera video compression驱动 前言 本文是对Cyber RT的学习记录,文章可能存在不严谨、不完善、有缺漏的部分&#xff0…

揭秘程序员最喜欢的5个高薪工作

大家好&#xff0c;这里是程序员晚枫。想了解更多精彩内容&#xff0c;快来关注程序员晚枫 今天给大家推荐5个适合程序员的高薪岗位。 01 推荐岗位 以下是5个工资最高的程序员工作&#xff1a; 数据科学家&#xff1a;数据科学家是负责数据收集、处理、分析和报告的专业人员。…

mssqlmysql数据库忽略大小写

一、mssql -- 创建数据时指定排序集Latin1_General_CI_AS CREATE DATABASE [数据库名] COLLATE Latin1_General_CI_AS 查询效果&#xff1a; 二、mysql

【数学】1、导论、数学归纳法与递归、分治

文章目录 一、数学归纳法与递归1.1 数学归纳法的过程1.2 递归1.2.1 本质就是数学归纳1.2.2 递归的场景1.2.2.1 编程实现数学归纳1.2.2.2 归并排序的分治思想1.2.2.3 分布式系统的分治思想 学习目标&#xff1a; 实用主义&#xff1a;为了解决工作日常的问题&#xff0c;而不是…

S7-200SMART与ET200SP远程IO模块进行PROFINET通信的具体方法

S7-200SMART与ET200SP远程IO模块进行PROFINET通信的具体方法 使用前提: 只有标准型且固件版本为V2.4及以上的S7-200 SMART CPU才支持 PROFINET 控制器功能。 S7-200 SMART 作 PROFINET 控制器最多可带8个 IO 设备(例如:远程 IO、阀岛、变频器、伺服和机器人等)。 本例中以 …

eclipse Java Editor Templates

​ Window - Preferences - Java - Editor - Templates ​ date ${currentDate:date(yyyy.MM.dd)}

九、pig安装

1.上传pig包 2.解压文件 3.改名 4.赋权 5.配置环境变量 export PIG_HOME/usr/local/pig export PATH$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$HIVE_HOME/bin:$HBASE_HOME/bin:$SQOOP_HOME/bin:$PIG_HOME/bin 6.测试

如何在轻量级RTSP服务支持H.264扩展SEI发送接收自定义数据?

为什么开发轻量级RTSP服务&#xff1f; 开发轻量级RTSP服务的目的是为了解决在某些场景下用户或开发者需要单独部署RTSP或RTMP服务的问题。这种服务的优势主要有以下几点&#xff1a; 便利性&#xff1a;通过轻量级RTSP服务&#xff0c;用户无需配置单独的服务器&#xff0c;…

7种有效安全的网页抓取方法,如何避免被禁止?

网页抓取是一种从互联网上抓取网页内容的过程&#xff0c;但在网络抓取种相信您也经常遇到障碍&#xff1f;尤其是做跨境业务的&#xff0c;在抓取国外的网站时更有难度。但我们站在您的立场上&#xff0c;提供七种有效的方法来进行网页抓取而不被阻止&#xff0c;最大限度地降…

C语言每日一题:14《数据结构》复制带随机指针的链表

题目一&#xff1a; 题目链接&#xff1a; 思路一&#xff1a; 找相对位置暴力求解的方法&#xff1a; 1.复制一个新的链表出来遍历老的节点给新的节点赋值&#xff0c;random这个时候不去值。 2.两个链表同时遍历&#xff0c;遍历老链表的时候去寻找相对位置&#xff0c;在遍…

压力测试与测试工具jmeter的介绍

目录 一、性能指标 二、jmeter &#xff08;一&#xff09;JMeter 安装 &#xff08;二&#xff09;JMeter 压测示例 1、添加线程组 2、添加 HTTP 请求 3、添加监听器 4、启动压测&查看分析结果 &#xff08;三&#xff09;JMeter Address Already in use 错误解决 压力测…

c++11 标准模板(STL)(std::basic_ofstream)(四)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ofstream : public std::basic_ostream<CharT, Traits> 类模板 basic_ofstream 实现文件上基于流的高层输出操作。它将 std::basic_ost…