项目 7 用指针优化学生成绩排名

76
项项 7 项项项项项项项项项项项

description

项目 7 用指针优化学生成绩排名. 项目 7 用指针优化学生成绩排名. 【 学习目标 】. (1) 了解指针的定义,掌握指针变量的定义与引用。 (2) 掌握用指针实现数组的输入与输出。 (3) 掌握用指针变量作为函数的参数进行传值。 (4) 掌握返回指针值的函数的应用。. 任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出. 任务介绍. 某班进行了高等数学这门课程的考试,现要求用输入某名学生高等数学成绩,并用指针的方式输出。 该学生的高等数学成绩为 98 。 要求输出格式为:. 学生高等数学成绩为: 98.0. 解决思路. 方法: - PowerPoint PPT Presentation

Transcript of 项目 7 用指针优化学生成绩排名

Page 1: 项目 7   用指针优化学生成绩排名

项目 7 用指针优化学生成绩排名

Page 2: 项目 7   用指针优化学生成绩排名

项目 7 用指针优化学生成绩排名【学习目

标】(1) 了解指针的定义,掌握指针变量的定义与引用。(2) 掌握用指针实现数组的输入与输出。(3) 掌握用指针变量作为函数的参数进行传值。(4) 掌握返回指针值的函数的应用。

Page 3: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

任务介绍任务介绍某班进行了高等数学这门课程的考试,现要求用输入某名学生高等数学成绩,并用指针的方式输出。该学生的高等数学成绩为 98 。要求输出格式为:学生高等数学成绩为: 98.0

解决思路方法:S1:输入学生高等数学成绩到变量 score中。S2:将变量 score的地址赋给指针变量 p。S3:输出指针变量 p指向的变量的值。

Page 4: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:#include<stdio.h>void main(){ float score,*p; printf("请输入学生高等数学成绩: \n"); scanf("%f",&score); p=&score; printf("学生高等数学成绩为:%.1f\n",*p);}

Page 5: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

任务实现【运行结果】

由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点如下:(1) 地址和指针的概念。(2) 指向变量的指针变量。

由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点如下:(1) 地址和指针的概念。(2) 指向变量的指针变量。

Page 6: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.1 地址和指针指针的功能如下:

(1) 表示复杂的数据结构。

(2) 动态分配内存。

(3) 方便地使用字符串。

Page 7: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.1 地址和指针指针的功能如下:

(4) 方便地使用数组。

(5) 使用函数时能得到多于 1 个的值。

(6) 能直接处理内存地址。

Page 8: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.1 地址和指针

图 7-1 指针

Page 9: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。在 C 语言中,用“ *” 符号表示“指向”。例如:

变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。在 C 语言中,用“ *” 符号表示“指向”。例如:int i=3;int *pointer;pointer=&i;

pointer 代表指针变量,而 *pointer 表示 pointer 所指向的变量,也就是变量 i 。pointer 代表指针变量,而 *pointer 表示 pointer 所指向的变量,也就是变量 i 。

Page 10: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.1 定义一个指针变量指针变量的定义包含 3 个方面的内容:指针变量的定义包含 3 个方面的内容:

Page 11: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.1 定义一个指针变量

语法:语法:基类型 * 指针变量名

下面都是合法的定义:下面都是合法的定义:

int *pointer1 (指向整型变量的指针变量 )

float *pointer2

(指向实型变量的指针变量 )

char *pointer3   

(指向字符型的指针变量 )

Page 12: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.1 定义一个指针变量

一个指针变量如何指向另一个变量呢?下面使用赋值语句使一个指针变量指向一个整型变量。一个指针变量如何指向另一个变量呢?下面使用赋值语句使一个指针变量指向一个整型变量。

int i=3;int *pointer1;pointer1=&i;

将变量 i 的地址放到指针变量 pointer1 中,因此, pointer1 就“指向”了变量 i 。将变量 i 的地址放到指针变量 pointer1 中,因此, pointer1 就“指向”了变量 i 。

Page 13: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.2 指针变量的引用

指针变量中只能存放地址 (指针 ),不要将一个整型量 (或任何其他非地址类型的数据 )赋给一个指针变量。下面的赋值是不合法的:

指针变量中只能存放地址 (指针 ),不要将一个整型量 (或任何其他非地址类型的数据 )赋给一个指针变量。下面的赋值是不合法的:

int *pointer1;pointer1=100;

Page 14: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.2 指针变量的引用

有两个相关的运算符:有两个相关的运算符:

