查找成绩不及格的学生

1 题目

函数:search()

功能:查找成绩不及格的学生

描述:有 4 名学生的成绩,找出至少有一科不及格的学生,并将成绩列表输出(规定60以下为不及格)

目标:重点理解 int (*p)[N] 的使用方法

2 思路

int*p[5] 和 int(*p)[5] 的区别

  • int *p[5],首先它是一个数组,它的大小是5,p里面存放的数据都是类型是int *,也就是整型指针。 所以它叫指针数组。

  • int (*p)[5],首先p是一个指针,指向大小为5的数组,因此这叫数组指针。通常用在二维数组的操作上

    • 注意指针的类型,从 int(*p)[5] 可以看到, p 的类型不是int *, 而是 int(*)[5],p 被定义为指向一维数组的指针变量,里面有 5 个元素,因此,p 的基类型是一维数组,长度为 20 字节。
    • *(p+2)+3, 括号中的 2 是指的以 p 的基类型(一维整型数组)的长度为单位的,即,p 每增加 1,地址就增加 20 个字节(5 个元素,每个元素4个字节)。而 *(p+2)+3 括号外的数字 3,不是以 p 的基类型的长度为单位的,而是一维数组的下一个位置
  • 先看一个简单的引例

    #include <stdio.h> 
    
    void search(float (*p)[4], int n) {
    	printf("序号为 %d 的学生的成绩:\n", n);
    	for (int i = 0; i < 4; ++i) {
    		printf("%5.2f ", *(*(p+n)+i));
    	}
    }
    
    int main(int argc, char const *argv[]) {
    	float score[3][4]={{60,75,82,91},{75,81,91,90},{51,65,78,84}};
    	search(score, 2);  // 计算得出序号为 2 的学生的成绩
    	getchar();
    }
    
    ~~~~~~~~~~~操作结果~~~~~~~~~~~~
    $ gcc ex022-1.c -o demo
    ./yaojianguodeMacBook-Pro:C语言100题集合代码 yaojianguo$ ./demo
    序号为 2 的学生的成绩:
    51.00 65.00 78.00 84.00
    

3 代码

#include <stdio.h> 
#include <stdlib.h>
#define N 5

/**
函数:search()
功能:查找成绩不及格的学生
描述:有 4 名学生的成绩,找出至少有一科不及格的学生,并将成绩列表输出(规定60以下为不及格)
**/

int * search(int (*p)[N]) {
	int * pt = *(p+1);
	for (int i = 0; i < 4; ++i) {
		if (*(*(p+0)+i) < 60) {   // 这块可以写成*(*p+i) < 60,也就是平常看到了*(*(p+m)+n))来取到二维数组中列向的值
			pt = *p;
		}
	}
	return pt;
}

int main(int argc, char const *argv[]) {
	int * p;
	int score[][N]={{60,75,82,91},{75,81,91,90},{51,65,78,84},{65,72,78,72},{75,70,98,92}}; 	// 四个学生的成绩
	for (int i = 0; i < N; ++i) {
		p = search(score+i);
		if (p==*(score+i)) {
			printf("成绩不及格学生的成绩分别是:\n");
			for (int j = 0; j < 4; ++j) {
				printf("%d ", *(p+j));
			}			
		}
	}
	getchar();
}

示例结果:

$ gcc ex022.c -o demo
$ ./demo
成绩不及格学生的成绩分别是:
51 65 78 84
posted @ 2021-11-11 16:08  技术leader  阅读(580)  评论(0)    收藏  举报