⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 学生成绩管理系统源代码.cpp

📁 用链表实现学生成绩管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			while(p->num!=n)
				{
					if(p->next==null)
						{
							cout<<"修改失败."<<endl<<"===>提示:系统里没有关于该学号的资料记录."<<endl;
							return(h);
						}	
					else 
						{
							p=p->next;
						}
				}
			if(p!=null)
				{
					minput(p);
					p->total=p->C_score+p->E_score+p->M_score;
					p->ave1=p->total/3;
					cout<<"修改成功."<<endl;
				}
		}
	h->show_menu(h);
	return(h);
}
Listnode *Listnode::stat(Listnode *p)//统计
{
	float Listnode::ave(Listnode *p,string n);
	Listnode *h;
	h=p;
	if(p==null)
	{ 
		cout<<"出错."<<endl<<"===>提示:没有学生资料的记录."<<endl;
		return(p);
	}
	else
	{
		int n;
	cout<<"1查询全班的数学成绩   2查询全班的外语成绩   3查询全班的C++成绩   4查询个人情况"<<endl;
	cout<<"请输入你的选择:";
	cin>>n;
	if(n==1)
		{
			cout<<"全班数学平均分为:";
			cout<<h->ave(h,"M_score")<<endl;//调用求平均分的函数
			cout<<"全班数学及格率为:";
			cout<<h->pass(h,"M_score")<<"%"<<endl;//调用求及格率的函数
		}
	else if(n==2)
		{
			cout<<"全班外语平均分为:";
			cout<<h->ave(h,"E_score")<<endl;
			cout<<"全班外语及格率为:";
			cout<<h->pass(h,"E_score")<<"%"<<endl;
		}
	else if(n==3)
		{
			cout<<"全班C++平均分为:";
			cout<<h->ave(h,"C_score")<<endl;
			cout<<"全班C++及格率为:";
			cout<<h->pass(h,"C_score")<<"%"<<endl;
		}
	else if(n==4)
		{
			int r=0;
			r=inum(r);
			int count=0;
			if(p==null)
				{
					cout<<"系统里没有学生资料记录."<<endl;
					return(h);
				}
			else
				{
					while(p->num!=r)
						{
							if(p->num==r)
								{
									break;
								}
							p=p->next;
							if(p==null)
								{
									cout<<"没有关于你的资料记录."<<endl;
									return(h);
									break;
								}
						}
				}
			cout<<"学号"<<setw(10)<<"姓名"<<setw(10)<<"性别"<<setw(10)<<"数学"<<setw(10)<<"外语"<<setw(10)<<"C++"<<setw(10)<<"总分"<<setw(10)<<"平均分"<<endl;
			cout<<p->num<<setw(10)<<p->name<<setw(10)<<p->sex<<setw(10)<<p->M_score<<setw(10)<<p->E_score<<setw(10)<<p->C_score<<setw(10)<<p->total<<setw(10)<<p->ave1<<endl;
			cout<<"你的数学为班上第"<<h->position(h, "M_score",p)<<"名"<<endl;
			cout<<"你的外语为班上第"<<h->position(h, "E_score",p)<<"名"<<endl;
			cout<<"你的C++为班上第"<<h->position(h, "C_score",p)<<"名"<<endl;
			cout<<"你的总分为班上第"<<h->position(h, "total",p)<<"名"<<endl;
		}
	else
		{
			cout<<"你的输入有误,请重新输入."<<endl;
			h->stat(h);
		}
	}
	return(h);
}
float Listnode::ave(Listnode *p,string n)//求平均分
{	
	float ave,total=0;
	int count=0;
	if(p==null)
		{
			cout<<"系统里没有学生资料记录."<<endl;
		}
	else {
		while(p!=null)
		{
			if(n == "M_score")
			{
				total=total+p->M_score;
				count++;
				p=p->next;
			}
			if(n == "E_score")
			{
				total=total+p->E_score;
				count++;
				p=p->next;
			}
			if(n == "C_score")
			{
				total=total+p->C_score;
				count++;
				p=p->next;
			}
		}
		ave=total/count;
	}
	return(ave);
}
double Listnode::pass(Listnode *p, string n)//求及格率
{
	int count1=0,count2=0;
	float pass;
	if(p==null)
		{
			cout<<"系统里没有学生资料记录."<<endl;
			return(0);
		}
	else
		{
			while(p!=null)
				{
					if(n=="M_score"&&p->M_score>=60)
					{	
						count1++;
					}
                   	if(n=="E_score"&&p->E_score>=60)
					{
						count1++;
					}
					if(n=="C_score"&&p->C_score>=60)
					{	
						count1++;
					}
					count2++;
					p=p->next;
				}
		}
	pass=count1*100/count2;
	return(pass);
}
int Listnode::position(Listnode *q,string n,Listnode *p)//求个人在班上的名字
{
	Listnode *h;
	h=q;
	int count=0;
	if(q==null)
		{
			cout<<"没有学生资料的记录."<<endl;
			return(0);
		}
	else
		{
			while(q!=null)
				{
					if(n=="M_score"&&(q->M_score>p->M_score))
						{
							count++;
						}
					if(n=="E_score"&&(q->E_score>p->E_score))
						{
							count++;
						}
					if(n=="C_score"&&(q->C_score>p->C_score))
						{
							count++;
						}
					if(n=="total"&&(q->total>p->total))
						{
							count++;
						}
					q=q->next;
				}
		}
	return(++count);
}
Listnode *Listnode::arrange(Listnode *p)//对总分进行排名
{
	Listnode *show_menu(Listnode *);
	Listnode *h,*q,*r,*t;
	int count=0;
	t=q=h=p;
	if(q==null)
		{
			cout<<"===>提示:没有学生资料的记录."<<endl;
			return(q);
		}
    else
		{
			while(q!=null)
				{	
					count++;//用来统计结点个数
					q=q->next;
				}
		}
	delete q;
	r=p->next;
	for(int i=0;i<count-1;i++)//冒泡法排序
		{
			for(int j=i+1;j<count;j++)
				{	
					if(p->total<r->total)
						{
							float t1=p->total;p->total=r->total;r->total=t1;
							float t2=p->ave1;p->ave1=r->ave1;r->ave1=t2;
							float t3=p->C_score;p->C_score=r->C_score;r->C_score=t3;
							float t4=p->M_score;p->M_score=r->M_score;r->M_score=t4;
							float t5=p->E_score;p->E_score=r->E_score;r->E_score=t5;
							int t6=p->num;p->num=r->num;r->num=t6;
							string t7=p->name;p->name=r->name;r->name=t7;
							string t8=p->sex;p->sex=r->sex;r->sex=t8;
						}
					p=p->next;
					r=p->next;
				}
			p=t;
			r=p->next;
		}
	 h->show_menu(h);
	 p=r=t=null;	
	 return(h);
}
Listnode *Listnode::save(Listnode *p)//生成文件保存资料,以便下次接着操作
{
	
	Listnode *h,*q;int count=0;
	q=h=p;
	ofstream outfile("student.txt",ios::out|ios::trunc);
	if(!outfile)
		{
			cerr<<"没有找到文件,导入记录失败."<<endl;
			exit(1);
		}
	if(p==null)
		{
			cerr<<"没有资料导入,导入记录失败."<<endl;
			return(h);
		}
	else
		{
			while(q!=null)
				{
					count++;//统计要保存的记录的条数
					q=q->next;
				}
			outfile<<count<<endl;
			while(p!=null)
				{
					outfile<<p->num<<setw(10)<<p->name<<setw(10)<<p->sex<<setw(10)<<p->M_score<<setw(10)<<p->E_score<<setw(10)<<p->C_score<<setw(10)<<p->total<<setw(10)<<p->ave1<<endl;
					p=p->next;
				}
			delete p;
		}
	outfile.close();
	return(h);
}
Listnode *open()//打开文件,导出记录
{
     Listnode *h=NULL,*p=NULL,*pTemp=NULL;
	 int count=0;
	 ifstream infile("student.txt",ios::in);
	 if (!infile)
		{
			cerr<<"没有找到文件,导出记录失败."<<endl;
			return(h);
		}
	else
		{
			int iCount = 0;
			infile >> iCount;//导出结点个数
			for(int i=0;i<iCount;i++)//用结点个数控制循环次数
				{
					p=new Listnode;
					p->next=NULL;
					infile>>p->num>>setw(10)>>p->name>>setw(10)>>p->sex>>setw(10)>>p->M_score>>setw(10)>>p->E_score>>setw(10)>>p->C_score>>setw(10)>>p->total>>setw(10)>>p->ave1;
					count++;//记录导出记录的条数
					if(h==NULL)
					{
						h=p;
						pTemp=p;
					}
					else
					{
						pTemp->next=p;
						pTemp=p;
					}
				}
			cout<<"正在导出记录。。。。请等待。。。。"<<endl;
			cout<<"导出成功,共导出"<<count<<"条记录"<<endl;
		}
	infile.close();
	return(h);
}
void sfnc(Listnode *p)//释放内存
{
	if(p==null)
		{
			delete p;
		}
	while(p!=null)
		{	
			Listnode *q;
			q=p;
			p=p->next;
			delete q;
		}
}
int main()//主函数
{
    int n,m,e;
	e=password();
	cout<<"请输入密码:";
	cin>>m;
	if(m!=e)//从这里开始判断密码是否正确
		{	
			while(m!=e)
			{	
				cout<<"你输入的密码不正确,请重新输入."<<endl;
				cout<<"请输入密码:";
				cin>>m;
				if(m==e)
					{
						cout<<"欢迎进入学生成绩管理系统."<<endl;
						break;
					}
				password();
				e=password();
			}
		}
	else if(m==e)
		{
			cout<<"欢迎进入学生成绩管理系统."<<endl;//输出欢迎信息
		}
	Listnode student,*p;
	p=open();
	if(p==null)/*如果没有从文件中导出记录,则要控制用记的第一次输入,如果选择对数据的删除查找什么的操作,将会报错。。。*/
		{                                    
			menu();
			cout<<"请你选择操作:";
			cin>>n;
			while(n!=1&&n!=10)
				{
					if(n>1&&n<10)		
						{
							if(n==9)
								{
									announce();
									cout<<"请你选择操作:";
									cin>>n;
								}
							else
								{
									cout<<"在你还没有建立资料库之前,你只能进行1,9或者10操作:";
									cin>>n;
								}
						}		
					else 
						{
							cout<<"===>提示:菜单里没有你输入的选项."<<endl;
							cout<<"你的输入有误,请重新输入:";
							cin>>n;
						}
				}
		if(n==1)
			{
				p=student.creat();
			}
		else 
			{
				exit(0);
			}
		}
	else
		{;}
		do
			{	
				menu();
				cout<<"请你选择操作:";
				cin>>n;
				while(n<=1&&n>=10)
					{
						cout<<"===>提示:菜单里没有你输入的选项."<<endl;
						cout<<"你的输入有误,请重新输入:";
						cin>>n;
					}
		string t;
			
				switch(n)//选择操作,并在每一次操作后返回该操作完成后的头指针,以便保存该操作。。。
					{
						case 1:
							p=student.creat();break;
						case 2:
							p=student.search(p);break;
						case 3:
							p=student.del(p);break;
						case 4:
							p=student.add(p);break;
						case 5: 
							p=student.show_menu(p);break;
						case 6:
							p=student.modify(p);break;
						case 7:
							p=student.stat(p);
							break;
						case 8:
							p=student.arrange(p);break;
						case 9:
							 announce();break;
						case 10:
							cout<<"是否保存资料(Y\\N):";
							cin>>t;
							while((t!="Y"&&t!="y")&&(t!="N"&&t!="n"))//输入大小写的Y或N都可以。。。
								{
									cout<<"===>提示:只能输入大写或小写的Y与N来进选择是否保存."<<endl;
									cout<<"你的输入有误,请重新输入:";
									cin>>t;
								}
							if(t=="Y"||t=="y")
								{
									p=student.save(p);
									cout<<"保存成功,退出系统,再见."<<endl;
									sfnc(p);//保存并释放内存
									exit(0);
								}
							else if(t=="N"||t=="n")
								{
									cout<<"退出系统,再见."<<endl;	
								    sfnc(p);//释放链表内存
									exit(0);
								}
							
						default ://输入选择的操作,如果菜单里没有,报错。。。
							n=0;
							cout<<"===>提示:菜单里没有你输入的选项."<<endl;
							cout<<"你的输入有误,请重新输入."<<endl;
					}
	}		
	while(n<=10);
	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -