/*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;
}
学生成绩管理系统(c++)
最新推荐文章于 2024-05-25 15:32:44 发布