IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言学生成绩管理系统 -> 正文阅读

[C++知识库]C语言学生成绩管理系统

?如需全部代码,关注公众号(coding加油站)回复“C语言学生成绩管理系统”免费领取。

1、思路
学生成绩管理系统,首先要初始化系统,首页选择教师还是学生,教师拥有全部的权限,开始一个新的学生成绩系统初始化记录学生姓名,学号,院系,然后输入学生各科成绩,数学,英语,语文成绩。记录完各课成绩以后,可查看学生平均成绩和是否及格,成绩查询其中有学号查询,姓名查询,院系查询,还有全部输出,可以清晰的看到及格人数,按照分数高低排列,最后还可以添加和删除学生成绩,或者更改学生成绩,避免人为录入成绩错误。

2、相关功能

?
(1)录入每个学生的学号、姓名和各科考试成绩;
(2)计算每门课程的总分和平均分;
(3)计算每个学生的总分和平均分;
(4)按每个学生的总分由高到低排出名次表;
(5)按每个学生的总分由低到高排出名次表;
(6)按学号由小到大排出成绩表;
(7)按姓名的字典顺序排出成绩表;
(8)按学号查询学生排名及其考试成绩;
(9)按姓名查询学生排名及其考试成绩;
(10)按优秀(90-100)、良好(80-89)、中等(70-79)、及格(60-69)、不及格(0-59)5个类别,对每门课程分别统计每个类别的人数以及所占的百分比;
(11)输出每个学生的学号、姓名、各科考试成绩,以及每门课程的总分和平均分;
(12)设置公共课程

(13)保存相关信息到文件

(14)学生管理,学生可以查看自己的排名

视频演示:

【coding加油站】C语言学生成绩管理系统

如下是一些效果图:

主要代码如下:

