北邮VC++结构体和指针解决平均分排序问题(含解析和易错分析)

一、问题描述:

已知有3名学生及五门课程的成绩,要求根据学生的各科平均分排序(降序),并输出学生的所有信息和平均分(用指针数组完成)。

输入样例

Jane 90 80 75 60 85
Mark 85 78 98 85 86
Lily 56 65 75 68 80

输出样例

Mark 85 78 98 85 86 86.4
Jane 90 80 75 60 85 78
Lily 56 65 75 68 80 68.8

二、题目解析和回答:

 1、解析:

其实本题思路并不复杂,即构建结构体指针。如果打算把结构体指针当成函数,那么结构体的定义一定要在mian函数以外定义!!!

还有一个难点即是对于结构体数组的交换,这里我也是借鉴了书上的结构(详见C++语言程序设计175页)。即再构建一个指针数组(指针数组在我的前两篇文章中提到,可以去查),这个指针数组里边保存的都是指针,直接相当于对指针输出不同的顺序。所以这个方法比较简单。(我自己用的是结构体内部的调整,将指针传入函数,结果发现很乱,也没有成功,我怀疑可能是地址传递我还没有弄太懂)

下面是代码:

#include<iostream>
#include<string.h>
#include<string>
using namespace std;
struct student
{
	string name;
	int result[5];
	double average;

};//先定义结构体,否则会在函数中报错
void get_average(struct student *m)
{
	for (int i = 0; i < 3; i++)
	{
		int sum = 0;
		for (int j = 0; j < 5; j++)
		{
			sum += (m+i)->result[j];
		}
		(m+i)->average = (double)((double)sum/5);
	}
}

int main()
{

	student s[3];
	for (int i = 0; i < 3; i++)
	{
		cin >> s[i].name;
		for (int j = 0; j < 5; j++)
		{
			cin >> s[i].result[j];
		}
	}
	student *p = s;
	get_average(p);
	student*change[3] = { p,(p + 1),(p + 2) };
//这里是又定义了一个指针数组,对其本身的顺序进行调整,尽量不要用函数!// 
 //因为我觉得函数中传入地址并不意味着它进行的就是地址传递,很有可能并没 
 //有进行(有关这里我比较迷茫,希望我们可以一起讨论)
	student*temp;
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 2 - i; j++)
		{
			if (change[j]->average > change[j + 1]->average)
			{
				temp = change[j];
				change[j] = change[j + 1];
				change[j + 1] = temp;
			}
		}
	for (int i = 2; i >=0; i--)
	{
		cout << change[i]->name<<" ";
		for (int j = 0; j < 5; j++)
		{
			cout << change[i]->result[j] << " ";
		}
		cout << change[i]->average;
		cout << endl;
	}
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芝麻柚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值