//求三个学生总成绩的平均值,以及找出一个学生的成绩,使用二维数组指针
#include<stdio.h>
int main(){
void aver(float *p,int n);//求总成绩
void search(float (*p)[4],int n);//找出序号为n个学生的成绩
float cj[3][4]={65,67,70,60,80,87,90,81,90,99,100,98};
aver(*cj,12);
search(cj,2);
}
void aver(float *p,int n){
float sum=0,aver;
float *cj_end;
cj_end=p+n-1;
for(;p<=cj_end;p++){
sum=sum+ *(p);
}
aver=sum/n;
printf("平均成绩是:%5.2f\n",aver);
}
void search(float (*p)[4],int n){
printf("第%d个学生的成绩是:\n",n+1);
int i;
for(i=0;i<4;i++){
printf("%5.2f ",*(*(p+n)+i));
}
}
使用二维数组保存三个学生的四门成绩,函数aver实现了计算总成绩的平均值,函数search实现了查找并输出某个学生的成绩;
第一个函数求中成绩,因此指针应指向某个特定的元素,而数组是二维的,因此形参float p,意为指向某个元素的针,实参即为 *cj,若不加**则意为指向第一行的针,加上以后就意为第一行的第一个元素,而后通过指针不断往后移动即可拿到值。
第二个函数要取某个学生四门成绩的值,那么形参就是数组型(*p)[4],实参当然就是指向某一行,所以直接传递数组的地址就是指向第一行的地址。
//查找一门以上不及格的学生并输出其全部的成绩
#include<stdio.h>
int main(){
float cj[3][4]={59,67,70,60,80,87,90,81,90,99,100,98};
void search(float (*p)[4],int n);
search(cj,2);//0 1 2
}
void search(float (*p)[4],int n){
int i,j,flag;
for(j=0;j<=n;j++){
for(i=0;i<4;i++){
if(*(*(p+j)+i)<60){
flag=1;
}
}
if(flag==1){
printf("第%d个学生不及格,他的成绩是:\n",j+1);
for(i=0;i<4;i++){
printf("%5.2f ",*(*(p+j)+i));
}
}
flag=0;
}
}
在上述背景上实现函数search,找出不及格的学生并输出其全部成绩,注意这里的形参不是指向某个元素的指针,而是指向一行元素的指针,因为只有这样才能,在输出这个学生全部成绩的时候直接输出。形参就是二维数组传过去,它默认的就是第一行也就是第一个学生的成绩。
两次循环,第一次是在第j个学生的基础上再遍历这个学生的成绩,一旦有成绩在60以下则将flag标记置为1,而后当flag为1就遍历输出该行元素,要注意每次循环结束以前要将flag置为0,这样才能在下一次判断下一个的学生成绩是否及格起到作用。