(1)  &:取地址运算符。

(2)  *:指针运算符 (或称“ ”间接访问 运算符 )。

Page 15: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.2 指针变量的引用【例 7-1 】通过指针变量访问整型变量。【例 7-1 】通过指针变量访问整型变量。

程序如下:#include <stdio.h>void main(){ int a,b; int *pointer1,*pointer2; /*声明两个整型的指针变量 */ a=3;b=5; pointer1=&a; /*把变量 a的地址赋给pointer1*/

Page 16: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.2 指针变量的引用【例 7-1 】通过指针变量访问整型变量。【例 7-1 】通过指针变量访问整型变量。

程序如下: pointer2=&b; /*把变量 b的地址赋给pointer2*/ printf("a=%d,b=%d\n",a,b); printf("a=%d,b=%d\n",*pointer1,*pointer2);}

Page 17: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.2 指针变量的引用

【运行结果】【运行结果】

【运行结果】【运行结果】程序中有两处出现 *pointer1 和 *pointer2 。程序第二行的 *pointer1 和 *pointer2 表示定义两个指针变量pointer1 和 pointer2 。它们前面的“ *” 只是表示该变量是指针变量。程序最后一行 printf 函数中的 *pointer1 和*pointer2 代表变量,即 pointer1 和 pointer2 所指向的变量。

程序中有两处出现 *pointer1 和 *pointer2 。程序第二行的 *pointer1 和 *pointer2 表示定义两个指针变量pointer1 和 pointer2 。它们前面的“ *” 只是表示该变量是指针变量。程序最后一行 printf 函数中的 *pointer1 和*pointer2 代表变量,即 pointer1 和 pointer2 所指向的变量。

Page 18: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.2 指针变量的引用

【例 7-2 】输入 a 和 b 两个整数,按从小到大的顺序输出 a 和 b 。【例 7-2 】输入 a 和 b 两个整数,按从小到大的顺序输出 a 和 b 。

程序如下:#include<stdio.h>void main(){ int a,b; int *pointer1,*pointer2,*p; /*声明 3个整型的指针变量 */ printf("请输入两个整数: "); scanf("%d,%d",&a,&b); pointer1=&a; /*把变量 a的地址赋给pointer1*/

Page 19: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.2 指针变量的引用

pointer2=&b; /*把变量 b的地址赋给pointer2*/ if(a>b) { p=pointer1; pointer1=pointer2; pointer2=p; } printf("a=%d,b=%d\n",a,b); printf("min=%d , max=%d\n",*pointer1,*pointer2);}

Page 20: 项目 7   用指针优化学生成绩排名

任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出

7.1.2 指向变量的指针变量7.1.2.2 指针变量的引用

【运行结果】【运行结果】

【运行结果分析】【运行结果分析】a 与 b 的值并没有交换,但 pointer1 与 pointer2 的值交换了。 pointer1 原来的值为 &a ,后来变成了 &b ;pointer2 原来的值为 &b ,后来变成了 &a 。通过交换两个指针变量的值,改变了指针变量的指向。

a 与 b 的值并没有交换,但 pointer1 与 pointer2 的值交换了。 pointer1 原来的值为 &a ,后来变成了 &b ;pointer2 原来的值为 &b ,后来变成了 &a 。通过交换两个指针变量的值,改变了指针变量的指向。

Page 21: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

任务介绍任务介绍某班进行了高等数学这门课程的考试,现要求用输入第一组 10名学生高等数学成绩,并用指针的方式输出。第一组学生的高等数学成绩分别为 86 、 75 、 91 、 62 、 82 、56 、 95 、 89 、 66 、 82要求输出格式为:第一小组学生的高等数学分数分别为:86.0,75.0,91.0,62.0,82.0,56.0,95.0,89.0,66.0,82.0

解决思路方法:S1:输入学生高等数学成绩到变量数组 scores中。S2:将变量 scores的首地址赋给指针变量 p。S3:输出指针变量 p指向一维数组中每个元素的值。

Page 22: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:#include<stdio.h>void main(){ int i; float scores[10],*p; printf("请输入第一小组学生高等数学成绩: \n"); for(i=0;i<10;i++) { scanf("%f";&scores[i]); } p=scores;

Page 23: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: printf("第一小组学生的高等数学分数分别为: "); for(i=0;i<10;i++) { printf("%.1f , ",*(p+i)); }}

Page 24: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

任务实现【运行结果】

