760 likes | 961 Views
项目 7 用指针优化学生成绩排名. 项目 7 用指针优化学生成绩排名. 【 学习目标 】. (1) 了解指针的定义,掌握指针变量的定义与引用。 (2) 掌握用指针实现数组的输入与输出。 (3) 掌握用指针变量作为函数的参数进行传值。 (4) 掌握返回指针值的函数的应用。. 任务 7.1 用指针优化一名学生一门课程成绩的输入 / 输出. 任务介绍. 某班进行了高等数学这门课程的考试,现要求用输入某名学生高等数学成绩,并用指针的方式输出。 该学生的高等数学成绩为 98 。 要求输出格式为:. 学生高等数学成绩为: 98.0. 解决思路. 方法:
E N D
项目7 用指针优化学生成绩排名 【学习目标】 • (1) 了解指针的定义,掌握指针变量的定义与引用。 • (2) 掌握用指针实现数组的输入与输出。 • (3) 掌握用指针变量作为函数的参数进行传值。 • (4) 掌握返回指针值的函数的应用。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 任务介绍 某班进行了高等数学这门课程的考试,现要求用输入某名学生高等数学成绩,并用指针的方式输出。 该学生的高等数学成绩为98。 要求输出格式为: 学生高等数学成绩为:98.0 解决思路 方法: S1:输入学生高等数学成绩到变量score中。 S2:将变量score的地址赋给指针变量p。 S3:输出指针变量p指向的变量的值。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: #include<stdio.h> void main() { float score,*p; printf("请输入学生高等数学成绩:\n"); scanf("%f",&score); p=&score; printf("学生高等数学成绩为:%.1f\n",*p); }
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握的相关知识点如下: (1) 地址和指针的概念。 (2) 指向变量的指针变量。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.1 地址和指针 指针的功能如下: (1) 表示复杂的数据结构。 (2) 动态分配内存。 (3) 方便地使用字符串。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.1 地址和指针 指针的功能如下: (4) 方便地使用数组。 (5) 使用函数时能得到多于1个的值。 (6) 能直接处理内存地址。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.1 地址和指针 图7-1 指针
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 变量的指针就是变量的地址。存放变量地址的变量是指针变量,用来指向另一个变量。在C语言中,用“*”符号表示“指向”。 例如: int i=3; int *pointer; pointer=&i; pointer代表指针变量,而*pointer表示pointer所指向的变量,也就是变量i。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.1 定义一个指针变量 指针变量的定义包含3个方面的内容: (1) 指针类型说明,即定义变量为一个指针变量。 (2) 指针变量名。 (3) 变量值(指针)所指向的变量的数据类型。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.1 定义一个指针变量 语法: 基类型 *指针变量名 int *pointer1 (指向整型变量的指针变量) float *pointer2 (指向实型变量的指针变量) char *pointer3 (指向字符型的指针变量) 下面都是合法的定义:
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.1 定义一个指针变量 一个指针变量如何指向另一个变量呢?下面使用赋值语句使一个指针变量指向一个整型变量。 int i=3; int *pointer1; pointer1=&i; 将变量i的地址放到指针变量pointer1中,因此,pointer1就“指向”了变量i。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.2 指针变量的引用 指针变量中只能存放地址(指针),不要将一个整型量(或任何其他非地址类型的数据)赋给一个指针变量。下面的赋值是不合法的: int *pointer1; pointer1=100;
(2) *:指针运算符(或称“间接访问”运算符)。(2) *:指针运算符(或称“间接访问”运算符)。 (1) &:取地址运算符。 任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.2 指针变量的引用 有两个相关的运算符:
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.2 指针变量的引用 【例7-1】通过指针变量访问整型变量。 程序如下: #include <stdio.h> void main() { int a,b; int *pointer1,*pointer2; /*声明两个整型的指针变量 */ a=3;b=5; pointer1=&a; /*把变量a的地址赋给pointer1*/
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.2 指针变量的引用 【例7-1】通过指针变量访问整型变量。 程序如下: pointer2=&b; /*把变量b的地址赋给pointer2*/ printf("a=%d,b=%d\n",a,b); printf("a=%d,b=%d\n",*pointer1,*pointer2); }
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.2 指针变量的引用 【运行结果】 【运行结果】 程序中有两处出现*pointer1和*pointer2。程序第二行的*pointer1和*pointer2表示定义两个指针变量pointer1和pointer2。它们前面的“*”只是表示该变量是指针变量。程序最后一行printf函数中的*pointer1和*pointer2代表变量,即pointer1和pointer2所指向的变量。
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.2 指针变量的引用 【例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*/
任务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); }
任务7.1 用指针优化一名学生一门课程成绩的输入/输出 7.1.2 指向变量的指针变量 7.1.2.2 指针变量的引用 【运行结果】 【运行结果分析】 a与b的值并没有交换,但pointer1与pointer2的值交换了。pointer1原来的值为&a,后来变成了&b;pointer2原来的值为&b,后来变成了&a。通过交换两个指针变量的值,改变了指针变量的指向。
任务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指向一维数组中每个元素的值。
任务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;
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 任务实现 根据上述的解决思路和相关知识点,具体程序实现如下: printf("第一小组学生的高等数学分数分别为:"); for(i=0;i<10;i++) { printf("%.1f,",*(p+i)); } }
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握如下知识点: (1) 指向数组和数组元素的指针。 (2) 通过指针引用数组元素。 (3) 一维数组的指针作为函数参数。
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.1 指向数组和数组元素的指针
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【例7-5】数组元素的访问。 程序如下: void main() { int a[10],i; int *p; printf("请输入10个整数,整数之间用空格隔开:\n"); for(int i=0;i<10;i++) { scanf("%d",&a[i]); } /*使用下标法访问数组各个元素*/
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【例7-5】数组元素的访问。 程序如下: printf("使用下标法输出数组各个元素为:"); for(int i=0;i<10;i++) { printf("%d ",a[i]); } printf("\n"); /*使用数组名访问数组各个元素*/ printf("使用数组名输出数组各个元素为:"); for(int i=0;i<10;i++) {
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【例7-5】数组元素的访问。 程序如下: printf("%d",*(a+i)); } printf("\n"); /*使用指针变量访问数组各个元素*/ p=a; printf("使用指针变量输出数组各个元素为:"); for(int i=0;i<10;i++) { printf("%d",*(p+i));
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【例7-5】数组元素的访问。 程序如下: } printf("\n"); }
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【运行结果】 【运行结果】 使用指针变量访问数组各个元素比利用下标法和数组名访问数组各个元素都要快,用指针变量直接指向元素,不必每次都重新计算地址,能大大提高执行效率。
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【例7-6】通过指针变量输入5个整数到数组b并输出。 程序如下: #include<stdio.h> void main() { int b[10]; int *p; int i; p=b; printf("请输入5个整数:");
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【例7-6】通过指针变量输入5个整数到数组b并输出。 程序如下: for(i=0;i<5;i++) { scanf("%d",p++); } for(i=0;i<5;i++) { printf("%d",*p++); } printf("\n"); }
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【运行结果】 【运行结果】 显然输出的值不是数组b中各元素的值。原因是指针变量的初始值为数组b的首地址,但经过第一次for循环读入数据后,p已指向了b数组的第五个元素处。因此,在执行第二个for循环时,p的起始值已经不是数组的首地址了,而是b+5。而数组b下面的5个元素,在存储单元中的值是不可预料的。
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 解决这个问题,需要在第二个for循环之前重新让指针变量指向数组b的首地址。 程序如下: #include<stdio.h> void main() { int a[5]; int *p; int i; p=a; printf("请输入5个整数:");
任务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"); }
任务7.2 用指针优化多名学生一门课程成绩的输入/输出 7.2.2 通过指针引用数组元素 【运行结果】 【运行结果】 将++和--运算符用于指针变量十分有效,可以使指针变量自动向前或向后移动,指向下一个或上一个元素。
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 任务介绍 某班进行了高等数学、大学英语这两门课程的考试,现要求用输入第一组10个学生高等数学与大学英语的成绩,并用指针的方式输出。 第一组学生的高等数学成绩分别为86、75、91、62、82、56、95、89、66、82 第一组学生的大学英语成绩别为82、85、73、78、75、89、84、79、96、63
任务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.0 75.0 85.0 91.0 73.0 62.0 78.0 82.0 75.0 56.0 89.0 95.0 84.0 89.0 79.0 66.0 96.0 82.0 63.0
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 解决思路 方法: S1:输入学生高等数学成绩到二维数组scores中。 S2:将变量scores的首地址赋给指针变量p。 S3:输出指针变量p指向二维数组中每个元素的值。
任务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++) {
任务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"); } }
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 任务实现 【运行结果】 由上面的代码可以看出,要实现这个任务,需要掌握如下知识点: (1) 多维数组的地址。 (2) 指向多维数组的指针变量。 (3) 多维数组的指针作函数参数。
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 7.3.1 多维数组的地址 前面我们学过二维数组,假设有一个二维数组a,它有3行4列。例如: int a[3][4]={{0,2,4,6},{8,10,12,14},{16,18,20,22}};
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 7.3.2 指向多维数组的指针变量 7.3.2.1 指向数组元素的指针变量 【例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++)
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 7.3.2 指向多维数组的指针变量 7.3.2.1 指向数组元素的指针变量 【例7-8】用指针变量输出二维数组各元素的值。 程序如下: { for(j=0;j<4;j++) { printf("%5d",*(p+i*4+j)); } printf("\n"); } }
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 7.3.2 指向多维数组的指针变量 7.3.2.1 指向数组元素的指针变量 【运行结果】 【运行结果】 指针变量p指向二维数组的第0行第0列元素,也就是二维数组的首地址,首地址加上各个元素在数组中的相对位移,而元素在二维数组中的相对位移的计算公式为i*m+j,其中,m为二维数组的列数。
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 7.3.2 指向多维数组的指针变量 7.3.2.2 指向由m个元素组成的一维数组的指针变量 (1) 语法。 数据类型 (*指针变量)[常量/常量表达式] 例如: int (*p)[4]; (2) 语义。 表示p是一个指针变量,它指向包含4个元素的一维数组。注意*p两侧的括号不能少。
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 7.3.2 指向多维数组的指针变量 7.3.2.2 指向由m个元素组成的一维数组的指针变量 【例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;
任务7.3 用指针实现多名学生多门课程成绩的输入/输出 7.3.2 指向多维数组的指针变量 7.3.2.2 指向由m个元素组成的一维数组的指针变量 【例7-9】同例7-8,要求使用指向一维数组的指针变量。 程序如下: for(i=0;i<3;i++) { for(j=0;j<4;j++) { printf("%4d",*(*(p+i)+j)); } printf("\n"); } }