c++编写的学生成绩管理系统

该套代码的功能为学生成绩管理系统,包含学生的基本信息:姓名,性别,生日。 学生的成绩信息:学号,五科成绩,五科课程的名字(不同专业学生有不同的课程),总分,专业,绩点等。 学生成绩管理系统具有以下这些功能: (1)学生成绩的录入:录入新的学生成绩等信息; (2)学生成绩的添加:添加新的学生成绩等信息; (3)学生成绩的删除:删除不需要的学生成绩等信息。 (4)学生成绩的查找:查找你需要的学生成绩等信息。 (5)学生成绩的修改:修改错误的学生成绩等信息。 (6)学生成绩的排序:按学生的绩点排序,排序后结果写入文件。 (7)学生的挂科情况:统计学生成绩小于60的数目。 (8)学生成绩的显示:显示所有学生成绩等信息。 (9)学生成绩的保存:把学生成绩等信息保存到文件。

代码如下

#include<iostream>
#include<fstream>
const int Max=100; 

using namespace std;
class BirthDate{
	public:
	    int year;//年 
	    int month;//月 
	    int day;//日 
		BirthDate();
		BirthDate(int y,int m,int d):year(y),month(m),day(d){}
	    friend istream& operator>>(istream &in,BirthDate &b);
	    friend ostream& operator<<(ostream &out,BirthDate &b);
		void change(int,int,int);//修改
};
class Person 
{
	protected:
		string name;//姓名 
		string sex;//性别 
		BirthDate birth;//生日 
	public:
		Person();
		Person(string n,string s,int y,int m,int d):birth(y,m,d),name(n),sex(s){}
		~Person();
		virtual void display();//输出 
		void input();//输入 
};
class Student:public Person//学生类 
{ 
	protected:
		string id;//学号 
		string course[5];//五门课名
		double score[5];//五门成绩 
		double total;//总分
		static int N;//统计学生数量 
	public:
		Student();
	    Student(string n,string s,int y,int m,int d,string i,string course[5],double score[5],double t);
		~Student();
		friend istream& operator>>(istream &in,Student &s);
		friend ostream& operator<<(ostream &out,Student &s);
		void display();//打印终端 
		void input(Student*);//输入并写入文件 	
}; 
class Undergraduate:public Student//大学生类 
{
	private:
		string major;//专业名 
		double gpa;//绩点 
		static int N;//统计学生数量 
	public:
		static int objectCount;
		Undergraduate();
	    Undergraduate(string n,string s,int y,int m,int d,string i,string course[5],double score[5],double t,string major):Student(n,s,y,m,d,i,course,score,t),major(major){gpa=0;}
		~Undergraduate();
		friend istream& operator>>(istream &in,Undergraduate &s);
		friend ostream& operator<<(ostream &out,Undergraduate &s);
		void display(); //显示 
		void input(Undergraduate*);//导入学生成绩等信息 
		void add(Undergraduate*);//增加 
		void remove(Undergraduate*);//删除 
		friend void search(Undergraduate*);//查找 
		void change(Undergraduate*);//修改 
		bool unique(const Undergraduate*,const string);//判断重复学号 
		friend void sort1(const Undergraduate *s);//排名 
		friend void sling(const Undergraduate*);//挂科 
		void menu(Undergraduate*); //目录 
};
// 初始化类 Box 的静态成员
int Undergraduate::objectCount = 0;