由上面的代码可以看出,要实现这个任务,需要掌握如下知识点:(1) 指向数组和数组元素的指针。(2) 通过指针引用数组元素。(3) 一维数组的指针作为函数参数。

由上面的代码可以看出,要实现这个任务,需要掌握如下知识点:(1) 指向数组和数组元素的指针。(2) 通过指针引用数组元素。(3) 一维数组的指针作为函数参数。

Page 25: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.1 指向数组和数组元素的指针

Page 26: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素

Page 27: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【例 7-5 】数组元素的访问。【例 7-5 】数组元素的访问。

程序如下:void main(){ int a[10],i; int *p; printf("请输入 10个整数,整数之间用空格隔开: \n"); for(int i=0;i<10;i++) { scanf("%d",&a[i]); } /*使用下标法访问数组各个元素 */

Page 28: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【例 7-5 】数组元素的访问。【例 7-5 】数组元素的访问。

程序如下: printf("使用下标法输出数组各个元素为: "); for(int i=0;i<10;i++) { printf("%d ",a[i]); } printf("\n"); /*使用数组名访问数组各个元素 */ printf("使用数组名输出数组各个元素为: "); for(int i=0;i<10;i++) {

Page 29: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【例 7-5 】数组元素的访问。【例 7-5 】数组元素的访问。

程序如下: printf("%d",*(a+i)); } printf("\n"); /*使用指针变量访问数组各个元素 */ p=a; printf("使用指针变量输出数组各个元素为: "); for(int i=0;i<10;i++) { printf("%d",*(p+i));

Page 30: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【例 7-5 】数组元素的访问。【例 7-5 】数组元素的访问。

程序如下: } printf("\n");}

Page 31: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【运行结果】【运行结果】

【运行结果】【运行结果】

使用指针变量访问数组各个元素比利用下标法和数组名访问数组各个元素都要快,用指针变量直接指向元素,不必每次都重新计算地址,能大大提高执行效率。

使用指针变量访问数组各个元素比利用下标法和数组名访问数组各个元素都要快,用指针变量直接指向元素,不必每次都重新计算地址,能大大提高执行效率。

Page 32: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【例 7-6 】通过指针变量输入 5 个整数到数组 b 并输出。【例 7-6 】通过指针变量输入 5 个整数到数组 b 并输出。

程序如下:#include<stdio.h>void main(){ int b[10]; int *p; int i; p=b; printf("请输入 5个整数: ");

Page 33: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【例 7-6 】通过指针变量输入 5 个整数到数组 b 并输出。【例 7-6 】通过指针变量输入 5 个整数到数组 b 并输出。

程序如下: for(i=0;i<5;i++) { scanf("%d",p++); } for(i=0;i<5;i++) { printf("%d",*p++); } printf("\n");}

Page 34: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【运行结果】【运行结果】

【运行结果】【运行结果】显然输出的值不是数组 b中各元素的值。原因是指针变量的初始值为数组 b的首地址,但经过第一次 for循环读入数据后, p已指向了 b数组的第五个元素处。因此,在执行第二个 for循环时, p的起始值已经不是数组的首地址了,而是 b+5。而数组 b下面的 5个元素,在存储单元中的值是不可预料的。

显然输出的值不是数组 b中各元素的值。原因是指针变量的初始值为数组 b的首地址,但经过第一次 for循环读入数据后, p已指向了 b数组的第五个元素处。因此,在执行第二个 for循环时, p的起始值已经不是数组的首地址了,而是 b+5。而数组 b下面的 5个元素,在存储单元中的值是不可预料的。

Page 35: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素解决这个问题,需要在第二个 for 循环之前重新让指针变量指向数组 b 的首地址。解决这个问题,需要在第二个 for 循环之前重新让指针变量指向数组 b 的首地址。

程序如下:#include<stdio.h>void main(){ int a[5]; int *p; int i; p=a; printf("请输入 5个整数: ");

Page 36: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素for(i=0;i<5;i++) { scanf("%d",p++); } p=a; for(i=0;i<5;i++) { printf("%d ",*p++); } printf("\n");}

Page 37: 项目 7   用指针优化学生成绩排名

任务 7.2 用指针优化多名学生一门课程成绩的输入 / 输出

7.2.2 通过指针引用数组元素【运行结果】【运行结果】

【运行结果】【运行结果】

将 ++ 和 -- 运算符用于指针变量十分有效,可以使指针变量自动向前或向后移动,指向下一个或上一个元素。将 ++ 和 -- 运算符用于指针变量十分有效,可以使指针变量自动向前或向后移动,指向下一个或上一个元素。

