一、问题描述:
已知有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;
}