一个简单学生成绩管理系统的实现(C++)

学生成绩管理系统,每个学生是一个记录,包括学号,姓名,性别,3门课程成绩。系统

可以实现以下功能:

1、信息录入:录入学生成绩信息(包括学生学号、姓名、各门课程的成绩等);

2、信息查询:输入学号,查询学生各门课程的成绩,并显示。

3、排序:按各门课程的成绩平均分进行排序,并显示。

4、信息删除与修改——输入学号,删除该学生的成绩信息。

#include<iostream>
#include<string>
#include <iomanip>   //setw()
#include <fstream>   //文件管理
using namespace std;
const int smax=20;    //设置学生最大个数

class StudentData                   //定义基类StudentData
{
	int number;                        //学号 
	string name;                       //名字
	char sex;                          //性别
	double chinese,math,english;       //各科成绩	
	double average;                    //平均分 
public:
    StudentData(int num=0,string name=" ",char sex='f',double chin=0,double math=0,double eng=0,double ave=0);  //构造函数
    void set(int num,string name,char sex,double chin,double math,double eng,double ave);     //设置数据成员的值
    void input();                                         //输入数据成员的值
    void output();                                        //输出数据成员的值
    int  getnumber() {return number;}                           //获取编号
    string getname(){return name; }                       //获取姓名
    char getsex(){return sex;}                            //获取性别
    double getchinese(){return chinese;}                  //获取成绩 
    double getmath(){return math;}
    double getenglish(){return english;}
    double getaverage(){return average;}                        //获取平均分 
};
//类外定义成员函数
StudentData::StudentData(int num,string name,char sex,double chin,double math,double eng,double ave)
{  number=num;
   name=name;
   sex=sex;
   chinese=chin;
   math=math;
   english=eng;
   average=ave;
}
void StudentData::set(int num,string name,char sex,double chin,double math,double eng,double ave)
{  number=num;
   name=name;
   sex=sex;
   chinese=chin;
   math=math;
   english=eng;
   average=ave;
}
void StudentData::input()
{	cout<<"学号(int):";
	    cin>>number;
	cout<<"姓名(string):";
        cin>>name;
	cout<<"性别(男1/女2):";
        cin>>sex;
	cout<<"语文、数学、英语各科成绩(double):";
        cin>>chinese>>math>>english;
    average=(chinese+math+english)/3;
}
 
void StudentData::output()
{   cout<<"学号:"<<setw(6)<<number<<endl;
    cout<<"姓名:"<<setw(6)<<name<<endl;
    if(sex=='1')
      cout<<"性别:"<<setw(6)<<"男 "<<endl;
    else
      cout<<"性别:"<<setw(6)<<"女 "<<endl;
    cout<<"语文:"<<setw(6)<<chinese<<endl<<"数学:"<<setw(6)<<math<<endl<<"英语:"<<setw(6)<<english<<endl;
    cout<<"平均分:"<<setw(6)<<average<<endl;
}             //StudentData类结束

class Management       //定义Management类,用来对学生进行管理
{
	StudentData s[smax];    //用数组s保存所有学生信息
	int top=0;                 //top表示数组中学生数目
public:
    Management(){top=0;}     //构造函数
	以下是管理功能成员函数
    void add();                    //添加人员
    void show();                   //显示人员 
    void total();                  //统计人数
    void change();                 //修改学生信息 
	void change_number();          //按编号修改
    void change_name();              //按姓名修改
    void Delete();                 //删除学生信息 
    void Delete_number();           //按编号删除  
    void Delete_name();               //按姓名删除
    void file();                   //存取菜单
    void save();                    //储存 
    void read();                    //读取 
	void search();                  //查找学生信息 
};
//Management类外定义成员函数/
void Management::add()          //新添加学生
{   if(top>=smax) 
    {cout<<"空间已满,不能添加!"<<endl;
      return;
     }
    StudentData stu;                
    cout<<"正在添加学生......"<<endl;;
    stu.input();
    s[top]=stu;
    for(int i=0;i<top;i++)	
    {if(stu.getnumber()==s[i].getnumber())
     {	cout<<"该编号已存在,添加失败!"<<endl;
	return ;
      }
     }
    cout<<"添加成功!"<<endl;
    cout<<endl;
    top++;     // 调整学生个数
}

void Management::show()         //显示学生信息
{
	if(top==0){cout<<"没有信息!"<<endl;return;}
	for(int i=0;i<top;i++)
		s[i].output();
	cout<<endl;
}

void Management::search() {      //查找学生信息 
	if (top == 0) {
		cout << "无数据" << endl;
		return;
	}
	cout << "请输入所需查询学生的学号";
	int a; cin >> a;
	for (int i = 0; i < top; i++) {
		if (a == s[i].getnumber())
		{
			s[i].output(); cout << endl; return;
		}
		if (a !=s[i].getnumber())
		{
			cout << "无数据请继续" << endl;
		}
		cout << endl;
	}

}

