T:某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。考试后要求:
(1)计算每个学生的总分和平均分;
(2)按总分成绩由高到低排出成绩的名次;
(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分;
(4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。
4.12尝试写了一下,能够运行(还会有升级版):
#include <iostream>
#include<iomanip>
using namespace std;
void ar()
{
double sc[30][6] = { 0 }, temp[1][6] = { 0 };
int n, m;
cout << "请输入学生总人数n(0<n<31):" << endl;
cin >> n;
cout << "请按行依次输入学生的序号、该学生的数学、英语和物理成绩:" << endl;
for (int i = 0;i < n; i++)
{
for (int j = 0;j < 4; j++)
{
cin >> sc[i][j];
}
}
for (int i = 0;i < n; i++)
{
for (int j = 1;j < 4; j++)
{
sc[i][4] += sc[i][j];
sc[i][5] = sc[i][4] / 3;
}
}
for (int i = 0;i < n;i++)
{
if (sc[i][4] < sc[i + 1][4])
{
for (int j = 0;j < 6;j++)
{
temp[0][j] = sc[i][j];
sc[i][j] = sc[i + 1][j];
sc[i + 1][j] = temp[0][j];
}
}
}
cout << "成绩从高到低排名列表如下:" << endl;
cout << setw(10) << "序号" << setw(10) << "数学" << setw(10) << "英语" << setw(10) << "物理" << setw(10) << "总分" << setw(10) << "平均分" << endl;
for (int i = 0;i < n;i++)
{
for (int j = 0;j < 6;j++)
{
cout << setw(10) << sc[i][j];
}cout << endl;
}
cout << "请输入你想要查询的学生的序号:" << endl;
cin >> m;
cout << setw(10) << "序号" << setw(10) << "数学" << setw(10) << "英语" << setw(10) << "物理" << setw(10) << "总分" << setw(10) << "平均分" << endl;
for (int i = 0;i < n;i++)
{
if (sc[i][0] == m)
for (int j = 0;j < 6;j++)
cout << setw(10) << sc[i][j];
}
}
int main()
{
ar();
return 0;
}
但是运行完后却报错如下:
Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted 是啥?待续
笑死,刚刚是temp开小了。应该是6才对
升级版明天写写看,把排名加上去
4.13
#include <iostream>
#include<iomanip>
using namespace std;
void ar()
{
double sc[30][6] = { 0 }, temp[1][6] = { 0 };
int n, m;
cout << "请输入学生总人数n(0<n<31):" << endl;
cin >> n;
for (int i = 0;i < n; i++)
{
cout << "请输入学生序号为" << i + 1 << "的学生的数学、英语和物理成绩:" << endl;
for (int j = 1;j < 4; j++)
{
sc[i][0] = double(i) + 1;
cin >> sc[i][j];
}
}
for (int i = 0;i < n; i++)
{
for (int j = 1;j < 4; j++)
{
sc[i][4] += sc[i][j];
sc[i][5] = sc[i][4] / 3;
}
}
for (int i = 0;i < n;i++)
{
if (sc[i][4] < sc[i + 1][4])
{
for (int j = 0;j < 6;j++)
{
temp[0][j] = sc[i][j];
sc[i][j] = sc[i + 1][j];
sc[i + 1][j] = temp[0][j];
}
}
}
cout << "成绩从高到低排名列表如下:" << endl;
cout << setw(10) << "排名" << setw(10) << "学生序号" << setw(10) << "数学" << setw(10) << "英语" << setw(10) << "物理" << setw(10) << "总分" << setw(10) << "平均分" << endl;
for (int i = 0;i < n;i++)
{
cout << setw(10) << i + 1;
for (int j = 0;j < 6;j++)
{
cout << setw(10) << sc[i][j];
}cout << endl;
}
cout << "请输入你想要查询的学生的序号:" << endl;
cin >> m;
cout << setw(10) << "排名" << setw(10) << "学生序号" << setw(10) << "数学" << setw(10) << "英语" << setw(10) << "物理" << setw(10) << "总分" << setw(10) << "平均分" << endl;
for (int i = 0;i < n;i++)
{
if (sc[i][0] == m)
{
cout << setw(10) << i + 1;
for (int j = 0;j < 6;j++)
{
cout << setw(10) << sc[i][j];
}
}
}
}
int main()
{
ar();
return 0;
}
这里又有个小细节,一开始没注意到:
解决方案:
4.13
这种问题明显用动态存储更好。但怎么用?
方法:https://blog.csdn.net/guaiguaihenguai/article/details/78565049
重点:动态二维数组的建立
#include <iostream>
#include<iomanip>
using namespace std;
void ar()
{
double** sc = NULL;
int row = 30;//用于表示行数
int col = 6;//用于表示列数
sc = new double* [row];//开辟一块内存来存放每一行的地址
for (int i = 0; i < row; i++)//分别为每一行开辟内存
sc[i] = new double[col];
double temp[1][6] = { 0 };
int n, m;
cout << "请输入学生总人数n(0<n<31):" << endl;
cin >> n;
for (int i = 0;i < n; i++)
{
cout << "请输入学生序号为" << i + 1 << "的学生的数学、英语和物理成绩:" << endl;
for (int j = 1;j < 4; j++)
{
sc[i][0] = double(i) + 1;
cin >> sc[i][j];
}
}
for (int i = 0;i < n; i++)
{
sc[i][4] = 0;
for (int j = 1;j < 4; j++)
{
sc[i][4] += sc[i][j];
sc[i][5] = sc[i][4] / 3;
}
}
for (int i = 0;i < n;i++)
{
if (sc[i][4] < sc[i + 1][4])
{
for (int j = 0;j < 6;j++)
{
temp[0][j] = sc[i][j];
sc[i][j] = sc[i + 1][j];
sc[i + 1][j] = temp[0][j];
}
}
}
cout << "成绩从高到低排名列表如下:" << endl;
cout << setw(10) << "排名" << setw(10) << "学生序号" << setw(10) << "数学" << setw(10) << "英语" << setw(10) << "物理" << setw(10) << "总分" << setw(10) << "平均分" << endl;
for (int i = 0;i < n;i++)
{
cout << setw(10) << i + 1;
for (int j = 0;j < 6;j++)
{
cout << setw(10) << sc[i][j];
}cout << endl;
}
cout << "请输入你想要查询的学生的序号:" << endl;
cin >> m;
cout << setw(10) << "排名" << setw(10) << "学生序号" << setw(10) << "数学" << setw(10) << "英语" << setw(10) << "物理" << setw(10) << "总分" << setw(10) << "平均分" << endl;
for (int i = 0;i < n;i++)
{
if (sc[i][0] == m)
{
cout << setw(10) << i + 1;
for (int j = 0;j < 6;j++)
{
cout << setw(10) << sc[i][j];
}
}
}
for (int i = 0; i < row; i++)
delete[] sc[i], sc[i] = nullptr;//分别为每一行删除内存
delete[]sc, sc = nullptr;//删除存放每一行的地址的内存
}
int main()
{
ar();
return 0;
}
细节:记得delete(怎么new的就怎么delete,要养成一个习惯,在delete 后把指针赋值为nullptr),
还要手动初始化
告一段落。不过还可以更完善,比如输入数据的判断等……