(高职)单元8 “考试系统”的优化ppt课件.pptx
《(高职)单元8 “考试系统”的优化ppt课件.pptx》由会员分享,可在线阅读,更多相关《(高职)单元8 “考试系统”的优化ppt课件.pptx(119页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、PPT单元8“考试系统”的优化主讲教师:赵彦“考试系统”的优化解决问题接下来,我们就带着问题出发,揭开指针的神奇面纱,让指针为你所用,优化“考试系统”。地址与指针a5int a = 5;内容存储空间37814052地址指针变量的引用指针就是地址,而指针变量就是用来存放地址的变量。如何定义指针变量?类型名 * 指针变量名;int *p1,*p2;double *pt1,*pt2;指针变量的初始化和赋值用变量的地址对指针变量进行初始化,但必须注意,该变量的类型必须和指针变量的类型相同。指针变量的初始化和赋值也可以用一个指针变量的值给另一个指针变量赋值,但它们必须具有相同的数据类型。指针变量的初始化
2、和赋值#include int main(int argc, char *argv)int a = 10;int b = 100;int *point_1 = &a;int *point_2 = &b;printf(a = %d,b = %dn,a,b);printf(a = %d,b = %dn,*point_1,*point_2); return 0;引用指针变量的方法(1)给指针变量赋值point_1 = &a;引用指针变量的方法(2)引用指针变量指向的变量printf(a = %d,b = %dn,*point_1,*point_2);引用指针变量的方法(3)引用指针变量的值print
3、f(point_1 = %on,point_1);数据交换实例8.2输入两个整数a和b,使a中存放两者最小值,b中存放两者最大值,并输出a和b,要求通过指针实现。数据交换解题思路:定义a,b,使用指针变量完成数据的输入,当a b时,使用指针交换变量a、b中存放的数据。指针变量的初始化和赋值#include int main(int argc, char *argv)int a;int b;int *point_1 = &a;int *point_2 = &b;int temp;scanf(a = %d,b = %d,point_1,point_2);if(*point_1 *point_2)t
4、emp = *point_1;*point_1 = *point_2;*point_2 = temp;printf(a = %d,b = %dn,*point_1,*point_2); return 0;函数的参数不仅可以是整型、浮点型、字符型数据,还可以是指针类型。指针变量作为函数参数其作用是将一个变量的地址传递给被调用函数,由被调函数的形参指针变量接收,使形参指针变量指向实参指针变量指向的变量。指针变量作为函数参数即实参与形参共同指向同一片内存空间,此时,形参指向的存储空间中的数据改变,实参指向的存储空间内的数据也同时改变。这种传递方式为地址传递。指针变量作为函数参数数据交换实例8.3输入
5、两个整数a和b,使a中存放两者最小值,b中存放两者最大值,并输出a和b,要求用指针作为函数参数实现。数据交换解题思路:定义swap函数,形参point_1、point_2为指针变量,其作用是根据*point_1、*point_2的值的情况决定是否交换*point_1、*point_2的值。int main(int argc, char *argv)int a;int b;scanf(a = %d,b = %d,&a,&b);swap(&a,&b);printf(a = %d,b = %dn,a,b); return 0;指针变量的初始化和赋值指针变量的初始化和赋值void swap(int *
6、point_1,int *point_2)int temp;if(*point_1 *point_2)temp = *point_1;*point_1 = *point_2;*point_2 = temp;swap(&a,&b);printf(a = %d,b = %dn,a,b);思考void swap(int *point_1,int *point_2)int *temp;if(*point_1 *point_2)*temp = *point_1;*point_1 = *point_2;*point_2 = *temp;swap(&a,&b);printf(a = %d,b = %dn,a
7、,b);思考void swap(int point_1,int point_2)int temp;if(point_1 point_2)temp = point_1;point_1 = point_2;point_2 = temp;swap(a,b);printf(a = %d,b = %dn,a,b);数组元素的指针数组的指针就是指数组的首地址,数组元素的指针就是数组元素的地址。数组元素的指针有如下定义:int a5=1,3,5,7,9;int *p = a;引用数组元素的三种方式下标法数组名法 1 3 5 7 9a0a1a2a3a4*a*(a+1)*(a+2)*(a+3)*(a+4)指针变
8、量法*(p)*(p+1)*(p+2)*(p+3)*(p+4)在引用数组元素时指针的运算(1)如果指针变量p指向数组中的任一元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。p指针可以执行+、-操作,如果p原来指向a0,执行p+,p指针指向下一个元素a1。在引用数组元素时指针的运算(2)如果p的初始值为&a0,即数组a的首地址,那么p+i就是ai的地址,即a+i。这里需要注意的是,a是数组的首地址,那么第i个元素的地址为a+i,即&ai。在引用数组元素时指针的运算(3)如果p指向数组a的首地址,ai表示数组a中第i个元素,*(p+i)与*(a+i)是数组a第i个元素,即
9、ai。在引用数组元素时指针的运算(4)如果指针变量p1和p2都指向同一个数组a,其中p1 = a+1,p2 = a+3,那么p2-p1表示p2所指元素与p1所指元素之间差两个元素,即他们所指向元素的相对距离。但是p1+p2是毫无意义的。指针引用数组元素实例8.4对于整型数组a,首先为该数组赋值,并顺次输出数组中的全部元素。指针引用数组元素解题思路:分别使用下标法、数组名法、指针变量法引用数组中的元素。3种方法的比较下标法和数组名法执行效率相同。C语言编译器是将ai转换为*(a+i)处理,即先计算元素地址,再获取数据。因此用下标法和数组名法找数组元素费时较多。3种方法的比较指针变量法比下标法和数
10、组名法快。指针变量直接指向元素,不必每次都重新计算地址,像p+这样的自加操作比较快。这种有规律地改变地址值(p+)能大大提高执行效率。3种方法的比较用下标法比较直观,能直接知道是第几个元素。用数组名法或指针变量法不直观,难以很快地判断出当前处理的是哪一个元素。数组名作为函数参数使用数组名做函数实参时,向形参传递的是数组首元素的地址。数组名作为函数参数实例8.5用选择法对数组中10个整数按从小到大排序。数组名作为函数参数解题思路:第七单元学习了选择排序法,该题目将使用指针完成选择排序法求解。选择排序int main(int argc, char *argv)int aN = 23,34,-1,2
11、,6,78,-54,20,18,-15;printf(排序前:n);display(a);sort(a);printf(排序前:n);display(a);return 0;void display(int *a)选择排序int main(int argc, char *argv)int aN = 23,34,-1,2,6,78,-54,20,18,-15;printf(排序前:n);display(a);sort(a);printf(排序前:n);display(a);return 0;void sort(int *a)指针引用数组元素为了便于理解,sort函数的形参为指针变量,该变量接收实
12、参数组的首地址,此时形参指针变量a与实参数组a,指向同一片存储空间。用指针引用数组中的元素,完成选择排序。多维数组的首地址是这片连续存储空间的起始地址,它既可以用数组名表示,也可以用数组中第一个元素的地址表示。(1)多维数组元素的地址int s34=0,2,4,6, 1,3,5,7, 9,10,11,12;表示形式含义地址s二维数组名,数组首地址,0行首地址&s00s0,*(s+0),*s第0行第0列元素地址&s00s+1,&s1第1行首地址&s10s1,*(s+1)第1行第0列元素地址&s10s1+2,*(s+1)+2,&s12第1行第2列元素地址&s12*(s1+2),*(*(s+1)+2
13、),s12第1行第2列元素的值 (1)多维数组元素的地址可以使用指针变量指向多维数组的元素。(2)多维数组元素的指针变量实例8.6使用指针变量指向一个34的二维数组,要求使用指针变量输出二维数组各元素的值。(2)多维数组元素的指针变量解题思路:二维数组的元素在内存中按照行序放,即第0行的元素顺序存储完毕后,存储第1行的全部元素,以此类推。因此可以使用一级指针访问数组中的各元素。(2)多维数组元素的指针变量#include int main(int argc, char *argv)int a34= 0,2,4,6, 1,3,5,7, 9,10,11,12;int *p;for(p = a0;p
14、 a0 + 12;p+)printf(%4d,*p);if(p - a0 + 1) % 4 = 0)printf(n);数组指针:指向由m个元素组成的一维数组的指针变量数据类型 (*p)m;(2)多维数组元素的指针变量由于小括号的优先级别最高,因此要首先计算小括号,所以指定变量p首先是一个指针变量,其次它指向一个长度为m的一维数组,P为二级指针。这就是数组指针的定义方式。(2)多维数组元素的指针变量int s34int (*p)4;p=s;p指向s数组,p+的值为s+1,它只能对行进行操作,不能对行中的某个元素进行操作,可以使用*(*(p+i)+j)访问第i行第j列的数据。(2)多维数组元素的
15、指针变量一维数组的地址可以作为函数参数,多维数组的地址也可作函数参数。在用指针变量作形参以接受实参数组名传递来的地址时,有两种方法:用指向变量的指针变量和用指向一维数组的指针变量(实例8.6)。(3)用指向多维数组的指针作为函数参数实例8.7改写我们的成绩单。5个学生参加5门课程的期末考试,分数如下所示:double s55=78,82,93,74,65,91,82,72,76,67,100,90,85,72,98,67,89,90,65,78,77,88, 99,45,89;(2)多维数组元素的指针变量求解要求:(1)求出每个学生的平均分。(2)求出每门课程的总分。(3)求出每门课程的最高分
16、,以及该分数是哪个学生取得的成绩,打印出该学生的学号。(2)多维数组元素的指针变量(1)打印成绩单的函数名为:displaySheet;(2)求每个学生的平均分的函数名为:studentAVG;(3)求每门课程总分的函数名为:courseSUM;(2)多维数组元素的指针变量(4)求每门课程的最高分以及该分数对应的学生的学号的函数名为:courseMaxScore;(5)注意各个函数参数的类型,以及函数的返回值的类型。(2)多维数组元素的指针变量解题思路:第七单元已经通过数组名作为函数参数传参完成了题目要求。下面将通过指针求解我们的成绩单问题。(2)多维数组元素的指针变量在main函数中,当二维
17、数组名作为实参时,形参往往使用数组指针接收实参,此时形参与实参指向同一片存储空间,*(*(s+i)+j)表示sij的值。(2)多维数组元素的指针变量字符串的引用方式(1)用字符数组存放字符串char string = I am a student.;printf(%sn,string);字符串的引用方式(2)用指针变量指向一个字符串常量char *string = I am a student.;printf(%sn,string);字符串的引用方式(2)用指针变量指向一个字符串常量char *string;string = I am a student.;printf(%sn,string)
18、;字符串指针作为函数参数将一个字符串从一个函数传递到另一个函数,不但可以用字符数组名作为参数传参,还可以用字符指针变量作为参数传参。此时形参与实参共用一片存储空间,在被调函数中改变字符串的内容,主调函数中的字符串同时改变。字符串指针作为函数参数实例8.8求出I am ZhaoYan. What is your name?字符串的长度。字符串指针作为函数参数解题思路:定义一个函数str_len用来实现求字符串长度的功能,在主调函数中调用此函数,函数的形参和实参可以分别用字符数组名或字符指针变量。字符串指针作为函数参数#include int str_len(char *str)int len;f
19、or(len=0;strlen;len+);return len;int main(int argc, char *argv)char str = I am ZhaoYan. What is your name?;int len = str_len(str);printf(%s的长度是:%dn,str,len);return 0;使用字符指针变量和字符数组的比较字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。使用字符指针变量和字符数组的比较赋值方式不同。可以对字符指针变量赋值,但不能对数组名赋值。使用字符
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高职 单元 考试 系统 优化 ppt 课件
限制150内