前面利用一维数组可以处理一维相关的数据,而对于多组相关数据的处理原则需要使用多维数组。例如,对于如表8-1所示的成绩表,表中任何一个数据都具有两个属性,仪表中第一行第一列的数据97为例,它代表的学号为120310122的学生的成绩。纵向的列表表示的是哪一门课程的成绩,横向的行表示的是哪个学生的成绩。因此,为了明确表示表格中的数据(除最后两行两列的统计数据外)必须使用两个下标:第一个下标用于表示学生的学号(即元素所在的行),第二个下标用于表示课程的编号(即元素所在的列)。
学号/科目 | MT | EN | PH | 学生总分 | 学生平均分 |
---|---|---|---|---|---|
120310122 | 97 | 87 | 92 | 276 | 92 |
120310123 | 92 | 91 | 90 | 273 | 91 |
120310124 | 90 | 81 | 82 | 253 | 84.3 |
120310125 | 73 | 65 | 80 | 218 | 72.7 |
总课程分 | 352 | 324 | 344 | ||
课程平均分 | 88 | 81 | 86 |
(我只进行了简单的演示)
#include <stdio.h>
#define stud_n 40
#define course_n 3
void readscore(int score[][course_n], long sum[], int n);
void averforstud(int score[][course_n], int sum[], float aver[], int n);
void averforcourse(int score[][course_n], int sum[], float aver[], int n);
void prinf(int score[][course_n], long num[], int sums[], float avers[], int sumc[], float averc[], int n);
int main(void)
{
int score[stud_n][course_n], sums[stud_n], sumc[course_n], n;
long num[stud_n];
float avers[stud_n], averc[stud_n];
printf("input the total number of the students(n<=40):");
scanf_s("%d", &n);
readscore(score, num, n);
averforstud(score, sums, avers, n);
averforcourse(score, sumc, averc, n);
prinf(score, num, sums, avers, sumc, averc, n);
}
void readscore(int score[][course_n], long num[], int n)
{
int i, j;
printf("Input student`s ID and score as: MT EN PH\n");
for (i = 0; i < n; i++)
{
scanf_s("%ld", &num[i]);
for (j = 0; j < course_n; j++)
{
scanf_s("%d", &score[i][j]);
}
}
}
void averforstud(int score[][course_n], int sum[], float aver[], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
sum[i] = 0;
for (j = 0; j < course_n; j++)
{
sum[i] = sum[i] + score[i][j];
}
aver[i] = (float)sum[i] / course_n;
}
}
void averforcourse(int score[][course_n], int sum[], float aver[], int n)
{
int i, j;
for (j = 0; j < course_n; j++)
{
sum[j] = 0;
for (i = 0; i < n; i++)
{
sum[j] = sum[j] + score[i][j];
}
aver[j] = float(sum[j]) / n;
}
}
void prinf(int score[][course_n], long num[], int sums[], float avers[], int sumc[], float averc[], int n)
{
int i, j;
printf("Student`s ID\t MT\t EN\t PH\t SUM\t AVER\t");
for (i = 0; i < n; i++)
{
printf("%12ld\t", num[i]);
for (j = 0; j < course_n; j++)
{
printf("%4d\t", score[i][j]);
}
printf("%4d\t% 5.lf\t", sums[i], avers[i]);
}
printf("SumfoCourse\t");
for (j = 0; j < course_n; j++)
{
printf("%4d\t", sumc[j]);
}
printf("\nAverofCourse\t");
for (j = 0; j < course_n; j++)
{
printf("%4.lf\t", averc[j]);
printf("\n");
}
}
本例中的程序定义了如下4个函数:
(1)函数ReadScore()用于从键盘输入学生的学号及其三门课的成绩。
(2)函数AverforStud()用于计算每个学生的总分和平均分。
(3)函数AverforCouse()用于计算每门课程的总分和平均分。
(4)函数Pirnt()用于打印每个学生的学号、各门成绩,总分和平均分。以及每门课的总分和平均分。
在调用这4个函数时,都需要将存储n个学生的三门成绩的二维数组传给函数,这里仍然采用了“传地址调用”的方法,即用数组名作为函数的参数,实际传送的是数组的首地址。