void Management::total()         //统计学生信息 
{int n1=0;
 int n2=0;
 int n3=0;
 int t;
    for(int i=0;i<top;i++)
		if(s[i].getaverage()>=85) n1++;
	for(int i=0;i<top;i++)
		if(s[i].getaverage()>=60) n2++;	
	for(int i=0;i<top;i++)
        if(s[i].getaverage()<60) n3++;
    cout<<"学生总人数为:"<<top<<" 人"<<endl;
    
	/*
	for(int i=0;i<top;i++)
	{
	    for(int j=0;j<=top-i-1;j++)
		{
	       if(s[j].getaverage()>s[j+1].getaverage())
		   {
	       	 t=s[j].getaverage();
			 s[j].getaverage() ==s[j+1].getaverage();
			 s[j+1].getaverage() == t;	 
		   }	
		}
		
		cout<<" "<<s[i].getnumber()<<" "<<s[i].getname()<<" "<<s[i].getsex()<<" "
		<<s[i].getchinese()<<" "<<s[i].getmath()<<" "<<s[i].getenglish()<<" "<<s[i].getaverage()<<endl;
		
	}*/ 
			  
    
	cout<<"平均分超过85的学生人数为:"<<n1<<" 人"<<endl;
	cout<<"平均分超过60的学生人数为:"<<n2<<" 人"<<endl;
	cout<<"平均分低于60的学生人数为:"<<n3<<" 人"<<endl;
}

//修改功能
void Management::change()          //修改子菜单
{
	if (top==0) {cout<<"没有学生信息"<<endl;return;}
	char choice='1';	
	do{
		cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"*        1 : 按学号       2 : 按姓名       0 :返回          *"<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
		cout<<"请输入您的选择:";
		cin>>choice;
		switch(choice)
		{
			case '1':change_number();
				     break;
			case '2':change_name();
				     break;
			case '0':cout<<"您已安全返回!"<<endl;
                                   break;
			default:cout<<"没有此选项,请重选。"<<endl;
                                  break;
		}
	}while(choice!='0');
}


void Management::change_number()        //按编号修改
{
  int x1;
  cout<<"请输入要修改的学生的编号:";
  cin>>x1;
   for(int i=0;i<top;i++)
   {
	  if(s[i].getnumber()==x1)
	  {
		s[i].output();
		cout<<endl;

		s[i].input();
		while(s[i].getnumber()!=x1)
		{
			cout<<"编号不能修改!"<<endl;
		    s[i].input();
		}

		cout<<"修改成功!"<<endl;
		s[i].output();
        return;
	  }
	}
   cout<<"该学员不存在!"<<endl;
}
void Management::change_name()     //按姓名修改
{ char  c;
  bool flag=false;
  string h1;
  cout<<"请输入要修改的学生的姓名:";
  cin>>h1;
  for(int i=0;i<top;i++)
  {
	if(s[i].getname()==h1)
	{   flag=true;
	    s[i].output();
		cout<<endl;
	    cout<<"要修改这条记录吗?(是y/否n)"<<endl;
	    cin>>c;
	    if(c=='y')
	    {int n=s[i].getnumber();
	     s[i].output();
	     cout<<endl;
         s[i].input();
	     while(s[i].getnumber()!=n)
	     {
		    cout<<"编号不能修改!"<<endl;
		    s[i].input();
	     }
	     cout<<"修改成功!"<<endl;
	     s[i].output();
	    }
	    if(c=='n')
	{
		cout<<"取消成功"<<endl;
		return;
	 } 
        } 
  } 
  if(flag)
      cout<<endl<<"按姓名修改执行完毕!"<<endl;
  else
	  cout<<"该学生不存在!"<<endl;
}

