第10次作业
1.有5名学生,每名学生有语文、数学和外语3门课的考试成绩。编程统计各学生的总分和平均分以及所有学生各科的平均分。要求成绩在程序中初始化,结果以表格的形式输出。
#include<stdio.h> #define M 5 #define N 5 void rscore(int score[M][N]);//成绩输入 void pscore(int score[M][N]);//成绩输出 void gekesum(int score[M][N],int sum[N]);//各科成绩总和 void gekeave(int score[M][N],double ave[M]);//各科平均成绩 void mhave(int score[M][N],double ave[]);//每行平均成绩 int main() { int score[M][N]={0},j; double ave[N]={0}; rscore(score); printf(" 语文 数学 英语 总分 平均\n"); pscore(score); printf("平均 "); mhave(score,ave); for(j=0;j<3;j++) { printf("%.2f\t",ave[j]); } return 0; } void rscore(int score[M][N]) { int i,j; for(i=0;i<M;i++) { printf("请输入第%d个人成绩:\n",i+1); for(j=0;j<3;j++) { scanf("%d",&score[i][j]); } } } void pscore(int score[M][N]) { int i,j,m,sum[M]={0}; double ave[M]={0}; gekesum(score,sum); gekeave(score,ave); for(i=0;i<M;i++) { for(j=0;j<3;j++) { printf("\t%d",score[i][j]); } printf("\t%d",sum[i]); printf("\t%.2f",ave[i]); printf("\n"); } } void gekesum(int score[M][N],int sum[N]) { int j,i,s; for(i=0;i<M;i++) { s=0; for(j=0;j<3;j++) { s+=score[i][j]; } sum[i]=s; } } void gekeave(int score[M][N],double ave[M]) { int j,i,sum; for(i=0;i<M;i++) { sum=0; for(j=0;j<3;j++) { sum+=score[i][j]; } ave[i]=(double)sum/3; } } void mhave(int score[M][N],double ave[]) { int i,j,sum; for(j=0;j<3;j++) { sum=0; for(i=0;i<M;i++) { sum+=score[i][j]; } ave[j]=(double)sum/N; } }
2.求任意方阵每行、每列、两对角线上元素之和。
#include<stdio.h> void printa(int num[3][3]); //输出方阵 void hang(int num[3][3]); //求行 void lie(int num[3][3]); //求列 void dj1(int num[3][3]); //对角1 void dj2(int num[3][3]); //对角2 int main() { int num[3][3]={{8,1,6},{3,5,7},{4,9,2}}; int i,j; printa(num); hang(num); printf("\n"); lie(num); printf("\n"); dj1(num); dj2(num); return 0; } void printa(int num[3][3]) { int m,n; for(m=0;m<3;m++) { for(n=0;n<3;n++) { printf("%2d",num[m][n]); } printf("\n"); } } void hang(int num[3][3]) { int m,n,s; for(m=0;m<3;m++) { s=0; for(n=0;n<3;n++) { s+=num[m][n]; } printf("第%d行的和为%d\t",m+1,s); } } void lie(int num[3][3]) { int m,n,s; for(n=0;n<3;n++) { s=0; for(m=0;m<3;m++) { s+=num[m][n]; } printf("第%d列的和为%d\t",n+1,s); } } void dj1(int num[3][3]) { int m,n,s=0;; for(m=0;m<3;m++) { for(n=0;n<3;n++) { if(m==n) { s+=num[m][n]; } } } printf("左上右下对角线的和为%d\n",s); } void dj2(int num[3][3]) { int m,n,s=0; for(m=0;m<3;m++) { for(n=0;n<3;n++) { if(m+n==2) { s+=num[m][n]; } } } printf("右上左下对角线的和为%d\n",s); }
二、实验总结
1.学习了二维数组,在定义时要有两个括号分别代表行列,行里的数组长度可以省去 但是建议还是写上的好;
2.每定义一个函数都要在后边注释上是干啥的,以方便检查;
3.写程序是要一个函数一个函数的写,每写完一个都要运行一下对不对,这样要比全部写完再检查错误方便;
4.这次作业第二题有一个难的地方就是左下到右上的对角线怎么来求,其实就是 行+列 的和相等,另一条就是行=列,还要弄清各科的平均分和每个人的平均分怎么求。