学生成绩管理系统(c++)

/*3学生成绩管理
基本要求:
定义date类,至少包括年月日;
定义person类,至少包括姓名、性别、身份证号码和出生日期;
定义学生(student)类,从person类派生,至少包括学号、班级和四门功课的成绩。
功能要求:
1、设计菜单实现功能选择;
2、输入功能:输入学生信息,并保存到文件中;
3、计算每个学生的总分与平均分并排序
4、能根据学号修改学生信息
5、能根据学号删除学生信息
6、查询功能:
1)能够根据学号查询学生信息;
2)能够根据姓名、班级查询学生信息
3)统计学生成绩,按照班级和科目计算平均分。*/
#include<iostream>
#include<fstream>
#include<typeinfo>
#include<math.h>
using namespace std;
int Z = 0;//内存学生数
class date
{
public:
	string year;
	string month;
	string day;
};
class person
{
protected:
	string name;
	string sex;
	string idnum;
	date birth;
public:
	person() {}
	~person() {}
};
class student :public person
{
private:
	string stunum;
	string classnum;
	string grade[4];
public:
	string gstunum()
	{
		return stunum;
	}
	string gclassnum()
	{
		return classnum;
	}
	string gname()
	{
		return name;
	}
	string ggrade(int i)
	{
		return grade[i];
	}
	string gsex()
	{
		return sex;
	}
	void snum(string num)
	{
		stunum = num;
	}
	friend istream& operator >>(istream& is, student& ra);
	friend ostream& operator <<(ostream& os, student& ra);
};
void map(student);
void shuru(student);
void baocun(student);
void duqu(student);
void chaxun(student);
void paixu(student);
int  str_int(string);
void chakan(student);
void shangchu(student);
void xiugai(student);
void banjipaiming(student);
istream& operator >>(istream& is, student& ra)
{
	if (typeid(is) == typeid(cin))
	{
		cout << "学号" << endl;
		is >> ra.stunum;
		cout << "班级" << endl;
		is >> ra.classnum;
		cout << "姓名" << endl;
		is >> ra.name;
		cout << "身份证号" << endl;
		is >> ra.idnum;
		cout << "性别" << endl;
		is >> ra.sex;
		cout << "生日年" << endl;
		is >> ra.birth.year;
		cout << "生日月" << endl;
		is >> ra.birth.month;
		cout << "生日日" << endl;
		is >> ra.birth.day;
		cout << "成绩" << endl;
		for (int i = 0; i < 4; i++) {
			is >> ra.grade[i];
		}
	}
	else
	{
		is >> ra.stunum >> ra.classnum >> ra.name >> ra.idnum >> ra.sex >> ra.birth.year >> ra.birth.month >> ra.birth.day;
		for (int i = 0; i < 4; i++)
		{
			is >> ra.grade[i];
		}
	}
	return is;
}
ostream& operator <<(ostream& os, student& ra)
{
	if (typeid(os) == typeid(cout))
	{
		os << "学号 " << ra.stunum << " ";
		os << "班级 " << ra.classnum << " ";
		os << "姓名 " << ra.name << " ";
		os << "身份证号 " << ra.idnum << " ";
		os << "性别 " << ra.sex << " ";
		os << "生日年 " << ra.birth.year << " ";
		os << "生日月 " << ra.birth.month << " ";
		os << "生日日 " << ra.birth.day << " ";
		os << "成绩 " << " ";
		for (int i = 0; i < 4; i++) {
			os << ra.grade[i] << " ";
		}
		os << endl;
	}
	else
	{
		os << ra.stunum << " " << ra.classnum << " " << ra.name << " " << ra.idnum << " " << ra.sex << " " << ra.birth.year << " " << ra.birth.month << " " << ra.birth.day;
		for (int i = 0; i < 4; i++)
		{
			os << " " << ra.grade[i] << " ";
		}
		os << endl;
	}
	return os;
}
void shuru(student stu[])
{
	cin >> stu[Z];
	Z++;
	cout << "输入成功" << endl;
	system("pause");
}
void baocun(student stu[])
{
	ofstream ofs;
	ofs.open("d:\\student.txt");
	int a = Z;
	for (int i = 0; i < a; i++)
	{
		ofs << stu[i];
		Z--;
	}
	ofs.close();
	cout << "保存完成" << endl;
	system("pause");
}
void duqu(student stu[])
{
	ifstream ifs;
	ifs.open("d:\\student.txt");
	while (!ifs.eof())
	{
		ifs >> stu[Z];
		Z++;
	}
	Z--;
	ifs.close();
	cout << "读取完成" << endl;
	system("pause");
}
void chaxun(student stu[])
{
	cout << "请输入学生学号或姓名和班级" << endl;
	string sign;
	cin >> sign;
	for (int i = 0; i < Z; i++)
	{
		if (sign == stu[i].gstunum() || sign == (stu[i].gclassnum() + stu[i].gname()) || sign == (stu[i].gname() + stu[i].gclassnum()))
		{
			cout << stu[i];
			system("pause");
		}
	}
}
void paixu(student stu[])
{
	int mark[100] = { 0 };//学生总成绩
	int paiming[100] = { 0 };//学生排名
	int max = -999999;
	int maxpos = -1;
	int pingjunfen[100];
	for (int i = 0; i < Z; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			mark[i] += str_int(stu[i].ggrade(j));
		}
		pingjunfen[i] = mark[i] / 4;

	}
	for (int i = 0; i < Z; i++)
	{
		for (int j = 0; j < Z; j++)
		{
			if (mark[j] >= max)
			{
				max = mark[j];
				maxpos = j;
			}
		}
		max = -999999;
		mark[maxpos] = -99999999;
		paiming[i] = maxpos;
	}
	cout << "名次" << "  学号" << "    班级" << "    姓名" << "    总分" << "   平均分" << endl;
	for (int i = 0; i < Z; i++)
	{
		cout << "第" << i + 1 << "名  " << stu[paiming[i]].gstunum() << "     " << stu[paiming[i]].gclassnum() << "     " << stu[paiming[i]].gname() << "     " << pingjunfen[paiming[i]] * 4 << "    " << pingjunfen[paiming[i]] << endl;
	}
	system("pause");
}
int str_int(string s)
{
	int sl = s.size();
	char Int[10];
	int wei = 0;
	int ans = 0;
	for (int i = 0; i < sl; i++)
	{
		wei++;
		Int[i] = s[i];
	}
	for (int i = 0; i < sl; i++)
	{
		if (wei != 0)
		{
			ans = ans + (Int[i] - '0') * pow(10, wei - 1);
			wei--;
		}
	}
	return ans;
}
void chakan(student stu[])
{
	for (int i = 0; i < Z; i++)
	{
		cout << stu[i];
	}
	system("pause");
}
void shangchu(student stu[])
{
	cout << "请输入需要删除的学号" << endl;
	string num;
	cin >> num;
	int Intnum = str_int(num);

	if (Intnum == 1)
	{
		for (int i = Z - 1; i >= 1; i--)
		{
			stu[i].snum(stu[i - 1].gstunum());
		}
		for (int i = 0; i < Z; i++)
		{
			stu[i] = stu[i + 1];
		}
		Z--;
		cout << "删除成功" << endl;
		system("pause");
	}
	else if (Intnum == Z)
	{
		Z--;
		cout << "删除成功" << endl;
		system("pause");
	}
	else
	{
		for (int i = Z - 1; i >= Intnum - 1; i--)
		{
			stu[i].snum(stu[i - 1].gstunum());
		}
		for (int i = Intnum - 1; i < Z; i++)
		{
			stu[i] = stu[i + 1];
		}
		Z--;
		cout << "删除成功" << endl;
		system("pause");
	}
}
void xiugai(student stu[])
{
	cout << "请输入要修改的学生学号" << endl;
	int chose;
	cin >> chose;
	cout << stu[chose];
	cout << "请输入要修改的内容" << endl;
	cin >> stu[chose];
}
void banjipaiming(student stu[])
{
	int banji[100] = { 0 };//班级人数
	int classmark[100] = { 0 };//班级总分
	int men[100] = { 0 };//班级男生人数
	int women[100] = { 0 };//班级女生人数
	int classzongpaiming[100] = { 0 };//班级总成绩排名
	int classpingpaiming[100] = { 0 };//班级总成绩排名
	int classpingjun[100] = { 0 };//班级平均分
	int pingjuntemp[100] = { 0 };//平均分暂时存放的地方
	int zongtemp[100] = { 0 };//总分暂时存放的地方
	int classmax = -9999999;//最高分
	int classmaxpos = -1; //最高分位置
	int banjinum = 0;//班级数
	for (int i = 0; i < Z; i++)//i为学生序号
	{
		for (int j = 1; j < 11; j++)//j为班级序号
		{
			if (str_int(stu[i].gclassnum()) == (-1260 + (j - 1) * 100))//如果学生班级号等于j
			{
				banji[j]++;
				if (stu[i].gsex() == "男")
				{
					men[j] ++;
				}
				else
				{
					women[j]++;
				}
				for (int k = 0; k < 4; k++)//k为四门成绩序号
				{
					classmark[j] += str_int(stu[i].ggrade(k));
					zongtemp[j] += str_int(stu[i].ggrade(k));
				}
			}
		}
	}

	for (int i = 1; i < 11; i++)
	{
		if (banji[i] != 0)//班级人数不等于0
		{
			banjinum++;
		}
	}
	for (int j = 1; j <= banjinum; j++)//j为班级序号
	{
		if (banji[j] != 0)
		{
			classpingjun[j] = classmark[j] / banji[j];
			pingjuntemp[j] = classmark[j] / banji[j];
		}
	}
	for (int i = 1; i <= banjinum; i++)//排名,名次
	{
		for (int j = 1; j <= banjinum; j++)//j为班级号
		{
			if (classmark[j] >= classmax)
			{
				classmax = classmark[j];
				classmaxpos = j; //j为班级号
			}
		}
		classmax = -999999;
		classmark[classmaxpos] = -99999999;
		classzongpaiming[i] = classmaxpos;//名次为i的班级号
	}
	for (int i = 1; i <= banjinum; i++)//排名,名次
	{
		for (int j = 1; j <= banjinum; j++)//j为班级号
		{
			if (classpingjun[j] >= classmax)
			{
				classmax = classpingjun[j];
				classmaxpos = j; //j为班级号
			}
		}
		classmax = -999999;
		classpingjun[classmaxpos] = -99999999;
		classpingpaiming[i] = classmaxpos;//名次为i的班级号
	}
	cout << "请输入需要查看的信息" << endl;
	cout << "1-----班级总分排名" << endl;
	cout << "2-----班级平均分分排名" << endl;
	cout << "3-----各班级信息" << endl;//人数,男女数量,总成绩排名
	int chose;
	cin >> chose;
	switch (chose)
	{
	case 1:
		cout << "		班级总分排名" << endl;
		for (int i = 1; i <= banjinum; i++)
		{
			cout << " 第 " << i << " 名      " << classzongpaiming[i] << "班" << "  总分 " << zongtemp[classzongpaiming[i]] << endl;
		}
		break;
	case 2:
		cout << "		班级平均分排名" << endl;
		for (int i = 1; i <= banjinum; i++)
		{
			cout << " 第 " << i << " 名      " << classpingpaiming[i] << "班" << "  平均分 " << pingjuntemp[classpingpaiming[i]] << endl;
		}
		break;
	case 3:
		cout << "		各班级信息" << endl;
		cout << "班级" << "   人数" << "   男  " << "   女 " << "     总分" << "   平均分" << endl;
		for (int i = 1; i <= banjinum; i++)
		{
			cout << i << "班    " << banji[i] << "      " << men[i] << "      " << women[i] << "       " << zongtemp[i] << "    " << pingjuntemp[i] << endl;
		}
		break;
	}
	system("pause");
}
void map(student stu[])
{
	int state = 1;
	while (1)
	{
		cout << "		***************************** 学生成绩管理系统************************************" << endl;
		cout << "		*****************************1-- 输入学生信息*************************************" << endl;
		cout << "		*****************************2-- 保存学生信息*************************************" << endl;
		cout << "		*****************************3-- 读取学生信息*************************************" << endl;
		cout << "		*****************************4-- 查询学生信息*************************************" << endl;
		cout << "		*****************************5-- 查看学生排名*************************************" << endl;
		cout << "		*****************************6-- 修改学生信息*************************************" << endl;
		cout << "		*****************************7-- 删除学生信息*************************************" << endl;
		cout << "		*****************************8-- 查看学生信息*************************************" << endl;
		cout << "		*****************************9-- 查看各班信息*************************************" << endl;
		cout << "		*****************************10-- 退出	     *************************************" << endl;
		int chose;
		cout << endl << "				--------------请输入选择的操作----------------           " << endl;
		cin >> chose;
		switch (chose)
		{
		case 1:shuru(stu); break;
		case 2:baocun(stu); break;
		case 3:duqu(stu); break;
		case 4:chaxun(stu); break;
		case 5:paixu(stu); break;
		case 6:xiugai(stu); break;
		case 7:shangchu(stu); break;
		case 8:chakan(stu); break;
		case 9:banjipaiming(stu); break;
		case 10:state = 0; break;
		}
		system("cls");
		if (state == 0)
		{
			break;
		}
	}
}
int main()
{
	student* p;
	p = new student[100];
	map(p);
	delete[]p;
	return 0;
}

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值