//BirthDate类 
BirthDate::BirthDate()
{
	year=2000;
	month=1;
	day=1;
}
istream& operator>>(istream &in,BirthDate &b)
{
	in>>b.year>>b.month>>b.day;
	return in;
}
ostream& operator<<(ostream &out,BirthDate &b)
{
	out<<b.year<<" "<<b.month<<" "<<b.day;
	return out;
}
void BirthDate::change(int y,int m,int d)//修改 
{
	year=y;
	month=m;
	day=d;
}
//Person类 
Person::Person()
{
	name='0';
	sex='0';
}
Person::~Person()
{	
} 
void Person::display()//输出 
{
	cout<<name<<" "<<sex<<" ";
	cout<<birth<<" ";
}
void Person::input()//输入 
{
	cin>>name>>sex;
	cin>>birth;
}
//Student类 
int Student::N=0;
Student::Student()
{
	id='0';
	 for(int i=0;i<5;i++)
    {
    	course[i]='0';
    	score[i]=0;
	}
	total=0;
}
Student::Student(string n,string s,int y,int m,int d,string i,string c[5],double sc[5],double t):Person(n,s,y,m,d),id(i),total(t)
{
    for(int i=0;i<5;i++)
    {
    	course[i]=c[i];
    	score[i]=sc[i];
	}
} 
Student::~Student()
{
}
istream& operator>>(istream &in,Student &s)
{
	in>>s.name>>s.sex>>s.birth;
	in>>s.id;
	in>>s.course[0]>>s.course[1]>>s.course[2]>>s.course[3]>>s.course[4];
	in>>s.score[0]>>s.score[1]>>s.score[2]>>s.score[3]>>s.score[4];
	return in;
}
ostream& operator<<(ostream &out,Student &s)
{
	out<<s.name<<" "<<s.sex<<" "<<s.birth<<" ";
	out<<s.id<<" "<<s.course[0]<<" "<<s.score[0]<<" ";
	out<<s.course[1]<<" "<<s.score[1]<<" "<<s.course[2]<<" "<<s.score[0]<<" ";
	out<<s.course[3]<<" "<<s.score[3]<<" "<<s.course[4]<<" "<<s.score[4];
	return out; 
}

void Student::display()
{
	Student s[N];
	cout<<"姓名  性别  出生日期  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5  score5"<<endl; 
	ifstream infile("student.dat");
	if(!infile)
	{
		cout<<"open error!"<<endl;
	}
	for(int i=0;i<N;i++)
	{
		infile>>s[i];
		cout<<s[i]<<endl;
	}
    infile.close();
}
void Student::input(Student *s)
{
	int n;
	ofstream outfile("student.dat");
	if(!outfile)
	{
		cout<<"open error!"<<endl;
	}
	cout<<"请输入导入学生人数:"<<endl;
	cin>>n;
	N=n;
	cout<<"请输入学生信息"<<endl; 
	cout<<"姓名  性别  出生日期:年 月 日  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5  score5"<<endl; 
    for(int i=0;i<n;i++)
    {
    	cin>>s[i];
    	outfile<<s[i]<<endl;
	}
    outfile.close();
}

//Undergradu类 
int Undergraduate::N=0;
Undergraduate::Undergraduate()
{
	major='0';
	gpa=0;
}
Undergraduate::~Undergraduate()
{
}
istream& operator>>(istream &in,Undergraduate &s)
{
	in>>s.major;
	in>>s.name>>s.sex>>s.birth; 
	in>>s.id>>s.course[0]>>s.score[0];
	in>>s.course[1]>>s.score[1]>>s.course[2]>>s.score[2];
	in>>s.course[3]>>s.score[3]>>s.course[4]>>s.score[4];
	return in;
} 
ostream& operator<<(ostream &out,Undergraduate &s)
{ 
    out<<s.major<<" ";
    out<<s.name<<" "<<s.sex<<" "<<s.birth<<" "; 
    out<<s.id<<" "<<s.course[0]<<"\t"<<s.score[0]<<"\t";
	out<<s.course[1]<<"\t"<<s.score[1]<<"\t"<<s.course[2]<<"\t"<<s.score[2]<<"\t";
	out<<s.course[3]<<"\t"<<s.score[3]<<"\t"<<s.course[4]<<"\t"<<s.score[4];
    return out;
} 