Page 38: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

任务介绍任务介绍某班进行了高等数学、大学英语这两门课程的考试,现要求用输入第一组 10 个学生高等数学与大学英语的成绩,并用指针的方式输出。第一组学生的高等数学成绩分别为 86 、 75 、 91 、 62 、 82 、56 、 95 、 89 、 66 、 82第一组学生的大学英语成绩别为82 、 85 、 73 、 78 、 75 、 89 、 84 、 79 、 96 、 63

Page 39: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

任务介绍任务介绍要求输出格式为:86 82 75 85 91 73 62 78 82 75 56 89 95 84 89 79 66 96 82 63高等数学 大学英语86.0 82.075.0 85.091.0 73.062.0 78.082.0 75.056.0 89.095.0 84.089.0 79.066.0 96.082.0 63.0

Page 40: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

解决思路方法:S1:输入学生高等数学成绩到二维数组 scores中。S2:将变量 scores的首地址赋给指针变量 p。S3:输出指针变量 p指向二维数组中每个元素的值。

Page 41: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:#include<stdio.h>void main(){ float scores[10][2]; int i,j; float (*p)[2]; p=scores; printf("请输入 10个学生课程成绩: \n"); for(i=0;i<10;i++) { for(j=0;j<2;j++) {

Page 42: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: scanf("%f",*(p+i)+j); } } printf("高等数学 大学英语 \n"); for(i=0;i<10;i++) { for(j=0;j<2;j++) { printf("%.1f",*(*(p+i)+j)); } printf("\n"); }}

Page 43: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

任务实现【运行结果】

由上面的代码可以看出,要实现这个任务,需要掌握如下知识点:(1) 多维数组的地址。(2) 指向多维数组的指针变量。(3) 多维数组的指针作函数参数。

由上面的代码可以看出,要实现这个任务,需要掌握如下知识点:(1) 多维数组的地址。(2) 指向多维数组的指针变量。(3) 多维数组的指针作函数参数。

Page 44: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.1 多维数组的地址前面我们学过二维数组,假设有一个二维数组 a ,它有 3 行 4列。例如:int a[3][4]={{0,2,4,6},{8,10,12,14},{16,18,20,22}};

Page 45: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.2 指向多维数组的指针变量7.3.2.1 指向数组元素的指针变量【例 7-8 】用指针变量输出二维数组各元素的值。【例 7-8 】用指针变量输出二维数组各元素的值。

程序如下:#include<stdio.h>void main(){ int a[3][4]={{0,2,4,6},{8,10,12,14},{16,18,20,22}}; int *p; int i,j; p=a[0]; for(i=0;i<3;i++)

Page 46: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.2 指向多维数组的指针变量7.3.2.1 指向数组元素的指针变量【例 7-8 】用指针变量输出二维数组各元素的值。【例 7-8 】用指针变量输出二维数组各元素的值。

程序如下: { for(j=0;j<4;j++) { printf("%5d",*(p+i*4+j)); } printf("\n"); }}

Page 47: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.2 指向多维数组的指针变量7.3.2.1 指向数组元素的指针变量

【运行结果】【运行结果】

【运行结果】【运行结果】

指针变量 p指向二维数组的第 0行第 0列元素,也就是二维数组的首地址,首地址加上各个元素在数组中的相对位移,而元素在二维数组中的相对位移的计算公式为i*m+j,其中,m为二维数组的列数。

指针变量 p指向二维数组的第 0行第 0列元素,也就是二维数组的首地址,首地址加上各个元素在数组中的相对位移,而元素在二维数组中的相对位移的计算公式为i*m+j,其中,m为二维数组的列数。

Page 48: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.2 指向多维数组的指针变量7.3.2.2 指向由 m 个元素组成的一维数组的指针变量

(1) 语法。(1) 语法。

数据类型 (* 指针变量 )[ 常量 / 常量表达式 ]

例如:例如:

int (*p)[4];

(2) 语义。(2) 语义。表示 p 是一个指针变量,它指向包含 4 个元素的一维数组。注意 *p 两侧的括号不能少。表示 p 是一个指针变量,它指向包含 4 个元素的一维数组。注意 *p 两侧的括号不能少。

Page 49: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.2 指向多维数组的指针变量7.3.2.2 指向由 m 个元素组成的一维数组的指针变量【例 7-9 】同例 7-8 ,要求使用指向一维数组的指针变量。【例 7-9 】同例 7-8 ,要求使用指向一维数组的指针变量。

