题目:有一个班4个学生,5门课程。1、求第一门课程的平均分;2、找出有两门课程以上不及格的学生,输出他们的学号和全部课程成绩及平均成绩;3、找出平均成绩在90分以上或全部课程成绩在85分以上的学生。分别编3个函数实现以上3个要求
在这之前,一直对
int (*pointer)[ num ]
这种用法产生了误解,导致在之前的练习中,多次的不正确使用,程序无法正常的运行。
通过这道题目 应该算是有了个比较清楚的认识了。
当有这么有一个数组时:
int (*p)[4];
int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}},
p = a;
int (*p)[4]; 表示定义p为一个指针变量,它指向包含4个整型元素的一维数组
p的类型不是int ,而是 int()[4]型 p被定义为指向一维整型数组的指针变量,一维数组有4个元素,因此P的基类型是一维数组 其长度是16字节。
#include<stdio.h>{
void average(int (*p)[5],int n ); //形参为一维整型数组的指针
void fail(int * p);
void excellent(int *p);
int grades[4][5] = {{68,39,98,45,66},{87,89,93,94,80},{75,65,88,74,59},{99,88,77,87,90}};
//int (*pt)[4] = grades;
average(grades, 4); // 所以这里需要把grades的首地址当实参传给函数
fail(grades,4);
excellent(grades,4);
return 0;
}
void average(int (*p)[5] ,int n){
int i,sum = 0,aver = 0;
for(i=0;i<4;i++){
sum += *(*(p+i)+0);
}
aver = sum/4;
printf("第一门课程的平均分 :%d \n",aver );
printf("\n");
}
void fail(int (*p)[5],int n){
int i,j,count=0,num=0,k;
for(i=0;i<n;i++){
for(j=0;j<5;j++){
if(*(*(p+i)+j) < 60){
count++;
}
}
if(count >= 2){
int sum=0,aver=0;
printf("学号 :%d\n",i+1 );
printf("全部课程的成绩 :");
for(k=0;k<5;k++){
printf("%3d ",*(*(p+i)+k) );
sum += *(*(p+i)+k);
}
printf("\n");
aver = sum/ 5;
printf("平均分 :%d\n",aver );
printf("\n");
}
count = 0;
}
}
void excellent(int (*p)[5],int n){
int i,j,aver=0,sum=0;
for(i=0;i<4;i++){
for(j=0;j<5;j++){
sum += *(*(p+i)+j);
}
aver = sum / 5;
if(aver >90){
printf("%d\n",i+1 );
break;
}
if(*(*(p+i)+0)>85&&*(*(p+i)+1)>85&&*(*(p+i)+2)>85&&*(*(p+i)+3)>85&&*(*(p+i)+4)>85){
printf("%d\n",i+1 );
break;
}
}
}