总结:1、注意函数调用时如果用到其他函数的变量,要进行参数传递,会写形参和实参,由指针指向;可以在前面定义一些数组,然后由指针分别指向这些数组,那么接下来这些数组和指针都能在其他函数中得到调用;
2、C中函数如果main函数在前面的话一定要声明函数在最前面;
3、函数从main函数执行,因此main函数中的函数调用的顺序很重要,哪个函数在前面很重要
4、本题的排名用排序,然后去判断相等得到排名信息,也可以在sort函数交换数据的时候同时交换学号信息,但是不是很好。
#include<stdio.h>
//*****指针练习,n个学生,每人四门课,计算平均分,查询各科成绩,排名*****//
#define N 10
float score[N][4]={{90,99,97,98},{65,67,70,60},{80,87,90,81}};//存成绩信息,用二维指针
float aver[N]; //存平均成绩,用指针*q指导这
float array1[N]; //存排名信息,用指针*r指到这
//每定义一个指针就要定义一个不管是空的还是非空的数组指向它,不能浮游指针。这四个数组中有三个是初始化用的,没有存东西开始
//float(*p)[4];
void search(float(*p)[4],float*q,float*r);
void average(float(*p)[4],float*q);
void sort(float*r,float*q);
int main(void)
{
average(score,aver);
sort(array1,aver);
search(score,aver,array1);
}
//***********求平均成绩,传递了所有人的成绩并将平均成绩存到指针*q指向的数组float aver[N]中*******************//
void average(float(*p)[4],float*q)
{
int i,j;
for(i=0;i<N;i++)
{
float sum=0.0;
for(j=0;j<4;j++)
sum+=*(*(p+i)+j);
*(q+i)=sum/4;
}
}
//********冒泡排序将平均成绩*********//
void sort(float*r,float*q)
{
//复制*q里面存的平均分
int i,j;float temp;int b[N];
for(i=0;i<4;i++)
*(r+i)=*(q+i);
for(j=0;j<N-1;j++)
{
for(i=0;i<N-1-j;i++)
{
if(*(r+i)<*(r+i+1))//数组元素大小按降序排列
{
temp=*(r+i);
*(r+i)=*(r+i+1);
*(r+i+1)=temp;
}
}
}
}
//*********查找函数找到所有分数,并且将平均成绩和排名都在此函数中输出,注意一些细节*********************////
void search(float(*p)[4],float*q,float*r)//定义二维指针,并将二维数组首地址给它
{ int i,m=0;
printf("Input zhe ID of the student:\t");
scanf("%d",&m);
printf("\nAll the score of the student:\t");
for(i=0;i<4;i++)
{
printf("%5.2f\t",*(*(p+m-1)+i));//要减一
}
printf("\nThe average score of the student:%5.2f\t",*(q+m-1));//要减一
for(i=0;i<N;i++)
{
if(*(q+m-1)==*(r+i))//要减一
printf("\nThe ranking of the student:%d\t",i+1);//sort函数已经排好顺序,现在只要比较就行,相等则就是它的排名,要加一
}
}