void Undergraduate::display()
{
	Undergraduate s[N];
	cout<<"专业  姓名  性别  出生日期  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5  score5"<<endl; 
	ifstream infile("Undergraduate.dat");//打开文件 
	if(!infile)
	{
		cout<<"open error!"<<endl;
	}
	for(int i=0;i<N;i++)
	{
		infile>>s[i];//写入文件 
		cout<<s[i]<<endl;//打印终端 
	}
    infile.close();//关闭终端 
}
void Undergraduate::input(Undergraduate *s)//输入 
{
	int n;
	ofstream outfile("Undergraduate.dat");//打开文件 
	if(!outfile)
	{
		cout<<"open error!"<<endl;
	}
	cout<<"请输入导入学生人数:"<<endl;
	cin>>n;
	if(n<0)
	{
		cout<<"输入错误"<<endl;
	 } 
	s[0].N=n;//统计学生人数 
	cout<<"请输入学生成绩等信息"<<endl; 
	cout<<"专业  姓名  性别  出生日期:年 月 日  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5   score5"<<endl; 
    try
	{
		for(int i=0;i<n;i++)
    {
    	cin>>s[i];//输入学生信息 
		if(s[i].score[0]<0||s[i].score[0]>100||s[i].score[1]<0||s[i].score[1]>100||s[i].score[2]<0||s[i].score[2]>100||s[i].score[3]<0||s[i].score[3]>100||s[i].score[4]<0||s[i].score[4]>100)
    	{
    		int a;
    		throw a;
		}
		if(s[i].birth.year<=1980||s[i].birth.month<=0||s[i].birth.month>=12||s[i].birth.day<=0||s[i].birth.day>31)
		{
			BirthDate birth;
			throw birth;
		 } 
		outfile<<s[i]<<endl;//写入文件 
	}
    outfile.close();//关闭文件 
	}
	catch(int)
	{
		cout<<"输入的成绩非法"<<endl;
	}
	catch(BirthDate)
	{ 
	    cout<<"输入出生日期非法"<<endl; 
	}
}
void Undergraduate::add(Undergraduate *s)//增加 
{
    int n; 
	cout<<"请输入要添加的人数"<<endl;
	cin>>n;
    cout<<"专业  姓名  性别  出生日期:年 月 日  学号  课程名1  score1  课程名2  score2  课程名3  score3  课程名4  score4  课程名5  score5"<<endl; 
	ofstream outfile("Undergraduate.dat",ios::app);//打开文件 
	if(!outfile)
	{
		cout<<"open error!"<<endl;
	}
	try
	{
	for(int i=N;i<N+n;i++)
	{
		cin>>s[i];//输入学生信息 
		if(Undergraduate::unique(s,s[i].id))//判断是否输入重复学号 
		{
			cout<<"请重新输入学生成绩等信息:"<<endl;
			cin>>s[i]; 
		}
		if(s[i].score[0]<0||s[i].score[0]>100||s[i].score[1]<0||s[i].score[1]>100||s[i].score[2]<0||s[i].score[2]>100||s[i].score[3]<0||s[i].score[3]>100||s[i].score[4]<0||s[i].score[4]>100)
    	{
    		int a;
    		throw a;
		}
		if(s[i].birth.year<=1980||s[i].birth.month<=0||s[i].birth.month>=12||s[i].birth.day<=0||s[i].birth.day>31)
		{
			BirthDate birth;
			throw birth;
		 } 
		outfile<<s[i]<<endl;//将学生信息写入文件 
    }
    outfile.close();//关闭文件 
	N+=n;//增加学生人数 
    }
	catch(int)
	{
		cout<<"输入的成绩非法"<<endl;
	}
	catch(BirthDate)
	{ 
	    cout<<"输入出生日期非法"<<endl; 
	}
}
void Undergraduate::remove(Undergraduate *s)//删除 
{
	int n;
	string id; 
	bool flag=false;
	cout<<"请输入要删除学生信息的学号:"<<endl;
	while(!flag) 
	{
	cin>>id;
	for(int i=0;i<N;i++)
	{
		if(s[i].id==id)//判断是否找到要删除学生学号 
		{   
		    flag=true;
		    cout<<"学生成绩等信息:"<<endl; 
		    for(int k=0;k<N;k++) //打印到终端 
		    {
		    	cout<<s[k]<<endl;
			}
			for(int j=i;j<N-1;j++)//往前移1为,覆盖该学生信息 
			s[j]=s[j+1];
			cout<<"删除成功!"<<endl; 
			N=N-1;//减少学生人数 
			break;
		}
	} 
	if(!flag)
	{
		cout<<"未找到该学生信息,请重新输入"<<endl; 
	}
}
	ofstream outfile("Undergraduate.dat");//打开文件 
	if(!outfile)
	{
		cout<<"open error!"<<endl;
	}
	cout<<"删除后学生信息表:"<<endl; 
	for(int i=0;i<N;i++)
	{
	outfile<<s[i]<<endl;//写入文件 
	cout<<s[i]<<endl;//打印终端
    }
	outfile.close(); //关闭文件 
}
void search(Undergraduate *s)//查找 
{
	string id; 
	bool flag=false;
	int i,j,count=0;
	int num[5]={-1};
	int N=s[0].N;
	cout<<"请输入要查找学生信息的学号:"<<endl;
	while(!flag)
	{
		cin>>id;
	for(i=0;i<N;i++)
	{
		if(s[i].id==id)//判断是否查找到该学生信息 
		{
			flag=true;
			cout<<"该学生信息:"<<endl;
			cout<<s[i];  
			for(j=0;j<5;j++)
			{
				if(s[i].score[j]<60)
				{
					count++;//统计挂科数 
				}
			}
			cout<<"\t有"<<count<<"门课挂科"<<endl;
			break;
		}
	 } 
	 if(!flag)
    {
    	cout<<"未找到该学生信息,请重新输入学号"<<endl;
    }
    }
}
void Undergraduate::change(Undergraduate *s)//修改 
{
	string id; 
	bool flag=false;
	cout<<"请输入要修改学生信息的学号:"<<endl;
	while(!flag)
	{
	  cin>>id; 
    for(int i=0;i<N;i++)
	{
		if(s[i].id==id)//判断是否找到要修改的学生  
		{
			flag=true;
			cout<<"学生成绩信息表:"<<endl;
			for(int k=0;k<N;k++) 
			{
			   cout<<s[k]<<endl; //打印修改前学生的信息 
		    }
			cout<<"请重新输入该学生信息:"<<endl;
			cin>>s[i];   
			break;
		}
	 } 
	 if(!flag)
	 {
	 	cout<<"未找到该学生信息,请重新输入学号:"<<endl; 
	 }
    }
	ofstream outfile("Undergraduate.dat");//打开文件 
	if(!outfile)
	{
		cout<<"open error!"<<endl;
	}
	cout<<"修改后学生成绩信息表:"<<endl; 
	for(int i=0;i<N;i++)
	{
	outfile<<s[i]<<endl;//将修改后学生信息写入文件 
    cout<<s[i]<<endl;//将修改后信息打印终端 
	}
	outfile.close(); //关闭文件 
}
bool Undergraduate::unique(const Undergraduate *s,const string id)//判断重复学号 
{
		for(int i=0;i<N;i++)
	{
		if(s[i].id==id)
		{
			cout<<s[i].id<<"已存在,请勿输入重复学号的学生信息!"<<endl;
		    return true;
	    }
    }
    return false;
}
void sort1(const Undergraduate *s)//按学生绩点排序 
{
	int i,j,k;
    int N=s[0].N;
	Undergraduate temp,stu[N];
	ifstream infile("Undergraduate.dat");
	 if(!infile)
	{
		cout<<"open error!"<<endl;
	}
	for(i=0;i<N;i++)//从文件读 
	    infile>>stu[i];
	infile.close(); 
	   for(i=0;i<N;i++)//求总分 
	   {
	   	 stu[i].total=0;
	     for(j=0;j<5;j++)
	     {
	     	stu[i].total+=stu[i].score[j];
		 }
		 stu[i].gpa=(stu[i].total/50.0)-5;//求绩点 
	    }
	for(i=0;i<N-1;i++)//按学生绩点冒泡排序 从高到低打印到终端 
	{
		for(j=0;j<N-1-i;j++)
		{
		   if(stu[j].gpa<stu[j+1].gpa) 
		    {
		       temp.name=stu[j].name;temp.sex=stu[j].sex;temp.birth=stu[j].birth;temp.id=stu[j].id;
		       temp.name=stu[j].name;temp.total=stu[j].total;temp.gpa=stu[j].gpa;
		        for(k=0;k<5;k++)
		         {
			       temp.course[k]=stu[j].course[k];
			       temp.score[k]=stu[j].score[k];
		         }
		
		        stu[j].name=stu[j+1].name;stu[j].sex=stu[j+1].sex;stu[j].birth=stu[j+1].birth;stu[j].id=stu[j+1].id;
		        stu[j].name=stu[j+1].name;stu[j].total=stu[j+1].total;stu[j].gpa=stu[j+1].gpa;
		        for(k=0;k<5;k++)
		         {
			       stu[j].course[k]=stu[j+1].course[k];
			       stu[j].score[k]=stu[j+1].score[k];
		         }
		
		        stu[j+1].name=temp.name;stu[j+1].sex=temp.sex;stu[j+1].birth=temp.birth;stu[j+1].id=temp.id;
		        stu[j+1].name=temp.name;stu[j+1].total=temp.total;stu[j+1].gpa=temp.gpa;
		        for(k=0;k<5;k++)
		         {
			       stu[j+1].course[k]=temp.course[k];
			       stu[j+1].score[k]=temp.score[k];
		         }
		    }
	    }
    }
    
	ofstream outfile("Undergraduate_score_list.dat");//打开文件	
	cout<<"姓名 学号 课程名1 score1 课程名2 score2 课程名3 score3 课程名4 score4 课程名5 score5\t绩点"<<endl; 
	for(i=0;i<N;i++) 
	{
	 outfile<<stu[i].name<<" "<<stu[i].id<<" ";//写入文件 
	 cout<<stu[i].name<<" "<<stu[i].id<<" ";//打印终端 
	 for(j=0;j<5;j++)
	 {
	 	outfile<<stu[i].course[j]<<"\t"<<stu[i].score[j]<<"\t";
	 	cout<<stu[i].course[j]<<"\t"<<stu[i].score[j]<<"\t";
	 }
	 outfile<<stu[i].gpa<<endl; 
	 cout<<stu[i].gpa<<endl;
	}
	outfile.close(); //关闭文件 
}

