53 指针和数组.docx
《53 指针和数组.docx》由会员分享,可在线阅读,更多相关《53 指针和数组.docx(15页珍藏版)》请在冰点文库上搜索。
53指针和数组
《5.3指针和数组》
1.目标概述[3分钟]2
2.回顾[5分钟]2
3.课程知识点讲解2
3.1.指向数组元素的指针[20分钟]2
3.2.字符串与指针[30分钟]3
3.3.任务解决[30分钟]4
4.精练[课后完成]5
5.小结[2分钟]5
6.技能提升[90分钟]6
7.考核点9
8.作业答案9
9.扩展练习10
10.学生问题汇总10
11.教学后记10
本节目标
⏹本节中将讲述如下主要内容:
✧指针和数组的关系
✧指针访问数组的方法
✧字符串指针的使用方法
⏹通过教学使学生掌握指针和数组的使用。
本节重点
⏹指针和数组的关系
⏹指针访问数组的方法
⏹字符串指针的使用方法
本节难点
⏹指针访问数组的方法
授课课时
⏹4课时
教法建议
目标概述[3分钟]
本节主要讲述指针和数组的使用。
提出本节的任务。
回顾[5分钟]
回顾上一节的相关内容。
课程知识点讲解
指向数组元素的指针[20分钟]
引入:
用指针变量访问数组是C++引入指针概念的最重要目的之一,从对前述几节的学习中我们可知道变量是有地址的,而具有一定顺序关系的若干变量的集合体——数组也同样有相应的地址,它们存储在物理上连续的存储单元中。
主题:
指针变量既可以指向变量,也可以指向数组。
通常数组名就是数组存储的首元素地址,而不是代表整个数组。
同样,在C++中,数组第一个元素(即序号为0的元素)的地址也代表数组的首元素地址,即数组名和数组第一个元素的地址是相同的。
在C++中,数组和指针是密切相关的,几乎可以互相使用。
因此也可以通过指针引用数组元素。
通常引用一个数组元素,可以用如下三种方法:
(1)下标法,如pricesOfBook[i]形式,这种方式直观形象,容易理解,适合初学者使用,同时由于其具有较好的可读性,在工程化的开发中也经常使用;
(2)指针法,如*(pricesOfBook+i)或*(prices+i)。
这种方法直接对内存中的变量进行操纵,可以使编译后生成的目标代码占用内存空间少,运行效率高。
但也存在着超越数组边界使用数据的隐患,因此使用指针访问数组元素时,仍需要注意避免出现数组越界问题。
(3)用指针变量指向数组元素,如:
float*prices=pricesOfBook;
在访问数组元素时,则使用形如*(prices+i)的方式,这种方式也直接操纵内存变量,因此不必在每次访问元素时,都计算变量地址,因此使用price++的这样的自加操作能获得较高的执行效率,但与下标法比较起来,则不够形象直观,程序可读性较差。
在使用指针变量指向数组元素时,尤其要注意当前指向的是否是有效的数组元素,因为其初值的指向可以更加随意。
示例讲解:
示例5.3.1
分析与解答:
具体见P239
示例讲解:
示例5.3.2HNS软件学院新进了一批图书,管理员在作入库记录时需要取得该批图书中的格价最高和最低的书价,请您设计一程序实现找出最低和最高的书价。
(假设该批图书只有10本)
问题:
①从一批书中找出最高书价并输出;
②从一批书中找出最低书价并输出。
分析与解答:
具体见P240
练习:
练习5.3.1请您根据流程图实现上述例子的问题②。
(采用指针变量法)
解决:
见solution-code/E4-2-1.cpp
字符串与指针[30分钟]
引入:
主题:
在程序中如出现字符串常量,编译程序就会给字符串常量安排相应大小的存贮区域,这个区域是静态的,在整个程序运行的过程中始终占用,平时所讲的字符串常量的长度是指该字符串的字符个数,但在安排存贮区域时,编译程序还自动给该字符串序列的末尾加上一个空字符'\0',用来标志字符串的结束,因此一个字符串常量所占的存贮区域的字节数总比它的字符个数多一个字节。
通常在C++中可以用3种方法访问一个字符串(在第4章介绍了前两种方法)。
1.用字符数组存放字符串
示例讲解:
示例5.3.3 定义一个字符数组并初始化,然后输出其中的字符串。
分析与解答:
具体见P244
2.用字符串变量存放字符串
这种方法是在程序中需用要到字符串时,直接定义为string类型变量的方法来实现字符串的定义和申请。
示例讲解:
示例5.3.4 定义一个字符数组并初始化,然后输出其中的字符串。
分析与解答:
具体见P245
3.字符指针指向一个字符串
这种方法是在定义时,将字符串定义为一个字符指针变量,其定义格式如下:
char*<字符串指针变量>;
其初始化可采用两种方式,即:
①<字符串指针变量>=<字符串值>;
即先定义一个字符串指针变量,然后再赋值,
②char*<字符串指针变量>=<字符串值>;
即在定义字符串指针变量时,直接对其赋值。
第三种方式定义字符串的实质是把字符串的第一个字符’H’的地址赋给指针变量word,如图所示
因此在输出或使用字符串时,系统总是先定位到word指针所指向的第一个字符数据,然后将word自动加1,使之指向下一个字符,再进行输出或相应的操作,如此直到遇到字符串结束标志‘\0’时为止。
示例讲解:
示例5.3.5 将字符串str1中从第m个字符开始的全部字符复制到字符串str2。
设str1="mynameiswen.jiang!
!
",m为12,则str2="wen.jiang!
!
"
分析与解答:
具体见P246
任务解决[30分钟]
任务:
由于HNS软件学院在校学生人数的过快增长,导致现有图书管理系统的负载增加、工作效率降低。
为此,学院指派信息中心的系统分析部对现有图书管理系统进行分析,发现现有系统对读者信息处理采用的是传统的技术,程序组织不够合理,从而影响处理速度。
经研究决定采用指针技术来改进现有系统中的读者管理模块。
现指派您通过运用指针技术,完成如下任务:
1.实现读者信息的修改功能;
2.实现读者信息的删除功能。
分析与解决:
具体见P249-253
精练[课后完成]
任务:
请您根据本节所学的知识和下面给出的流程图解决任务2并写出相应的程序:
解决:
具体见P5-3.cpp
小结[2分钟]
通过本节的学习,您熟悉了指针与数组的关系,掌握了指针操作数组和字符串的语法和技巧,培养了灵活运用指针技术解决实际应用的能力,为以后各章学习奠定了基础。
下面将本节主要内容归纳如下:
1.指向数组中元素的指针
运用指针变量实现对一维数组的操作,不仅可以改进程序的组织,而且可以提高程序的运行效率。
通常指针变量通过获得数组的首元素地址来实现对数组元素进行操作。
数组的首地址有两种方法可以获得,一种是通数据组名;另一种是取下标为0的首元素的地址。
2.字符串与指针
字符串处理的应用范围十分广泛,通过指向字符串的指针变量的操作,不仅可以操作简化操作,而且可以提高处理效率。
技能提升[90分钟]
任务:
HNS软件学院的系统开部目前正在为该院的图书馆开发一套图书管理系统,现已进入实现阶段。
为了加快系统的开发速度,经研究决定将该系统的编码任务分配给各开发人员完成,现指派您使用指针和数组技术完成图书借出/归还功能,其具体任务如下:
1.编写借/还子菜单;
2.编写图书查询函数;
3.编写借书函数;
4.编写还书函数。
分析:
1.定义书籍信息数据表
目前系统暂以一个二维的数组作为系统的书籍信息数据表,其结构如下表:
书号
书名
是否借出
0001
C++程序设计
是
2.数组的定义如下:
stringbookOfTable[n][3];
该数组中的第1列对应表中的“书号”字段,第2列对应表中的“书名”字段,第3列对应表中的“是否借出”字段。
3.定义借书库
目前系统暂时以一个二维数组作为系统的借书信息表,其结构如下表:
书号
用户编号
是否归还
0001
0002
1
数组定义如下:
stringlendingOfTable[n][3];
该数组中的第1列对应表中的“书号”字段,第2列对应表中的“用户编号”字段,第3列对应表中的“是否归还”字段其值为1表没有归还,0表示已归还。
4.编写一文字菜单子函数。
函数名:
voidbusinessMenu();
菜单项:
①图书信息查询
②借书
③还书
④退出
5.编写相关功能函数
①查询功能函数
函数名:
intsearchByName(stringbookNum,string*bookOfName,string*bookOfFlag)
入口参数:
bookNum查询到的图书编号;
bookOfName查询到的图书名称;
bookOfFlag是否借出标记
返回值:
图书在表中的位置信息,值为-1表示没有查找到数据
流程图:
②借书功能函数
函数名:
intlending(intbookNum,intclientNo,intsite,string*bookOfTable,int*lendingOfTable)
入口参数:
bookNum需要借阅到书籍编号
clientNO读者编号
site当前书籍在表中的位置信息
bookOfTable书籍信息表
lendingOfTabe借书信息表
返回值:
指示借书是否成功,1表示成功,0表示失败。
流程图:
③还书功能函数
函数名:
intreturning(intbookNum,string*bookOfTable,int*lendingOfTable)
入口参数:
bookNum书号
bookOfTable书籍信息表
lendingOfTable借书信息表
返回值:
指示归还是否成功,1表示成功,0表示失败。
流程图:
解决:
具体见solution-code/5-3-A1.cpp
目标:
●提高学生的表达能力,语言应用能力和自信力
●展示所完成的任务
要求:
●学生应当使用指针完成上述任务,不得采用其它方法;
●普通话应尽可能标准流畅,不得使用方言
●需要结合本章的重点进行讲解
考核点
考核点1:
指针与数组的关系
作业答案
1:
设有如下声明:
intintegerArray[3]={4,5,6},*point=integerArray+1;
以下各语句均以上述声明为前提,填写执行后的情况。
a)执行cout<<*point++;后,输出 5 ,point指向integerArray[1],
integerArray[0]—integerArray[2]:
-2。
b)执行cout<<*++point;后,输出 6 ,point指向integerArray[2],
integerArray[0]—integerArray[2]:
-2。
c)执行cout<<++*point;后,输出 6 ,point指向integerArray[2],
integerArray[0]—integerArray[2]:
-2。
d)执行cout<<(*point)++;后,输出 5 ,point指向integerArray[2],
integerArray[0]—integerArray[2]:
-2。
2:
设有如下声明:
char*str[4]={“xyzwab”,”234567”,”please”,”love”};
回答如下问题:
a)数组str各元素中存储的内容是:
“xyzwab”,”234567”,”please”,”love” .
b)cout<234567.
c)若希望输出上述字符串中的一个字符”l”,应该执行cout<d)cout<4567。
3:
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见图,写一函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数。
答:
solution-code/5-3-T3.cpp
4:
写一函数,求一个字符串的长度。
在main函数中输入字符串,并输出其长度。
答:
solution-code/5-3-T4.cpp
5:
输入一行文字,找出其中空格、小写字母、数字以及其他字符各有多少?
答:
solution-code/5-3-T5.cpp
6:
编制程序,程序中声明字符型数组str[30],并初始化,要求通过指针的方式将该字符串逆序存放。
答:
solution-code/5-3-T6.cpp
扩展练习
学生问题汇总
(注:
汇总学生在学习过程中容易出现的问题)
教学后记
(注:
在此写上个人在授课过程中所遇到的教案中所没有涉及到的特殊问题及其解决方法或解决方案,也可以总结自己的授课体会,课程体系、教材的不足等。
)
授课教师(签名):
授课时间:
授课班级: