30分钟做完一个满分学生成绩管理系统,工具人含泪分享!

这篇博客分享了作者如何使用C++为学妹们制作一个学生成绩管理系统,包括教师和学生角色的功能设计,如输入输出、查找删除、排序计算等。通过文件读写和链表技术实现,获得了满分和创新分。
摘要由CSDN通过智能技术生成

前言
靓仔我呢,作为一名乐于助人的“好”学长,自然对学妹要做到有求必应啦。
大二的时候,我兴冲冲地应聘了一个大一班级的导助,作为一名帅气的学长(附照片),很快就与我们计算机班级的数量众多的三个女生打成了一片,并且豪言道“有问题,找学长”。
在这里插入图片描述

没想到这拉开了我三年工具人的生涯。不过三个学妹好在都很漂亮,嘿嘿。分别是黄头发小学妹东北大妹子以及我的老乡170小姐姐

快毕业了,把当初为三位学妹整理的各种东西分享出来(当初自己学的时候,都没上心)。

她们大一的时候是最热情的时候,让我忘记了自己还是在工科学院的事实,作为大一上学期的学生成绩管理系统也是她们当时最为头疼的事情,我把之前自己做的课程设计发给了他们。

具体实现使用c++,dos界面,使用的技术也都是大一学的,并没有超纲,并且我和黄头发妹妹都拿了满分,建议有需要的一键三连,收藏再看嗷!

概述

利用c++或c语言等所学知识编码实现学生成绩管理系统。按照要求实现功能。

课程目的

将菜单模块,输入模块,查询模块,更新模块,输出模块,排序模块,统计模块,进行合理编写,符合学生及老师对学生成绩管理系统的基本使用要求,并在此基础上加以创新,实现更多功能。
(这里重点说明,老师为了鼓励我们有所创新,重点以创新点给分,所以诸多同学用变色、加字符图画等各种神奇套路取博得老师芳心)
我当时用下面这个图,让老师高兴地给我加上了五分创新分哈哈哈哈哈。
在这里插入图片描述

功能设计

系统使用角色设计为教师登录和学生登陆。(后来指导学妹创新,加上了管理员角色,又Get到了创新分)。
进入系统时,有俩个选项:

在这里插入图片描述
然后选择角色进入,为了用户体验感,都设置了返回上级功能(即返回上一页面)。
在这里插入图片描述

使用到了文件读写、学生类、课程类和学生链表等技术。(在大一这个阶段,这个链表应该能让你的老师眼前一亮)

教师角色

其中教师角色功能设计如下:
1.登录密码验证
2.输入学生信息(姓名、学号、性别、成绩、学院班级)
3.输出学生成绩
4.添加学生信息
5.查找学生信息(索引:姓名、学号、学院)
6.删除学生信息
7.修改学生信息
8.排序(学号、单科成绩、总成绩)
9.计算(总分、均分、通过率)
10.公共课程设置(添加删除课程)

学生角色

学生角色的功能设计比较少了,哈哈哈,难不成给你设计一个改成绩功能,嘿嘿。

功能效果:

当时学习C++,重点和难点也都是类的使用,但是当初我这个课程对类设计和使用都较好,建议现在大一的同学可以参考我的实现。
就一个登录,查看信息和成绩的功能。

教师角色

输入学生信息(姓名、学号、性别、成绩、学院班级)

在这里插入图片描述
输出学生成绩
在这里插入图片描述

添加学生信息
在这里插入图片描述
查找学生信息(索引:姓名、学号、学院)
在这里插入图片描述
删除学生信息
在这里插入图片描述

排序(学号、单科成绩、总成绩)
在这里插入图片描述计算(总分、均分、通过率)
在这里插入图片描述
公共课程设置(添加删除课程)
在这里插入图片描述

学生角色

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210601140150535.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVCb3ds,size_16,color_FFFFFF,t_70

文件读写

1.课程信息
在这里插入图片描述2.学生信息
在这里插入图片描述

源码送上

//可以设置公共课程,然后是个人选修课
//私有课程设置放在修改信息中...
//无文件是的操作情况
//文件为空的时候操作情况
#include<iostream>
#include<string>
#include<fstream>						//文件的输出输出流操作
#include<iomanip>						//对齐输出
using namespace std;
const char* filename = "Student.txt";			//学生信息记录的文件名称
const char* filename_lesson = "Lesson.txt";	//公共课程信息的记录名称
const int MAX = 10;							//最多课程数量

struct Lesson_Node							//课程的结构体设置
{
   
	string L_name;							//课程名称
	int grade;								//课程成绩
};

class Lesson								//课程设置类
{
   
private:
	Lesson_Node lesson[MAX];				//课程具体信息,最多10项
	int n;									//当前的课程数量
	int Mount_s;							//成绩总和
	int Averg_s;							//平均成绩
public:
	Lesson()								//课程初始化,读取文件中公共课程的信息设置,如果没有文件就建立一个文件
	{
   
		ifstream ifs(filename_lesson);
		if (!ifs)
		{
   
			string na[4] = {
    "语文","数学","英语","体育" };
			n = 4;
			for (int i = 0; i<n; ++i)
			{
   
				lesson[i].L_name = na[i];
				lesson[i].grade = 0;
			}
			SetA_M();
			Filein_PublicL();				//如果打开失败,就写一个文件
		}
		else
		{
   
			ifs.close();
			Fileout_PbulicL();				//读取成功就读取当前文件中的课程设置

		}
	}
	~Lesson()								//析构
	{
   
		n = 0;
		Mount_s = 0;
		Averg_s = 0;
	}
	Lesson(const Lesson&rhs)				//复制构造函数
	{
   
		n = rhs.n;
		for (int i = 0; i<n; i++)
		{
   
			lesson[i].L_name = rhs.lesson[i].L_name;
			lesson[i].grade = rhs.lesson[i].grade;
			SetA_M();
		}
	}
	Lesson& operator=(const Lesson&rhs)
	{
   
		n = rhs.n;
		for (int i = 0; i<n; i++)
		{
   
			lesson[i].L_name = rhs.lesson[i].L_name;
			lesson[i].grade = rhs.lesson[i].grade;
			SetA_M();
		}
		return *this;
	}
	int ReturnMount_s()						//返回总分
	{
   
		return Mount_s;
	}
	int ReturnAverg_s()						//返回平均分
	{
   
		return Averg_s;
	}
	void Dislesson(int x = 1)					//输出当前的课程的信息
	{
   
		if (x == 1)							//由于需要,在没有输入参数的情况下默认是输出文件中的课程信息,在参数x不等于1则输出当前内存中修改后的课程程信息
			Fileout_PbulicL();
		int i;
		for (i = 0; i<n; i++)
		{
   
			cout << i + 1 << lesson[i].L_name << "  ";
		}
		cout << endl;
	}
	void Addlesson(int i = 1)					//增加课程 参数1是公共课程的添加 2是私人课程的添加
	{
   

		char t = '1';
		string na;
		while (t == '1')
		{
   
			if (n == MAX)
			{
   
				cout << "以达到课程上限,无法继续添加" << endl;
				return;
			}
			cout << "输入要添加的课程名称:";
			cin >> na;
			lesson[n].L_name = na;
			if (i == 1)
				lesson[n].grade = 0;
			else
			{
   
				cout << "输入成绩";
				cin >> na;
				lesson[n].grade = atoi(na.c_str());
			}
			n++;							//课程数量加1

			cout << "是否继续添加课程:(1.继续 0.不了)";
			cin >> t;
		}
		if (i == 1)
			Filein_PublicL();//将修改后的课程信息写入文件
	}
	void Dellesson(int i = 1)					//删除课程
	{
   
		int x; string tmp; char t = '1';
		while (t == '1')
		{
   
			cout << "请输入要删除的课程编号";
			cin >> tmp; x = atoi(tmp.c_str());
			if (x>0 && x <= n)
			{
   
				for (; x<n; x++)
				{
   
					lesson[x - 1].L_name = lesson[x].L_name;
					lesson[x - 1].grade = lesson[x].grade;
				}
				n--;
				if (i == 1)
					Dislesson(0);				//显示当前内存中的课程信息,避免一直循环删除要一直读取写入文件,所以一次性将修改好的课程写入文件
			}
			else
			{
   
				cout << "输入错误~~~,或已经不存在课程信息了" << endl;
			}
			cout << "是否继续删除课程信息(1.是的,0.不了) ";
			cin >> t;
		}
		if (i == 1)
			Filein_PublicL();					//写入文件
	}
	void SetA_M()							//计算平均分和总分
	{
   
		Mount_s = 0;
		for (int i = 0; i<n; i++)
		{
   
			Mount_s = Mount_s + lesson[i].grade;
		}
		Averg_s = Mount_s / n;
	}
	/*******************************************     个人选修课程设置     *********************************************/
	void SetPersonLesson()
	{
   
		string tmp;
		char x = '0';
		int i;
		Dislesson(2);  cout << endl;                             //输出当前学生信息中的课程信息
		cout << "a.增加课程 b.删除课程";
		cin >> x;
		switch (x)
		{
   
		case 'a':Addlesson(2); break;							//增加单人课程
		case 'b':Dellesson(2); break;							//删除单人课程
		default:
			i = x - '0';
			if (i>0 && i <= n)
			{
   
				cout << "请输入" << lesson[i - 1].L_name << "的成绩:";
				cin >> tmp;
				lesson[i - 1].grade = atoi(tmp.c_str());//成绩从字符转整形

			}
			break;
		}SetA_M();
	}
	/*******************************************     公共课程设置部分     **********************************************/

	void Filein_PublicL()				//向文件中输入公共课程的设置
	{
   
		ofstream ofs(filename_lesson);
		if (!ofs)
		{
   
			cout << "文件打开失败" << endl;
			exit(0);
		}
		ofs << n << '\t';
		for (int i = 0; i<n; i++)
		{
   
			ofs << lesson[i].L_name << '\t';
		}
		ofs.close();

	}
	void Fileout_PbulicL()				//从文件中读取公共课程设置信息,建立课程
	{
   
		int i = 0;
		ifstream ifs(filename_lesson);
		if (!ifs)
		{
   
			cout << "文件打开失败" << endl;
			exit(0);
		}
		ifs >> n >> ws;
		while (i<n && !ifs.eof())			//判断是否读取到文件末尾了
		{
   
			ifs >> lesson[i
评论 62
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值