#include<iostream>
#include<string>
using namespace std;
class Score
{
public:
Score()
{
times = 2;
cout << "Coordinate construction1 called!" << endl;
}
Score(int times1)
{
times = times1;
cout << "Coordinate construction2 called!" << endl;
}
~Score()
{
cout << "Score destruction called!" << endl;
}
string name[100];
//成绩输入
void InputGrade()
{
for (int i = 0; i < times; i++)
{
cout << "请输入学生姓名:" << endl;
cin >> name[i];
cout << "请输入科目A成绩:" << endl;
cin >> Grade[i][0];
cout << "请输入科目B成绩:" << endl;
cin >> Grade[i][1];
cout << "请输入科目C成绩:" << endl;
cin >> Grade[i][2];
}
}
//单科成绩与姓名对应输出
void ShowGrade()
{
cout << "the Grade is:" << endl;
for (int i = 0; i < times; i++)
{
cout << "姓名:" << name[i] << endl;
cout << " 科目A成绩: " << Grade[i][0] << " 科目B成绩: " << Grade[i][1] << " 科目C成绩: " << Grade[i][2] << endl;
}
}
//单科平均成绩计算并输出
void ShowAvgGrade()
{
float avgA = 0;
float avgB = 0;
float avgC = 0;
for (int i = 0; i < times; i++)
{
avgA = avgA + Grade[i][0];
avgB = avgB + Grade[i][1];
avgC = avgC + Grade[i][2];
}
avgA = avgA / times;
avgB = avgB / times;
avgC = avgC / times;
cout << " 科目A的平均成绩:" << avgA << endl;
cout << " 科目B的平均成绩:" << avgB << endl;
cout << " 科目C的平均成绩:" << avgC << endl;
}
//计算每人的平均成绩并输出
void ShowAvgeveryoneGrade()
{
float a[100];
float avgeveryone;
for (int i = 0; i < times; i++)
{
a[i] = Grade[i][0] + Grade[i][1] + Grade[i][2];
avgeveryone = a[i] / 3;
cout << name[i] << "的平均成绩 :" << avgeveryone << endl;
}
}
//对每人的成绩从大到小排序输出
void Showcjpx()
{
string name1[100] = {};
for (int n = 0; n < 3; n++)
{
for (int m = 0; m < times; m++)
{
name1[m] = name[m];
}
if (n == 0)
{
cout << "课程A的成绩排序:" << endl;
}
if (n == 1)
{
cout << "课程B的成绩排序:" << endl;
}
if (n == 2)
{
cout << "课程C的成绩排序:" << endl;
}
for (int i = 0; i < times; i++)
{
float a = {};
for (int j = i + 1; j < times; j++)
{
if (Grade[i][n] < Grade[j][n])
{
a = Grade[i][n];
Grade[i][n] = Grade[j][n];
Grade[j][n] = a;
string Name;
Name = name1[i];
name1[i] = name1[i + 1];
name1[i + 1] = Name;
}
}
}
for (int z = 0; z < times; z++)
{
cout << "姓名:" << name1[z] << "成绩:" << Grade[z][n] << endl;
}
}
}
private:
float Grade[100][3];
int times;
};
int main()
{
Score x;
x.InputGrade();
x.ShowGrade();
x.ShowAvgGrade();
x.ShowAvgeveryoneGrade();
x.Showcjpx();
return 0;
}
运行结果:
实验碰到的问题:
(1):
private:
float Grade[100][3];
int times;
初始写为float Grade[100][100];
导致程序堆栈被占满了,程序的结果无法运行,定义了一大堆无用的堆栈,反复检查了很久才发现错误所在;
(2):
void Showcjpx()
{
string name1[100] = {};
for (int n = 0; n < 3; n++)
{
for (int m = 0; m < times; m++)
{
name1[m] = name[m];
}
if (n == 0)
{
cout << "课程A的成绩排序:" << endl;
}
if (n == 1)
{
cout << "课程B的成绩排序:" << endl;
}
if (n == 2)
{
cout << "课程C的成绩排序:" << endl;
}
for (int i = 0; i < times; i++)
{
float a = {};
for (int j = i + 1; j < times; j++)
{
if (Grade[i][n] < Grade[j][n])
{
a = Grade[i][n];
Grade[i][n] = Grade[j][n];
Grade[j][n] = a;
string Name;
Name = name1[i];
name1[i] = name1[i + 1];
name1[i + 1] = Name;
}
}
}
for (int z = 0; z < times; z++)
{
cout << "姓名:" << name1[z] << "成绩:" << Grade[z][n] << endl;
}
}
}
首先,对于如何将成绩的名字对应起来,尝试了很多方法,例如构造一个结构函数将成绩与人名绑在一起,发现行不通,然后打算重新定义一个数组实现名字的循环,却发现跟成绩无法对应,最后在成绩的循环体内构造姓名循环实现目标。
其次,完成了对姓名的循环之后发现,若第二人比第一人的成绩高,对姓名排序后后面的姓名排名无法与成绩相对应,反复验证后发现是因为第一次循环后,第二次的循环是在第一次的循环的基础上进行的二次排序,就会导致排序混乱。最后,通过在循环内定义一个姓名循环来对排序后的姓名重置,使得每次的排序都可以使成绩和姓名对应。