C++高级语言程序设计第四章.ppt
《C++高级语言程序设计第四章.ppt》由会员分享,可在线阅读,更多相关《C++高级语言程序设计第四章.ppt(93页珍藏版)》请在三一办公上搜索。
1、C+高级语言程序设计,第4章 数组及其他自定义类型北京邮电大学信息与通信工程学院,2023/9/30,北京邮电大学信息与通信工程学院,1,第4章 数组及其他自定义类型,4.1 数组数组基本概念、数组初始化、访问数组元素、字符型数组、多维数组4.2 枚举类型枚举类型的定义、枚举型变量的定义及使用4.3 结构类型结构类型的定义、结构变量的定义及初始化、结构变量的使用4.4 联合类型联合类型的定义、联合型变量的定义及使用,2023/9/30,北京邮电大学信息与通信工程学院,-2-,4.1 数组,数组是具有一定顺序关系的若干相同类型变量的集合,组成数组的变量称为该数组的元素。数组属于构造类型。数组是实
2、际编程中经常使用的一种数据结构。,2023/9/30,北京邮电大学信息与通信工程学院,-3-,4.1.1 数组定义及初始化,1.一维数组的定义一维数组定义的语法形式 类型标识符 数组名常量表达式;说明 类型标识符:任何合法的类型标识符,用于说明数组元素的类型;数组名:程序员对该数组的命名,数组的命名规则同变量命名;方括号及常量表达式:用于说明该数组中元素的个数。,2023/9/30,北京邮电大学信息与通信工程学院,-4-,4.1.1 数组定义及初始化,例:10级119班30名同学“C+程序设计”课程的成绩 int Cscore30;实验,测得一组电阻R随温度T变化的值 float Ri30;s
3、hort Tc30;,2023/9/30,北京邮电大学信息与通信工程学院,-5-,4.1.1 数组定义及初始化,一维数组在内存中存储映射 int score 5;,2023/9/30,北京邮电大学信息与通信工程学院,-6-,4.1.1 数组定义及初始化,注意定义一个数组,系统为这个数组保留一定数量的连续内存单元,数组元素依次占用这一连续内存空间,这段内存空间起始地址的外部标识就是数组名;数组名是一个地址常量,禁止给数组名赋值;数组各元素用数组名及下标(或称索引值)来标识,score0,score1,score4分别表示数组的第15个元素;C语言和C+语言中,元素的下标从0开始计,数组元素的最大
4、下标比元素个数少1,数组score最大下标对应的元素是score4,而不是score5(访问越界);,2023/9/30,北京邮电大学信息与通信工程学院,-7-,4.1.1 数组定义及初始化,注意数组名表示数组在内存中的起始地址,可以将元素的下标理解为元素存放位置相对于数组名的偏移量,第i个元素scorei的起始地址相对于数组的起始地址偏移了i个int型变量所占空间;每个元素可以视为一个同类型的变量,如scorei可以视为一个整型变量;数组的每个元素占用空间大小与同类型变量占用的内存大小一样;数组占用的内存空间是其全部元素所占空间的总和,如果数组有N个元素,它所占的字节数可以通过以下方式得到:
5、sizeof(数组名)或 N*sizeof(数组类型)。,2023/9/30,北京邮电大学信息与通信工程学院,-8-,4.1.1 数组定义及初始化,2.数组初始化在定义数组时,直接给出赋给数组元素的值,称为数组初始化。数组初始化语法形式 类型标识符 数组名常量表达式=以逗号隔开的初始化值;,2023/9/30,北京邮电大学信息与通信工程学院,-9-,4.1.1 数组定义及初始化,例:定义并初始化整型数组score5的语句为:int score5=80,70,90,95,60;初始化列表中的数据依次赋给元素score0、score1、score2、score3、score4。注意不要丢掉语句最后
6、的分号。,2023/9/30,北京邮电大学信息与通信工程学院,-10-,4.1.1 数组定义及初始化,注意初始化数组时,给定的初始化数值不能比数组元素多,但可以比数组元素少;如果少,初始化列表中的初始值将从下标0开始依次分配给各元素,后面没有得到初始值的元素被初始化为0。double d10=1.0,2.0;如果使用初始化列表,则表内至少包含一个初始值,否则编译将出现错误。如果没有初始化列表,即只定义不做初始化,一般在函数内部定义的自动局部数组,其各元素的值是随机值,使用时需要重新给数组元素赋值。,2023/9/30,北京邮电大学信息与通信工程学院,-11-,4.1.1 数组定义及初始化,如果
7、在初始化列表中给定数组元素的全部值,可以省略中括号中元素个数常量表示式。上述score数组的初始化也可以写成:int score=80,70,90,95,60;此时,编译器自动计算出数组元素的个数为5,给score数组分配能够存放5个int型数据的连续空间。思考题:如何将一个在某函数内部定义的自动局部数组的所有元素都初始化为0?最简单的方法是什么?,2023/9/30,北京邮电大学信息与通信工程学院,-12-,4.1.1 数组定义及初始化,例4-1 定义各种基本类型的数组并初始化,利用debug调试方式观察数组各元素得到的值、数组占用的空间、数组元素占用的空间。,2023/9/30,北京邮电大
8、学信息与通信工程学院,-13-,2023/9/30,北京邮电大学信息与通信工程学院,-14-,/例4-1数组的定义、初始化,查看数组的大小#include using namespace std;void main()const int N=5;char chArrayN;short int shArrayN=1,2,3,4,5;int iArrayN=10;float fArray=3.1f,4.1f,5.0f;double dArrayN=3.14,6.28;int k;,2023/9/30,北京邮电大学信息与通信工程学院,-15-,for(k=0;kN;k+)coutchArrayk,;
9、coutendl;for(k=0;kN;k+)coutshArrayk,;coutendl;for(k=0;kN;k+)coutiArrayk,;coutendl;for(k=0;k3;k+)coutfArrayk,;coutendl;for(k=0;kN;k+)coutdArrayk,;coutendl;,运行结果:?1,2,3,4,5,10,0,0,0,0,3.1,4.1,5,3.14,6.28,0,0,0,说明符号常量N,用于说明数组的大小;使用符号常量说明数组的大小便于程序修改,如果想让数组的大小为100,只需修改N的值即可,其他语句不需要修改;在多文件结构中,可将一些符号常量的定义放
10、在头文件中,更利于工程的维护和修改。,4.1.2 访问数组元素,数组元素是用下标来区分的,指定要访问的数组元素的语法形式为:数组名下标表达式 下标表达式:可以是常量、变量或表达式,其值大于或等于0,小于数组的大小。例:const int N=8;float angleN;for(int k=0;kN;k+)anglek=3.14f/N*k;/给元素赋值,写操作 coutanglek,;/读取元素值,2023/9/30,北京邮电大学信息与通信工程学院,-16-,4.1.2 访问数组元素,例4-2 将正弦函数的一个周期2分为N等份,定义数组分别存储自变量值和函数值,并显示数组元素的值。,2023/
11、9/30,北京邮电大学信息与通信工程学院,-17-,2023/9/30,北京邮电大学信息与通信工程学院,-18-,/例4-2用数组存储和显示正弦函数一周期内的值#include#include#include using namespace std;void main()const int N=8;double xN;/自变量值 double yN;/函数值 const double PI2=3.14159*2;double delta=PI2/N;coutsetw(8)弧度setw(12)sin(x)endl;for(int k=0;kN;k+)xk=k*delta;yk=sin(xk);c
12、outsetw(10)xk,ykendl;,运行结果:弧度 sin(x)0,0 0.785397,0.707106 1.57079,1 2.35619,0.707108 3.14159,2.65359e-006 3.92699,-0.707104 4.71238,-1 5.49778,-0.70711,4.1.2 访问数组元素,访问数组元素时需要注意(1)数组元素的下标表达式的结果必须为0或正整数。(2)数组元素的下标值不得超过数组声明时所限定的上下界。数组元素下标的下界是0,上界是相应维数大小减1。例:int a10;/a数组可使用的有效下标为09float f50;/f数组可使用的有效下标
13、为049,2023/9/30,北京邮电大学信息与通信工程学院,-19-,4.1.2 访问数组元素,访问数组元素时需要注意(3)越界访问问题如果访问数组元素时,使用的下标不是有效范围内的值,会造成“越界访问”错误。由于编译器在编译程序时不会检查这种错误,所以编辑人员要特别小心,尽可能杜绝这类错误发生。使用面向对象程序设计技术的读者可以定义下标不能越界的数组,也就是C+中的vector类,相关内容可参见附录。,2023/9/30,北京邮电大学信息与通信工程学院,-20-,4.1.3 字符数组,char型的数组称为字符数组,通常用来存储字符串。定义并且初始化字符数组:char chArray=hel
14、lo world!;,2023/9/30,北京邮电大学信息与通信工程学院,-21-,4.1.3 字符数组,1初始化字符数组两种方法:(1)用双引号内的字符串初始化字符数组例:char array10=hello;可以省略大括号,简化为:char array10=hello;用这种方法初始化时,系统自动在数组最后一个元素后面补0(结束符)。,2023/9/30,北京邮电大学信息与通信工程学院,-22-,4.1.3 字符数组,(2)用字符常量来初始化字符数组例:char array10=h,e,l,l,o,0;该方法将初始值一一列举在初始化列表中,这种方法通常用于输入不容易在键盘上生成的不可见字符
15、。下面的代码中初始化值包含两个制表符。char array10=a,t,b,t,0;注意,此种方式下,编程者要自己添加字符串结束符(0),同时不要忘记为最后的0留出空间。,2023/9/30,北京邮电大学信息与通信工程学院,-23-,4.1.3 字符数组,2字符数组的输入和输出字符数组的输入是给数组各元素赋值的过程在循环中通过cin一个一个地输入通过cin整串输入调用I/O流类的成员函数输入,例如使用getline()函数输入一行字符。char buffer80;for(int k=0;kbufferk;cinbuffer;cin.getline(buffer,80,n);,2023/9/30
16、,北京邮电大学信息与通信工程学院,-24-,4.1.3 字符数组,2字符数组的输入和输出字符数组的输出逐元素输出通过数组名输出。例如,下面的语句输出字符数组buffer中的字符串:coutbuffer;例4-3 从键盘输入一行或多行字符串,用字符数组存储,并统计所输入的字符串中26个字母出现的次数。,2023/9/30,北京邮电大学信息与通信工程学院,-25-,2023/9/30,北京邮电大学信息与通信工程学院,-26-,/例4-3输入26个英文字符的分布统计#include using namespace std;void main()/数组及变量定义;const int N=80;char
17、 bufferN;int k=0;const int NUM=26;int countsNUM=0;char lettersNUM;int i=0;,2023/9/30,北京邮电大学信息与通信工程学院,-27-,do/循环输入每一行字符 coutenter a string:n;cin.getline(buffer,N,n);/获得一行输入字符串 k=0;/对于输入的每一行字符,统计字符出现的次数 while(bufferk!=0)i=tolower(bufferk)-a;countsi+;k+;/countstolower(bufferk+)-a+;/用此行可代替前三句 while(buff
18、er0!=0);,2023/9/30,北京邮电大学信息与通信工程学院,-28-,cout0)coutlettersi:countsiendl;,思考题:如何统计一个txt文件中各种字符出现的次数?,2023/9/30,北京邮电大学信息与通信工程学院,-29-,4.1.4 多维数组,1多维数组的定义定义多维数组语法形式如下。二维数组类型标识符 数组名标识符常量表达式1常量表达式2;三维数组类型标识符 数组名标识符常量表达式1常量表达式2常量表达式3;n维数组类型标识符 数组名标识符常量表达式1常量表达式n;,2023/9/30,北京邮电大学信息与通信工程学院,-30-,4.1.4 多维数组,例:
19、bool seat106;/座位 unsigned char image256128;/256行128列图像 float matrix33;/三元一次线性方程组的系数矩阵 char table58;/课表二维数组元素的下标从左至右称为行、列。char book2003240;/书三维数组元素的下标由左至右可称为页、行、列或层、行、列。,2023/9/30,北京邮电大学信息与通信工程学院,-31-,4.1.4 多维数组,在定义多维数组时,需要注意首先要根据所要表示的对象内容,选择合适的数据类型(数组的类型,也就是数组元素的类型);其次确定数组的维数,即几维数组(有几维就有几对中括号);最后确定每
20、一维的大小(中括号内)。特别强调:数组每一维的大小必须用常量表达式声明,否则,编译会出错。这也是C和C+数组的一大缺陷:数组的使用不够灵活。,2023/9/30,北京邮电大学信息与通信工程学院,-32-,4.1.4 多维数组,2多维数组在内存中的映像例:int d15;int d223;int d3232;,2023/9/30,北京邮电大学信息与通信工程学院,-33-,4.1.4 多维数组,2多维数组在内存中的映像一维数组在内存中从数组名所代表的起始地址开始,按下标次序存储;数组d1的第i个元素在内存中的起始位置相对于数组名所代表的地址偏移了i个int型变量空间大小。,2023/9/30,北京
21、邮电大学信息与通信工程学院,-34-,4.1.4 多维数组,2多维数组在内存中的映像二维数组在内存中从数组名所代表的起始地址开始,按行优先依次存储;数组d2的第i行第j列元素在内存中的起始位置相对于数组起始地址偏移了 行号列数+列号个int型变量空间大小。例如,元素d2ij的起始地址计算:&d200+(i 3+j),2023/9/30,北京邮电大学信息与通信工程学院,-35-,4.1.4 多维数组,2多维数组在内存中的映像三维数组在内存中从数组名所代表的起始地址开始,按页、行、列依次存储,即按使数组元素最右边的下标值最快地变化来存储。数组d3的第k页第i行第j列元素在内存中的起始位置相对于数组
22、起始地址偏移了页号(行数列数)+行号列数+列号 个int型变量空间大小。例如,元素d3kij的起始地址为:&d3000+(k32+i2+j)。,2023/9/30,北京邮电大学信息与通信工程学院,-36-,4.1.4 多维数组,3初始化多维数组提供数组元素的全部初始值提供部分元素的初始值这些初始化值位于大括号内,构成初始值列表,多维数组初始化时需要使用嵌套的括号。int a24=4,3,2,1,1,2,3,4;double d34=l.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0;,2023/9/30,北京邮电大学信息与通信工程学院,-37-
23、,4.1.4 多维数组,3初始化多维数组可以省略内层的括号,只要程序好读即可。例如用换行的方式:int a24=4,3,2,1,1,2,3,4;double d34=l.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0;,2023/9/30,北京邮电大学信息与通信工程学院,-38-,4.1.4 多维数组,3初始化多维数组 多维数组的初始化,也可以只给出部分值;例:int a24=4,3;则只有a00、a01分别得到初始值4和3,其余各元素的值为0。可利用此特性将一些用做计数器的多维数组初始化为0。例:定义并初始化二维整型计数器counts:int
24、 counts512256=0;这是将多维数组元素置0的最简便方法之一。,2023/9/30,北京邮电大学信息与通信工程学院,-39-,4.1.4 多维数组,4访问多维数组的元素访问多维数组的元素时,只要指定要访问的数组元素的具体下标值即可,语法形式为:数组名下标表达式1下标表达式n 其中,下标表达式的个数同数组维数,“下标表达式i”(1in)可以用常量、变量或表达式,其值大于或等于0,小于数组对应维的大小,即 0下标表达式i的值第i维的大小,2023/9/30,北京邮电大学信息与通信工程学院,-40-,4.1.4 多维数组,例:const int M=8,N=4;char matrixMN;
25、for(int i=0;imatrixij;/给元素赋值,写操作,2023/9/30,北京邮电大学信息与通信工程学院,-41-,4.1.4 多维数组,例4-5 编程实现矩阵转置功能,矩阵行数为M,列数为N,用二维数组表示矩阵。,2023/9/30,北京邮电大学信息与通信工程学院,-42-,2023/9/30,北京邮电大学信息与通信工程学院,-43-,/例4-5矩阵转置#include#include#include using namespace std;void main()const int M=5;const int N=6;int matrixMN;/矩阵 int tMatrixNM;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 高级 语言程序设计 第四
链接地址:https://www.31ppt.com/p-6154064.html