程序如下:#include<stdio.h>void main(){ int a[3][4]={{0,2,4,6},{8,10,12,14},{16,18,20,22}}; int (*p)[4]; int i,j; p=a;

Page 50: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.2 指向多维数组的指针变量7.3.2.2 指向由 m 个元素组成的一维数组的指针变量【例 7-9 】同例 7-8 ,要求使用指向一维数组的指针变量。【例 7-9 】同例 7-8 ,要求使用指向一维数组的指针变量。

程序如下: for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("%4d",*(*(p+i)+j)); } printf("\n"); }}

Page 51: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.2 指向多维数组的指针变量7.3.2.2 指向由 m 个元素组成的一维数组的指针变量

【运行结果】【运行结果】

Page 52: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.3 多维数组的指针作函数参数

(1) 用指向变量的指针变量。

(2) 用指向一维数组的指针变量。

Page 53: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.3 多维数组的指针作函数参数【例 7-10】计算二维整型数组中奇数的个数。【例 7-10】计算二维整型数组中奇数的个数。

程序如下:#include<stdio.h>void main(){ int i,j; int count(int(*p)[4],int n); int a[3][4]={{5,2,3,6},{9,10,-12,13},{17,18,-23,22}}; for(i=0;i<3;i++) { for(j=0;j<4;j++) {

Page 54: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.3 多维数组的指针作函数参数 printf("%5d",a[i][j]); } printf("\n"); } printf("奇数的个数为:%d\n",count(a,3));}int count (int (*p)[4],int n){ int temp=0; int i,j;

Page 55: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.3 多维数组的指针作函数参数 for(i=0;i<n;i++) { for(j=0;j<4;j++) { if(*(*(p+i)+j)%2!=0) { temp++; } } } return temp;}

Page 56: 项目 7   用指针优化学生成绩排名

任务 7.3 用指针实现多名学生多门课程成绩的输入 / 输出

7.3.3 多维数组的指针作函数参数【运行结果】【运行结果】

Page 57: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

任务介绍任务介绍某班进行了高等数学、大学英语、 C 语言程序设计 3 门课程的考试,现要求用指针实现第一组 4 个学生的成绩输入 / 输出以及输出每门课程成绩的最高分。第一组学生的高等数学成绩分别为 86 、 75 、 91 、 62第一组学生的大学英语成绩分别为 56 、 95 、 89 、 66第一组学生的 C 语言程序设计成绩分别为 76 、 83 、 61 、 88要求输出格式为:学生成绩单为: 86 56 76 75 95 83 91 89 61 62 66 83各科最高分为: 91 95 83

Page 58: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

解决思路方法:S1:输入学生高等数学成绩到变量数组 scoes中。S2:将变量 scores的首地址赋给指针变量 p。S3:利用指针变量输出成绩单。S4:计算每门课程的最高分。S5:输出每门课程的最高分。

Page 59: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

任务实现根据上述的解决思路和相关知识点,具体程序实现如下:#include<stdio.h>void main(){ void Output(float (*p)[3],int n); /*输出学生成绩子函数 */ float *Max(float *p,int row,int col); /*计算成绩最高分*/ int i,j; float *p; float scores[4][3]={{86,56,76},{75,95,83},{91,89,61},{62,66,83}}; printf("学生成绩单为: \n");

Page 60: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: Output(scores,4); printf("各科最高分为: \n"); p=Max(scores[0],4,3); for(i=0;i<3;i++) { printf("%6.0f\t",*(p+i)); } printf("\n");}void Output(float (*p)[3],int n){ int i,j;

Page 61: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: for(i=0;i<n;i++) { for(j=0;j<3;j++) { printf("%6.0f\t",*(*(p+i)+j)); } printf("\n");

Page 62: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: }}float *Max(float *p,int row,int col){ static float max[3]; int i,j; for(j=0;j<col;j++) }}float *Max(float *p,int row,int col){ static float max[3];

Page 63: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

任务实现根据上述的解决思路和相关知识点,具体程序实现如下: int i,j; for(j=0;j<col;j++){ max[j]=*(p+j); for(i=1;i<row;i++) { if(max[j]<*(p+i*col+j)) { max[j]=*(p+i*col+j); } } } return max;}

Page 64: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

任务实现

【运行结果】【运行结果】

由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点为返回指针值的函数。由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点为返回指针值的函数。

