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

因其独特,因其始终如一

文章目录

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

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

三、源代码

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;
	}
	else
		return 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;
	}
	else
		return 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
{
	//结构体类型重命名为Stu
	char 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);

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于PySceneDetect的视频场景变换侦测与处理

剪映中集成了一个智能镜头分割的功能,其实是基于python的三方库PySceneDetect来实现的,主要用于对视频进行分析,寻找场景切换或剪辑。 不过一个一个处理起来比较麻烦,这里介绍一个python的三方库实现自动化批量处理。 文章目录 PySceneDetect主要功能特征PySceneDetect的安…

[golang gin框架] 40.Gin商城项目-微服务实战之Captcha验证码微服务

本次内容需要 gin框架基础知识, golang微服务基础知识才能更好理解 一.Captcha验证码功能引入 在前面,讲解了微服务的架构等,这里,来讲解前面商城项目的 Captcha验证码 微服务 ,captcha验证码功能在前台,后端 都要用到 ,可以把它 抽离出来 ,做成微服务功能 编辑 这个验证码功能…

windows下搭建php开发环境

http://wed.xjx100.cn/news/139397.html?actiononClick https://www.bilibili.com/read/cv23429835/ https://www.php.cn/faq/498307.html 安装iis 选择卸载程序 安装php 官网https://www.php.net/下载 选择线程安全 国内地址 下载完成后解压放到想存放的路径 添加p…

基于SaaS模式的Java基层卫生健康云HIS系统源码【运维管理+运营管理+综合监管】

云HIS综合管理平台 一、模板管理 模板分为两种&#xff1a;病历模板和报表模板。模板管理是运营管理的核心组成部分&#xff0c;是基层卫生健康云中各医疗机构定制电子病历和报表的地方&#xff0c;各医疗机构可根据自身特点特色定制电子病历和报表&#xff0c;制作的电子病历…

VUE3 语法教程

vue3 起步 刚开始学习 Vue&#xff0c;我们不推荐使用 vue-cli 命令行工具来创建项目&#xff0c;更简单的方式是直接在页面引入 vue.global.js 文件来测试学习。 Vue3 中的应用是通过使用 createApp 函数来创建的&#xff0c;语法格式如下&#xff1a; const app Vue.crea…

【LeetCode每日一题合集】2023.7.17-2023.7.23(离线算法 环形子数组的最大和 接雨水)

文章目录 415. 字符串相加&#xff08;高精度计算、大数运算&#xff09;1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐解法1——按区间长度排序 离线询问 并查集解法2——离线算法 优先队列 874. 模拟行走机器人&#xff08;哈希表 方向数组&#xff09;918. 环形子数组的最大和…

ts中setState的类型

两种方法: 例子: 父组件 const [value, setValue] useState(); <ChildsetValue{setValue} />子组件 interface Ipros {setValue: (value: string) > void } const Child: React.FC<Ipros> (props) > {}

(css)清除el-table背景色

(css)清除el-table背景色 效果&#xff1a; <el-table:data"gridData":header-cell-style"{text-align:center,color: #fff}":cell-style"{text-align:center,color: #fff }" ><el-table-column type"index" label"序号…

Linux QT通过NFS挂载到Linux开发板上

Linux QT通过NFS挂载到Linux开发板上 说明&#xff1a;这里使用的Linux开发板是正点原子的阿尔法开发板 创建NFS 环境 NFS简介 网络文件系统&#xff0c;英文 Network File System(NFS)&#xff0c;是由 SUN 公司研制的 UNIX 表示层协议 (presentation layer protocol)&…

Spring Security 构建基于 JWT 的登录认证

一言以蔽之&#xff0c;JWT 可以携带非敏感信息&#xff0c;并具有不可篡改性。可以通过验证是否被篡改&#xff0c;以及读取信息内容&#xff0c;完成网络认证的三个问题&#xff1a;“你是谁”、“你有哪些权限”、“是不是冒充的”。 为了安全&#xff0c;使用它需要采用 …

【JavaEE】Spring中注解的方式去存储Bean对象

Spring的开发要点总结 文章目录 【JavaEE】Spring的开发要点总结&#xff08;2&#xff09;1. 通过类注解的方式存储Bean对象1.1 五大 类注解1.1.1 Controller 控制器存储1.1.2 Service 服务存储1.1.3 Repository 仓库存储1.1.4 Component 组件存储1.1.5 Configuration 配置存储…

iview的表格添加筛选功能需要注意的问题

给table的某列添加筛选功能 在table中通过给columns数据的项&#xff0c;设置 filters&#xff0c;可进行筛选&#xff0c;filters 接收一个数组。 然后再指定一个筛选函数 filterMethod 才可以进行筛选&#xff0c;filterMethod 传入两个参数value和 row。 如果指定 filter…

Ubuntu linux安装搜狗输入法

效果图&#xff1a; 一、首先要卸载掉自带的输入法 1、以root 身份登录系统并打开终端输入&#xff1a; apt-get remove ibus-pinyin 2、如果卸载后还需要使用&#xff0c;可通过如下方法安装 以root 身份登录系统并打开终端输入&#xff1a; apt-get install ibus-pinyin …

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

^(按位异或)操作符详解

因为未知&#xff0c;所以全力以赴 目录 例1.实现两个数的交换 例2.找出单身狗 1.简单版 2.进阶版 大家好&#xff0c;我是纪宁。这篇博客介绍^操作符及使用案例。 位操作符是对操作数的二进制补码进行操作。^就是位操作符的一种&#xff0c;叫按位异或操作符。计算结果是…

《零基础入门学习Python》第055讲:论一只爬虫的自我修养3:隐藏

0. 请写下这一节课你学习到的内容&#xff1a;格式不限&#xff0c;回忆并复述是加强记忆的好方式&#xff01; 上节课我们说过了&#xff0c;有一些网站比较痛恨爬虫程序&#xff0c;它们不喜欢被程序所访问&#xff0c;所以它们会检查链接的来源&#xff0c;如果说来源不是正…

【CN-Docker】window11下Docker下开启kubernetes

1. 安装Docker 安装docker步骤如下&#xff1a; 下载Docker启用hyper-v 2.1.powershell&#xff0c;管理员运行Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All安装wsl配置Docker镜像加速地址(阿里云) 4.1. "registry-mirrors": [&quo…

让GPT人工智能变身常用工具-上

1.密码生成器:GPT为您创建安全密码 想象GPT作为您的个人密码生成器,负责从头到尾为您创建复杂且安全的密码。您只需要告诉他您的密码需求,比如密码的长度,是否包含大写字母、小写字母、数字或特殊字符,他会立即为您生成一个复杂但经过深度设计的密码。 例子: 我希望您…

Selenium 修改 HTTP 请求头三种方式

目录 前言&#xff1a; 什么是 HTTP 请求头 需要更改 HTTP 请求请求头 Selenium 修改请求头 Java HTTP 请求框架 代码实战 使用反向代理 使用 Firefox 扩展 下载火狐浏览器扩展 加载火狐扩展 设置扩展首选项 设置所需的功能 完整自动化用例 前言&#xff1a; Sele…

内存函数及其模拟实现

身体扛不住的时候&#xff0c;意志会带你杀出重围 文章目录 一、memcpy函数 函数介绍 模拟实现 二、memmove函数 函数介绍 模拟实现 三、memset函数 函数介绍 模拟实现 大家好&#xff0c;我是纪宁。这篇文章给大家介绍C语言中常见的内存处理函数。 一、memcpy函数 …