void sling(const Undergraduate *s)//学生挂科情况 
{
	int N=s[0].N;
	int i,j,count=0;
	Undergraduate stu[N];
	ifstream infile("Undergraduate.dat");//打开文件 
	 if(!infile)
	{
		cout<<"open error!"<<endl;
	}
	for(i=0;i<N;i++)//从文件读 
	    infile>>stu[i];
	infile.close(); //关闭文件 
	for(i=0;i<N;i++)
	{
		count=0;
		for(j=0;j<5;j++)
			{
				if(stu[i].score[j]<60)
				{
					count++;//统计挂科数 
				}
			}
		cout<<stu[i]<<"\t"<<"有"<<count<<"门课挂科"<<endl; //打印学生成绩等信息和挂科的情况 
	}
}

void Undergraduate::menu(Undergraduate *s)//学生成绩管理系统菜单 
{
	Undergraduate STU;
	while(1)
	{  
	system("color b1");
	cout<<"*===============================================================================================*"<<endl;
	cout<<"**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&欢迎使用学生成绩管理系统&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&**"<<endl;
	cout<<"**                                    ①输入学生信息                                           **"<<endl;
	cout<<"**                                    ②增加学生信息                                           **"<<endl;
	cout<<"**                                    ③删除学生信息                                           **"<<endl;
	cout<<"**                                    ④查找学生信息                                           **"<<endl;
	cout<<"**                                    ⑤修改学生信息                                           **"<<endl;
	cout<<"**                                    ⑥学生成绩排序                                           **"<<endl;
	cout<<"**                                    ⑦学生挂科情况                                           **"<<endl;
	cout<<"**                                    ⑧显示学生信息                                           **"<<endl;
	cout<<"**                                    〇   退出                                                **"<<endl;
	cout<<"**&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&**" <<endl;
	cout<<"*===============================================================================================*"<<endl;
	cout<<"请输入您要选择的服务种类:( 0 ~ 8)"<<endl; 
	int num;
	cin>>num;
	switch(num)
	{
		case 1 :system("CLS");STU.input(s);system("pause");break;	
		case 2 :system("CLS");STU.add(s);system("pause");break;
		case 3 :system("CLS");STU.remove(s);system("pause");break;
		case 4 :system("CLS");search(s);system("pause");break;
		case 5 :system("CLS");STU.change(s);system("pause");break;
		case 6 :system("CLS");sort1(s);system("pause");break;
		case 7 :system("CLS");sling(s);system("pause");break;
		case 8 :system("CLS");STU.display();system("pause");break;
		case 0 :system("CLS");cout<<"谢谢使用!";exit(0);system("pause");
		default:system("CLS");printf("无效输入!\n\n");system("pause");
	}
	}
}