Page 65: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-15 】输出某个学生 3 门课的成绩。【例 7-15 】输出某个学生 3 门课的成绩。

程序如下:#include<stdio.h>void main(){ void Output(float(*p)[3],int n); /*输出学生成绩单 */ float *Search(float (*p)[3],int n); /*查找学生的成绩 */ float scores[4][3]={{86,56,76},{75,95,83},{91,89,61},{62,66,83}}; int n; int i; float *p; printf("学生成绩单为: \n"); Output(scores,4);

Page 66: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-15 】输出某个学生 3 门课的成绩。【例 7-15 】输出某个学生 3 门课的成绩。

程序如下: printf("请输入要查找的学生成绩在成绩表中的行号 (0 ~3) : "); scanf("%d",&n); p=Search(scores,n); printf("查找的学生的成绩为: \n"); for(i=0;i<3;i++) { printf("%6.0f\t",*(p+i)); } printf("\n");

Page 67: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-15 】输出某个学生 3 门课的成绩。【例 7-15 】输出某个学生 3 门课的成绩。

程序如下:}void Output(float (*p)[3],int n){ int i,j; for(i=0;i<n;i++) { printf("%d",i); for(j=0;j<3;j++) { printf("%6.0f\t",*(*(p+i)+j)); } printf("\n");

Page 68: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-15 】输出某个学生 3 门课的成绩。【例 7-15 】输出某个学生 3 门课的成绩。

程序如下: }}float *Search (float (*p)[3],int n){ float *p1; p1=*(p+n); return p1;}

Page 69: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【运行结果】【运行结果】

学生的学号与数组函数相同。函数 Search的作用是根据学生学号返回该学生第 0门课程成绩的地址。 n是要查找的学生学号。调用 Search函数后,得到一个地址 (指向第 n个学生第 0门课程 ),赋给 p。然后将此学生的 3门课程的成绩打印出来。 *(p+i)表示此学生的第 i门课程。

学生的学号与数组函数相同。函数 Search的作用是根据学生学号返回该学生第 0门课程成绩的地址。 n是要查找的学生学号。调用 Search函数后,得到一个地址 (指向第 n个学生第 0门课程 ),赋给 p。然后将此学生的 3门课程的成绩打印出来。 *(p+i)表示此学生的第 i门课程。

【运行结果】【运行结果】

Page 70: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。程序如下:void main(){ void Output(float(*p)[3],int n); /*输出学生成绩单 */ float *Search(float (*p)[3]);/*查找成绩大于 90分的学生*/ float scores[4][3]={{86,56,76},{75,95,83},{91,89,61},{62,66,83}}; float *p; printf("学生成绩单为: \n"); Output(scores,4);

Page 71: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。程序如下: for(int i=0;i<4;i++) { p=Search(scores+i); if(p==*(scores+i)) { printf("学生的学号为:%d,各科成绩为: ",i); for(int j=0;j<3;j++) { printf("%6.0f\t",*(p+j)); } printf("\n");

Page 72: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。程序如下: } }}void Output(float (*p)[3],int n){ for(int i=0;i<n;i++) { for(int j=0;j<3;j++) { printf("%6.0f\t",*(*(p+i)+j));

Page 73: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。程序如下: } printf("\n"); }}float *Search (float (*p)[3]){ float *p1; p1=*(p+1);

Page 74: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。【例 7-16 】根据上例中的学生成绩单,找出其中有一门课程成绩不小于 90 分的学生及其学号。程序如下: for(int i=0;i<3;i++) { if(*(*p+i)>=90) { p1=*p; } } return p1;}

Page 75: 项目 7   用指针优化学生成绩排名

任务 7.4 用指针实现输出多名学生多门课程成绩最高分

【运行结果】【运行结果】

在 Search函数中,先使 p1=*(p+1),即把 p1指向本行的末尾。这是为了区分有无课程成绩大于等于 90分的标志。若无成绩不小于 90分的课程,则保持 p1指向本行的末尾。若有成绩大于等于 90分的课程, p1就指向本行第 0列元素。

在 Search函数中,先使 p1=*(p+1),即把 p1指向本行的末尾。这是为了区分有无课程成绩大于等于 90分的标志。若无成绩不小于 90分的课程,则保持 p1指向本行的末尾。若有成绩大于等于 90分的课程, p1就指向本行第 0列元素。

【运行结果】【运行结果】

Page 76: 项目 7   用指针优化学生成绩排名