//删除功能
void Management:: Delete()             //删除子菜单
{
    if (top==0) {cout<<"****没有学生信息!不能进行删除操作!****"<<endl;return;}
	int choice;	
	do{
		cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"*        1 : 按编号        2 : 按姓名       0 :返回         *"<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
		cout<<"请输入您的选择:";
		cin>>choice;
		switch(choice)
		{
			case 1:Delete_number();
				   break;
			case 2:Delete_name();
				   break;
			case 0:cout<<"您已安全返回."<<endl;
				   break;
			default:cout<<"没有此选项!请重选!"<<endl;
				   break;
		}
	}while(choice!=0);
}
void Management:: Delete_number()          /按编号进行删除
{ 
	char c1;
	int bh,i;
	cout<<"请输入要删除的学生编号:";
	cin>>bh;
	for(i=0;i<top;i++)                    //查找该编号
	{	if(s[i].getnumber()==bh)
		{
			s[i].output();                    
			break;
		}
	}	 
    if(i>=top)
	 {
		    cout<<"无此编号学生!";
            return ;
	 } 
	
    cout<<endl<<"是否删除此项(y/n):";
	cin>>c1;
	if(c1=='y')
	{
		for(int k=i;k<top-1;k++)
		{
			s[k]=s[k+1];               //从i开始,后往前覆盖
		}
		cout<<"删除成功!"<<endl;
		top--;                         //人数减一
		return ;
	}
	if(c1=='n')
	{
		cout<<"取消成功"<<endl;
		return ;
	 } 
}
void Management:: Delete_name()                  /按姓名进行删除
{   bool flag=false;
	char c1;
    string xm;
	cout<<"请输入要删除的学生姓名:";                //查找该姓名
	cin>>xm;
    for(int i=0;i<top;i++)
	{
	 if(s[i].getname()==xm)
	 {  flag=true;
	    s[i].output();
	    cout<<endl<<"要删除这条记录吗?(y/n):"<<endl;
	    cin>>c1;
	    if(c1=='y')
	    {for(int k=i;k<top-1;k++)                     //删除
		{s[k]=s[k+1];}
		cout<<"删除成功!"<<endl;
		top--;                                       //人数减一
		break;
	    }
	    if(c1=='n')
	{
		cout<<"取消成功"<<endl;
		return;
	 } 
    } 
	} 
  if(flag)
      cout<<"按姓名删除执行完毕!"<<endl;
  else
	  cout<<"该学生不存在!"<<endl;
  
}

/  文件管理 /
void Management::file()          //存取子菜单
{
	int choice=1;	
	do{
		cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * "<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"*          1 : 保存        2 : 读入        0 :返回          *"<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
		cout<<"请输入您的选择:";
		cin>>choice;
		switch(choice)
		{
			case 1:save();
				   break;
			case 2:read();
				   break;
			case 0:cout<<"您已安全返回!"<<endl;
				   break;
			default:cout<<"没有此选项!请重选!"<<endl;
				   break;
		}
	}while(choice!=0);
}
void Management::save()        //保存信息至文件
{
    ofstream out("D:\\学生成绩.txt",ios::out);    //假设文件保存为D盘根目录下,文件名:学生成绩.txt
	if (!out)
	{
		cerr<<" 打开失败!"<<endl;
		return;
	}
	for (int i=0;i<top;i++)
	{
		out<<s[i].getnumber()<<"\t";		//写进磁盘保存,以下同理
		out<<s[i].getname()<<"\t";
		out<<s[i].getsex()<<"\t";
		out<<s[i].getchinese()<<"\t";
		out<<s[i].getmath()<<"\t";
		out<<s[i].getenglish()<<"\t";
		out<<s[i].getaverage()<<"\t";		
	}
	cout<<"保存成功!"<<endl;
	cout<<endl;
	out.close();
}
void Management::read()         //从文件读取信息
{
	ifstream in("D:\\学生成绩.txt",ios::in);
	int number;
	char sex;
	string name;
	double chinese,math,english,average;
	if (!in)
	{
		cerr<<"打开失败!"<<endl;
		return ;
	}
	int i=0;
        while(in>>number>>name>>sex>>chinese>>math>>english>>average)  //这种方法可以忽略文件最后的空行,避免while(!in.eof())产生的错误
	{	s[i].set(number,name,sex,chinese,math,english,average);
		i++;
	}
	top=i;
	cout<<"读取成功!"<<endl;
	in.close();
}

int main()
{   Management ma;    //定义人员管理类型对象ma
    int choice=1;
	while(choice!=0)
	{
		cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
		cout<<"*                   欢迎进入学生成绩管理系统                *"<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"*    1.添加         2.查找        3.修改          4.统计    *"<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"*    5.删除         6.显示        7.存取          0.退出    *"<<endl;
		cout<<"*                                                           *"<<endl;
		cout<<"* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *"<<endl;
		cout<<"输入您操作的选项:";
		cin>>choice;
        switch(choice)
		{
			case 1:
			       cout<<"****您选择了:添加功能!****"<<endl;
			       ma.add(); 
				   break;
			case 2:
				   cout<<"****您选择了:查找功能!****"<<endl;
				   ma.search(); 
				   break;	
			case 3:
			       cout<<"****您选择了:修改功能!****"<<endl;
                   ma.change();  
				   break;
			case 4:ma.total();
			       cout<<"****您选择了:统计功能!****"<<endl; 
				   break;
			case 5:
				   cout<<"****您选择了:删除功能!****"<<endl;
				   ma.Delete();
				   break;
			case 6:
			       cout<<"****您选择了:显示功能!****"<<endl;
			       ma.show();
				   break;
			case 7:
				   cout<<"****您选择了:存取功能!****"<<endl;
				   ma.file();
				   break;
		   	case 0:
			      cout<<"****退出成功!****"<<endl;
				  break;
			default:cout<<"****无此选项,请重试!****"<<endl;
				  break;
		}
	}

	cout<<"                     *****谢谢您使用本系统!再见!*****"<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值