int main()
{
	Undergraduate undergraduate;
    Undergraduate stu[80]; 
    undergraduate.menu(stu); 

	return 0;
}
这个C++管理系统基本涵盖了“学生成绩管理系统”的所有功能,你可以从中借鉴到C++链表、类、封装、继承、文件操作、排序等等很多知识,极具借鉴意义,以下为本项目的功能介绍: 1. 建立文件 (1)可以使用默认文件名或指定文件名将记录存储到 (2)设置适当的标志位,作为对记录进行操作的 (3)写同名文件将覆盖原来文件的 2.增加学生记录 (1) 可在已有记录后面追加新的记录 (2) 可以随时增加新的记录,它们仅保存在向量数组中 (3) 可以将一个文件读入,追加在已有记录之后 (4) 采取文件追加方式时,在没有保存到文件之前,将继续保持文件追加状态,以便实现连续追加操作方式 3. 新建学生信息文件 (1) 用来新建学生信息记录 (2) 如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存 到一个指定文件,然后重新建立记录 (3) 给出相应的提示信息 4. 显示记录 (1) 如果没有记录可供显示,给出提示信息 (2) 可以随时显示内存中的记录 (3) 显示表头 5. 文件存储 (1) 可以按默认名字或指定名字存储记录文件 6. 读取文件 (1) 可以按默认名字或指定名字将记录文件读入内存 (2) 可以将指定或默认文件追加到现有记录的尾部 (3) 可以将文件连续追加到现有记录并更新记录中的“名次” 7. 删除记录 (1) 可以按“学号”、“姓名”或“名次”方式删除记录 (2) 标志将被删除的记录, 可以再次取消标志, 经确认后删除已经标志的记录(3) 如果记录是空表, 删除时应给出提示信息并返回主菜单 (4) 如果没有要删除的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 删除操作仅限于内存, 只有执行存储操作时, 才能覆盖原记录 8. 修改记录 (1) 可以按“学号”、“姓名”或“名次”方式查找要修改的记录内容 (2) 给出将被修改记录的信息, 经确认后进行修改 (3) 如果记录已经是空表,应给出提示信息并返回主菜单 (4) 如果没有找到需要修改的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 修改操作仅限于内存, 只有执行存储操作时, 才能覆盖原记录 9. 查询记录 (1) 可以按“学号”、“姓名”或“名次”方式查询记录 (2) 能给出查询记录的信息 (3) 如果查询的信息不存在, 输出提示信息 10. 对记录进行排序 (1) 可以按”学号”进行升序和降序排列 (2) 可以按”姓名”进行升序和降序排列 (3) 可以按”名次”进行升序和降序排列 (4) 如果属于选择错误, 可以立即退出程序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值