课程首页地址: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 ; }