课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565
【项目6(选做)- 指针版多科成绩计算】(接15周项目4)用二维数组score[][4]保存同学们的高数、英语、C++成绩及总成绩。在此基础上,尽量用指针法访问数组,完成下面的操作:(1)设计输入成绩的函数,输入3科成绩后可以自动求出总分,并将数据全保存到数组中;(2)输出各门课及总分的最高成绩、最低成绩、平均成绩和成绩的标准偏差;(3)作为拓展,自行建立一个文本文件存储这些成绩,完成上面的工作。
提示:各具体功能请设计函数完成,下面的函数原型可以作为参考
void input(double (*s)[4],int n); //输入成绩,n是学生人数
double max(double (*s)[4],int n,int i); //求第i门课的最高成绩,i=3时是总分,下类似
double min(double (*s)[4],int n,int i);
double avg(double (*s)[4],int n,int i);
double stdev(double (*s)[4],int n,int i);
void output(double (*s)[4],int n);
注:我在原题的提示中出错,double max(double (*s)[4],int n,int i)中的s应该是指向一维数组(这个一维有4个double型元素)的指针double (*s)[4],而不是有4个元素的数组(其元素是指向double的指针)double *s[4]。题目中已经更正,特此表示歉意。
参考解答:
#include <iostream>
#include <Cmath>
#include <string>
using namespace std;
double max(double (*a)[4],int m, int j);
double min(double (*a)[4],int m, int j);
double avg(double (*a)[4], int m,int j);
double stdev(double (*a)[4],int m, int j );
void output_result(double (*s)[4],int n);
void input(double (*a)[4],int n); //输入成绩,n是学生人数
void output(double (*a)[4],int n);
int main ()
{
int num;
double score[50][4];
cout<<"请输入同学人数"<<endl;
cin>>num;
input(score,num);
output(score,num);
return 0;
}
/*
函数部分
*/
void input(double (*a)[4],int n) //输入成绩,n是学生人数
{
int i;
for(i=0;i<n;i++)
{
cout<<"请输入学号为"<<i<<"的成绩(高数 英语 C++)"<<endl;
cin>>*(a[i])>>*(a[i]+1)>>*(a[i]+2);//或cin>>a[i][0]>>a[i][1]>>a[i][2];
*(*(a+i)+3)=a[i][0]+a[i][1]+a[i][2];//a[i][3]=a[i][0]+a[i][1]+a[i][2];
}
return ;
}
void output(double (*a)[4],int n)
{
int i;
string course[4]={"高等数学","英语","C++","总分"};
/*输出成绩
*/
cout<<"输入的学生成绩为:"<<endl;
cout<<"学号\t高数\t英语\tC++\t总分"<<endl;
for(i=0;i<n;++i)
{
cout<<i<<'\t'<<a[i][0]<<'\t';
cout<<a[i][1]<<'\t';
cout<<a[i][2]<<'\t';
cout<<a[i][3]<<endl;
}
/*输出各种成绩
*/
for(i=0;i<4;i++)
{
cout<<course[i]<<"的最高成绩是"<<max(a,n,i)<<", ";
cout<<"最低成绩是"<<min(a,n,i)<<", ";
cout<<"平均成绩是"<<avg(a,n,i)<<", ";
cout<<"成绩的标准偏差是"<<stdev(a,n,i)<<endl;
}
output_result(a,n);
return ;
}
double max(double (*a)[4],int m, int j)
{
double p=*(a[0]+j);//或p=a[0][j];
for(int i=1;i<m;i++)
if(p<a[i][j])
p=a[i][j];
return p;
}
double min(double (*a)[4],int m, int j)
{
double s=a[0][j];
for(int i=1;i<m;i++)
if(s>a[i][j])
s=a[i][j];
return s;
}
double avg(double (*a)[4], int m,int j)
{
double sum=a[0][j];
for(int i=1;i<m;i++)
sum=sum+a[i][j];
return sum/m;
}
double stdev(double (*a)[4],int m, int j )
{
double s,x,sum=0;
s=avg(a,m,j);//平均成绩
for(int i=0;i<m;i++)
{
x=a[i][j]-s;
sum+=x*x;
}
return sqrt(sum/(m-1));
}
//输出考得总分最高、最低同学的人数及对应的学号。
void output_result(double (*s)[4],int n)
{
double m=max(s,n,3);
int i,c=0;
bool first=true;
cout<<"总分最高分为"<<m;
for(i=0;i<n;++i)
{
if(s[i][3]==m)//直接用s[i][3]==m可能会因精度而错误
++c;
}
cout<<",有"<<c<<"人达到最高分,他们的学号是:";
for(i=0;i<n;++i)
{
if(s[i][3]==m)
if(first)
{
cout<<i;
first=false;
}
else
{
cout<<"、"<<i;
}
}
cout<<endl;
//关于最低成绩
m=min(s,n,3);
c=0;
first=true;
cout<<"总分最低分为"<<m;
for(i=0;i<n;++i)
{
if(s[i][3]==m)
++c;
}
cout<<",有"<<c<<"人达到最低分,他们的学号是:";
for(i=0;i<n;++i)
{
if(s[i][3]==m)
if(first)
{
cout<<i;
first=false;
}
else
{
cout<<"、"<<i;
}
}
cout<<endl;
return ;
}