问题1:
a个学生b门课程,可以直接使用二维数组,每一行可以作为一名学生,这一行的所有元素可以作为该学生的所有课程的成绩。
定义一个指针函数search,将主函数(main)的成绩二维数组和需要查询的学生序号n传递给search,并将search中所查找的对应成绩的地址(&scores[n][0]:存放序号为n的学生0的课程的元素地址)返回给主函数。
在主函数中输出成绩。
#include <stdio.h>
int* search(int (*p)[4],int n)
{
return *(p+(n-1));
}
int main()
{
int scores[][4]={{99,82,59,60},
{45,58,76,42},
{60,75,89,100}}; //为了方便,设计三名学生的四门课程。
int n;
int *p;
printf("请输入需要查找的学生序号(1,2,3):");
scanf("%d",&n);
p = search(scores,n); //调用search,返回&scores[n][0]地址
for(int i=0;i<4;i++){
printf("%d ",*p++); //打印相应地址0~3的值
}
return 0;
}
问题2:
该问题需要将二维数组的每一行首地址传递给search函数。在search中遍历比较是否及格(60为及格线),不及格则返回该行首元素地址。
#include <stdio.h>
int *search(int *parr)
{
int *p = NULL; //首先将p的值为NULL;
for(int i=0;i<4;i++){
if(*(parr+i)<60){
p = parr; //若不及格,p则指向该行首元素。
}
}
return p;
}
int main()
{
int scores[3][4]={{99,82,59,60},
{45,58,76,42},
{60,75,89,100}};
int *pt;
for(int i=0;i<3;i++){
pt = search(*(scores+i));
if(pt == *(scores+i)) //判断,若返回的pt不为NULL,则需要输出并打印成绩
{
printf("不及格的学生是:%d 成绩是:",i+1);
for(int j=0;j<4;j++){
printf("%d ",*(pt+j));}
}
printf("\n");
}
return 0;
}