统分、排序、查分

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),

还要手动初始化

告一段落。不过还可以更完善,比如输入数据的判断等……

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值