class student_Node		//学生的信息类,存储学生的信息,并修改信息
{
private:
	string Name;		//姓名
	long Number;		//学号
	string Sex;			//性别
	string Academy;		//学院
	string Class;		//班级
	Lesson Less;        //课程
	student_Node *next;
public:
	student_Node(string na="空",long num=0,string sex="男",string aca="空",string cla="空")		//对成绩和姓名所以成员都进行初始化??需要优化?
		:Less(L)
	{
		SetName(na);
		SetNumber(num);
		SetSex(sex);
		SetAcademy(aca);
		SetClass(cla);
		next=NULL;
	}
	~student_Node()					//析构
	{
		Name="";Number=0;Sex="";Academy="";Class="";next=NULL;
	}
	student_Node& operator =(const student_Node&rhs)
	{
		Name=rhs.Name;
		Number=rhs.Number;
		Sex=rhs.Sex;
		Academy=rhs.Academy;
		Class=rhs.Class;
		Less=rhs.Less;//这里又调用课程类的赋值函数
		return *this;
	}
	void SetName(string name)		//设置名字
	{
		Name=name;
	}
	void SetNumber(long num )		//设置学号
	{
		Number=num;
	}
	void SetSex(string sex)			//设置性别
	{
		Sex=sex;
	}
	void SetAcademy(string acad)	//设置学院
	{
		Academy=acad;
	}
	void SetClass(string cla )		//设置班级
	{
		Class=cla;
	}
	void SetLesson()				//单人课程设置
	{
		Less.SetPersonLesson();
	}
	friend istream& operator>>(istream&is,student_Node &rhs)//输入数据
	{
		string tmp;
		long num;
		cout<<"请输入姓名:";		//输入名字,到临时变量中,然后通过设置函数设置好成员中的名字,下面的都相同
		is>>tmp;
		rhs.SetName(tmp);
		cout<<"请输入学号:";
		is>>tmp;
		num=atol(tmp.c_str());		//字符型转化为长整形(解决了输入字符时会出现的bug)
		rhs.SetNumber(num);
		cout<<"请输入性别:";
		is>>tmp;
		rhs.SetSex(tmp);
		cout<<"请输入学院:";
		is>>tmp;
		rhs.SetAcademy(tmp);
		cout<<"请输入班级:";
		is>>tmp;
		rhs.SetClass(tmp);
		is>>rhs.Less;				//输入课程
		return is;
	}
	friend ostream& operator<<(ostream&os,student_Node &rhs)//输出数据
	{
		cout<<left<<setw(8)<<rhs.Name<<left<<setw(15)<<rhs.Number<<left<<setw(8)<<rhs.Sex<<left<<setw(10)<<rhs.Academy<<left<<setw(10)<<rhs.Class<<left<<setw(8)<<rhs.Less.ReturnMount_s()<<left<<setw(8)<<rhs.Less.ReturnAverg_s()<<endl;

		cout<<rhs.Less<<endl;		//输出课程
		return os;
	}
	friend class  student_List;		//友元类设置
};
class student_List					//学生的信息链表类,主要进行链表的操作,查找输出
{
private:
	student_Node *head;
public:
	student_List()					//学生链表的初始化,建立头结点,并从文件中读取信息建立链表
	{
		head=new student_Node;
		head->next=NULL;
		ifstream ifs(filename);
		if(!ifs)					//如果文件不存在
		{
			Filewrite();			//建立文件
		}
	}
	~student_List()
	{
		student_Node *p=head->next,*q;
		while(p!=NULL)
		{
			q=p;
			p=p->next;
			delete q;
		}
		delete head;
	}
	void Fileread()					//读取文件中的信息建立链表
	{
		ifstream ifs(filename);
		if(!ifs)
		{
			cout<<"文件打开失败"<<endl;
			exit(0);
		}
		student_Node *q=head;
		while(ifs.peek()!=EOF)		//判断是否读取到文件末尾了 采用这个peek函数而不采用ifs.eof()是防止文件为空时还进入循环
		{
			student_Node *p=new student_Node;
			ifs>>p->Name
				>>ws
				>>p->Number
				>>ws
				>>p->Sex
				>>ws
				>>p->Academy
				>>ws
				>>p->Class
				>>ws;
			ifs>>p->Less.n>>ws;
			for(int i=0;i<p->Less.n;i++)
				ifs>>p->Less.lesson[i].L_name>>ws>>p->Less.lesson[i].grade>>ws;
			p->Less.SetA_M();
			q->next=p;
			p->next=NULL;
			q=p;
		}
	}
	void Filewrite()				//通过文件的读写将链表中的内容写到文件中
	{
		student_Node *p=head->next;
		ofstream ofs(filename);
		if(!ofs)
		{
			cout<<"文件打开失败"<<endl;
			exit(0);
		}
		while(p!=NULL)
		{
			ofs<<p->Name<<'\t'
				<<p->Number<<'\t'<<p->Sex<<'\t'<<p->Academy<<'\t'<<p->Class
				<<endl;
			ofs<<p->Less.n;
			for(int i=0;i<p->Less.n;i++)
				ofs<<'\t'<<p->Less.lesson[i].L_name<<'\t'<<p->Less.lesson[i].grade;
			ofs<<endl;
				p=p->next;
		}
		ofs.close();
	}
	/**********************************     操作部分    ***********************************/
	void Putin(int n=1)			//输入,参数的含义是区别与是操作1的输入还好插入函数....默认是输入函数
	{
		char x='0';
		int i=1;				//计数
		int num_0,num_1;//插入位置
		student_Node *q;
		if(n==1)				//这是操作输入数据是需要的,如果插入数据则不需要
		{
			cout<<"是否清空原来数据 0.是的 1.不,添加进去 3.返回 ";
			cin>>x;
			if(x=='1')//添加进去
			{
				Fileread();				//读取文件形成链表
				Putin(0);				//参数的改变,就是插入函数的调用
				return ;
			}
		}
		if(x=='0')
		{
			while(x=='0')
			{
				cout<<i++<<endl;
				student_Node *p=new student_Node;
				cin>>*p;
				if(n!=3)//节点的插法
				{
					p->next=head->next;
					head->next=p;
				}
				else//节点的任意位置插入
				{
					Display(2);
					cout<<"----------------------------------------------------------------"<<endl;
					cout<<"请选择插入位置:";
					cin>>x;
					num_0=x-'0';
					q=head;
					num_1=0;//寻找位置
					while (q->next!=NULL)
					{
						num_1++;
						if(num_0==num_1)
							break;
						q=q->next;
					}
					p->next=q->next;
					q->next=p;
					Display(2);
				}
				cout<<"请问是要继续么?(0.是 1.不是) ";
				cin>>x;
				cout<<"----------------------------------------------------------------"<<endl;
			}
			Filewrite();
		}
	}
	void Display(int x=1)				//显示输出cout<<left<<setw(40)<<"靠左输出"<<left<<setw(35)<<"靠左输出"<<endl;
	{
		if(x==1)
			Fileread();
		cout<<left<<setw(5)<<"·序号·"<<left<<setw(8)<<" ·姓名·"<<left<<setw(15)<<" ·学号·"<<left<<setw(8)<<"·性别·"<<left<<setw(10)<<"·学院·"<<left<<setw(10)<<"·班级·"<<left<<setw(8)<<"|总分|"<<left<<setw(8)<<"|平均分|"<<endl<<endl;
		student_Node *p=head->next;
		int i=1;
		while(p!=NULL)
		{
			cout<<left<<setw(3)<<" "<<left<<setw(3)<<i++<<"    "<<*p;
			p=p->next;
		}
		cin.get();
		cin.get();
	}
	void Insert()				//插入(添加)
	{
		Fileread();				//读取文件形成链表
		Putin(3);				//参数的改变,就是插入函数的调用

	}
	void Delete()				//删除
	{
		Find(2);
		Filewrite();		//写入文件
	}
	void Find(int i=1)			//查找
	{
		Fileread();//读取文件形成链表
		char x='0';
		while(x=='0')
		{
			cout<<"选择查找方式:1.姓名  2.学号  3.学院   0.返回";
			cin>>x;
			switch(x)
			{
			case '1':
				Find_01name(i);
				break;
			case '2':
				Find_02number(i);
				break;
			case '3':
				Find_03academy(i);
				break;
			case '0':return;
			default:
				cout<<"选择错误!!!";
			}
			cout<<"是否继续查找 0.继续 1.不了  ";
			cin>>x;
		}
	}
	void Find_01name(int x=1)	//查找名字 参数 1.查找 2.删除 3.修改
	{
		int i=0;
		string na;
		char x_0='1';
		student_Node *p=head->next,*q=head;
		cout<<"请输入要查找的姓名:";
		cin>>na;
		cout<<left<<setw(5)<<"·序号·"<<left<<setw(8)<<" ·姓名·"<<left<<setw(15)<<" ·学号·"<<left<<setw(8)<<"·性别·"<<left<<setw(10)<<"·学院·"<<left<<setw(10)<<"·班级·"<<left<<setw(8)<<"|总分|"<<left<<setw(8)<<"|平均分|"<<endl<<endl;
		while(p!=NULL)
		{
			if(p->Name==na)
			{
				cout<<left<<setw(3)<<" "<<left<<setw(3)<<i++<<"    "<<*p;
				if(x==2)//删除数据
				{
					cout<<"是否删除这条数据 0.是 1.否";
					cin>>x_0;
					if(x_0=='0')
					{
						q->next=p->next;
						delete p;
						p=q;
					}
				}
				if(x==3)//修改数据
				{
					cout<<"是否修该这条数据 0.是 1.否";
					cin>>x_0;
					if(x_0=='0')
					{
						Modify_small(p);
					}
				}
			}
			
			q=p;
			p=p->next;
		}cout<<"-------------------------------------------------------"<<endl;
		if(i==0)
			cout<<"你能认真点么,没有需要的数据"<<endl;
	}
	void Find_02number(int x=1)//学号查找
	{
		int i=0;
		long num;
		string tmp;
		char x_0='1';
		student_Node *p=head->next,*q=head;
		cout<<"请输入要查找的学号:";
		cin>>tmp;
		num=atol(tmp.c_str());
		cout<<left<<setw(5)<<"·序号·"<<left<<setw(8)<<" ·姓名·"<<left<<setw(15)<<" ·学号·"<<left<<setw(8)<<"·性别·"<<left<<setw(10)<<"·学院·"<<left<<setw(10)<<"·班级·"<<left<<setw(8)<<"|总分|"<<left<<setw(8)<<"|平均分|"<<endl<<endl;
		while(p!=NULL)
		{
			if(p->Number==num)
			{
				cout<<left<<setw(3)<<" "<<left<<setw(3)<<i++<<"    "<<*p;
				if(x==2)//删除数据
				{
					cout<<"是否删除这条数据 0.是 1.否";
					cin>>x_0;
					if(x_0=='0')
					{
						q->next=p->next;
						delete p;
						p=q;
					}
				}
				if(x==3)//修改数据
				{
					cout<<"是否修该这条数据 0.是 1.否";
					cin>>x_0;
					if(x_0=='0')
					{
						Modify_small(p);
					}
				}
			}
			q=p;
			p=p->next;
		}
		cout<<"-------------------------------------------------------"<<endl;
		if(i==0)
			cout<<"你能认真点么,没有需要的数据"<<endl;
	}
	void Find_03academy(int x=1)//学院查找
	{
		int i=0;
		string tmp;
		char x_0='1';
		student_Node *p=head->next,*q=head;
		cout<<"请输入要查找的学院:";
		cin>>tmp;
		cout<<left<<setw(5)<<"·序号·"<<left<<setw(8)<<" ·姓名·"<<left<<setw(15)<<" ·学号·"<<left<<setw(8)<<"·性别·"<<left<<setw(10)<<"·学院·"<<left<<setw(10)<<"·班级·"<<left<<setw(8)<<"|总分|"<<left<<setw(8)<<"|平均分|"<<endl<<endl;
		while(p!=NULL)
		{
			if(p->Academy==tmp)
			{
				cout<<left<<setw(3)<<" "<<left<<setw(3)<<++i<<"    "<<*p;
				if(x==2)
				{
					cout<<"是否删除这条数据 0.是 1.否";
					cin>>x_0;
					if(x_0=='0')
					{
						q->next=p->next;
						delete p;
						p=q;
					}
				}
				if(x==3)//修改数据
				{
					cout<<"是否修该这条数据 0.是 1.否";
					cin>>x_0;
					if(x_0=='0')
					{
						Modify_small(p);
					}
				}
			}
			q=p;
			p=p->next;
		}
		cout<<"-------------------------------------------------------"<<endl;
		if(i==0)
			cout<<"你能认真点么,没有需要的数据"<<endl;
	}
	void Modify()		//修改             界面里加上一些划线增加美观度
	{
		Find(3);
		Filewrite();		//写入文件
	}
	void Modify_small(student_Node *p)
	{
		char a='0';
		string tmp;
		long num;
		while(a=='0')
		{
			cout<<"-------------------------------------------------------"<<endl;
			cout<<"请选择修改选项   1.姓名 2.学号 3.性别 4.学院 5.班级 6.成绩";
            cin>>a;
			cout<<"-------------------------------------------------------"<<endl;
			switch(a)
			{
			case '1':
				cout<<"输入名字:";
				cin>>tmp;
				p->SetName(tmp);
				break;
			case '2':
				cout<<"输入学号:";
				cin>>tmp;
				num=atol(tmp.c_str());
				p->SetNumber(num);
				break;
			case '3':
				cout<<"输入性别:";
				cin>>tmp;
				p->SetSex(tmp);
				break;
			case '4':
				cout<<"输入学院:";
				cin>>tmp;
				p->SetAcademy(tmp);
				break;
			case '5':
				cout<<"请输入班级:";
				cin>>tmp;
				p->SetClass(tmp);
				break;
			case '6':
				p->SetLesson();//修改课程
				break;
			default:
				cout<<"你可爱哦,输错啦,亲~"<<endl;
			}
			cout<<*p;
			cout<<"-------------------------------------------------------"<<endl;//美化视觉效果
			cout<<"是否继续修改其他选项 0.继续 1.不了";
			cin>>a;
		}
	}
	void Sort()			//排序
	{
		Fileread();	
		char t='0';
		while (t=='0')
		{
			cout<<"------------------------------------------------------------"<<endl;
			cout<<"1.学号 2.单科成绩 3.总成绩 0.返回";
			cin>>t;
			switch (t)
			{
			case '1':
				Sort_small(1);break;//学号排序
			case '2':
				Sort_small(2);break;//单科成绩排序
			case '3':
				Sort_small(3);break;//总成绩排序
			default:
				Filewrite();//
				return ;
			}
			Display(0);
			cout<<"是否继续排序 0.继续 1.不了,并保存结果";
			cin>>t;
		}
		Filewrite();		//写入文件
	}
	void Sort_small(int i=1)//排序函数分支,根据参数的不同进行不同选项的排序1.默认学号 2.单科成绩 3.总成绩  
	{
		char t;int x;
		if(i==2)//单科成绩排序时输出
		{
			L.Dislesson();//显示公共课程
			cin>>t;
			x=t-'0';//课程的下标
			if(x>L.n||x<0)
			{
				cout<<"选择错误"<<endl;
				return ;
			}
		}
		cout<<"1.递增 2.递减";
		student_Node *p1,*p2;
		student_Node tmp;
		int flag=1;
		cin>>t;
			while(1)//冒泡排序
			{
				flag=1;
				p1=head->next;p2=p1->next;
				while(p2!=NULL)
				{
					switch (t)
					{
					case '1':
						if(i==3)//总分排序
							if(p1->Less.Mount_s>p2->Less.Mount_s)
							{
								tmp=*p1;
								*p1=*p2;
								*p2=tmp;
								flag=0;
							}
						if(i==2)//成绩排序
							if(p1->Less.lesson[x-1].grade>p2->Less.lesson[x-1].grade)
							{
								tmp=*p1;
								*p1=*p2;
								*p2=tmp;
								flag=0;
							}
						if(i==1)//学号排序
							if(p1->Number>p2->Number)
							{
								tmp=*p1;
								*p1=*p2;
								*p2=tmp;
								flag=0;
							};break;
					case '2':
						if(i==3)//总分排序
							if(p1->Less.Mount_s<p2->Less.Mount_s)
							{
								tmp=*p1;
								*p1=*p2;
								*p2=tmp;
								flag=0;
							}
						if(i==2)//成绩排序
							if(p1->Less.lesson[x-1].grade<p2->Less.lesson[x-1].grade)
							{
								tmp=*p1;
								*p1=*p2;
								*p2=tmp;
								flag=0;
							}
						if(i==1)//学号排序
							if(p1->Number<p2->Number)
							{
								tmp=*p1;
								*p1=*p2;
								*p2=tmp;
								flag=0;
							};break;
					default:
						break;
					}
					
					p1=p1->next;
					p2=p2->next;
				}
				if(flag==1)
					break;
			}
	}

?如需全部代码,关注公众号(coding加油站)回复“C语言学生成绩管理系统”免费领取。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:02:42  更:2022-07-17 16:07:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 21:50:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码