C语言小题,在上篇基础上,查找一门以上课程不及格的学生,输出他们的全部课程的成绩。(用指向数组的指针作函数参数)

前言:
此篇是针对 用指向数组的指针作函数参数 的练习。

解题思路:
在主函数中定义二维数组 score ,定义 search 函数实现输出有一门以上课程不及格的学生的全部课程的成绩,形参 p 的类型是 float(*)[4],p是指向包含4个元素的一维数组的指针变量。在调用 search 函数时,用 score 作为实参,它指向 score[0] ,把 score[0] 的地址传给形参 p 。

正文:

#include<stdio.h>
int main() {
	void search(float(*p)[4],int n);		//函数声明 
	float score[3][4]= {{65,57,70,60},{58,87,90,81},{90,99,100,98}};
											//定义二维数组函数score 
											//调用 search 函数 
	search(score,3);
	return 0;
}

void search(float(*p)[4],int n) {	//形参 p 是指向包含4个float型元素的一维数组的指针变量 
	int i,j,flag;
	for(j=0; j<n; j++) {
		flag=0;
		for(i=0; i<4; i++)
			if(*(*(p+j)+i)<60)flag=1;		//*(*(p+j)+i)就是 score[j][i] 
		if(flag==1) {
			printf("No.%d fails,his scores are:\n",j+1);
			for(i=0; i<4; i++)
				printf("%5.1f",*(*(p+j)+i));//输出*(*(p+j)+i)就是输出 score[j][i]的值 
			printf("\n");
		}
	}
}

程序分析:
实参 score 和形参 p 的类型是相同的。在调用 search 函数时,p 得到实参score 的值,即 score[0] 的起始地址,也就是说 p 也指向 score 数组的第1行。然后 p 先后指向各行(每行包括该学生几门课的成绩)。p+j 是 score 数组第 j 行的起始地址,*(p+j) 是 score[j][0] 元素的地址,即&score[j][0], *(p+j)+i 是 score[j][i] 的地址,即&score[j][i] ,search 函数中的 * ( * (p+j)+i) 就是 score[j][i] 。先后检查各学生每门课的成绩,如有不及格的就记录下来。

在函数 search中,变量 flag 用来表示有无不及格的课程。若 flag 的值为1 表示有不及格的课程,若 flag 的值为 0 表示没有不及格的课程。开始时先使 flag=0,若发现某一学生有一门不及格,就使 flag 变为 1 。最后用 if 语句检查 flag ,如为1,则表示该学生有不及格的记录,输出该学生全部课程成绩。变量 j 代表学生号,i 代表课程号。score[j][i] 是序号为 j 的学生第 i 门课的成绩。

总结:
运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级Mr Yin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值