C++大学基础教程第五章.ppt

上传人:za****8 文档编号:15798674 上传时间:2020-09-06 格式:PPT 页数:78 大小:344.52KB
返回 下载 相关 举报
C++大学基础教程第五章.ppt_第1页
第1页 / 共78页
C++大学基础教程第五章.ppt_第2页
第2页 / 共78页
C++大学基础教程第五章.ppt_第3页
第3页 / 共78页
点击查看更多>>
资源描述
C+大学基础教程,第5章 数组,2020/9/6,2,5.1 数组基本概念 5.2 数组元素的下标 5.3 数组初始化 5.4 数组的大小和越界数组 5.5 字符数组 5.6 向函数传递数组 5.7 多维数组,第5章 数组,5.1 数组基本概念,2020/9/6,4,5.1数组基本概念,数组是具有一定顺序关系的若干相同类型元素的集合。 组成数组的变量称为该数组的元素。 数组元素都有相同的变量名(数组名),但是有不同的下标。,2020/9/6,5,一维数组,一维数组的说明方法为数据类型加数组名,再加方括号,里面含有元素个数。即: 类型说明符 数组名常量表达式; 数组名的命名规则和变量名相同。 常量表达式表示数组元素的个数,即数组长度。,2020/9/6,6,一个字符数组例子,下面的代码说明一个字符数组: char a 5; 即:字符数组“char a5”,存储该数组占5个字节。每个元素的类型是字符型。数组下标从0开始,分别是a0,a1,a2,a3,a4。 请注意:数组元素的下标从 0 开始。并且,a5不属于该数组的空间范围。,2020/9/6,7,数组在内存中的存放,数组元素都是存放在一片连续的内存单元中的。 下图显示 char name=”Ray Krebbs”的内存情况,2020/9/6,8,5.1.2数组的定义,和变量相同,数组也必须先定义,后使用 定义数组的一般格式是: 类型说明符 数组名常量表达式; 下面的语句定义了一个有五个整数的数组: int ages5; 数组ages此时的内容是不确定的,编程中不能想当然地认为它全为0或其他什么值。,2020/9/6,9,定义数组应包括的几个方面,确定数组元素的类型 可以是如整型、浮点型等简单类型,也可以是结构体、类等用户自定义类型。 确定数组的名称 由“标识符”指定,数组名是一个常量,代表着数组元素在内存中的起始地址。 确定数组的结构 包括数组的维数(有几个常量表达式),维的大小等,也就是常量表达式的具体形式。常量表达式的值必须是正整数。,2020/9/6,10,错误的数组定义语句,void VoidArray10;/void不可以做数组类型 int a=9; float floatArraya; /下标表达式不可以是变量 char charArray1.5+1.5;/3.0不是整数,2020/9/6,11,例5.1 定义一个含10整数的数组,解:以ARRAY命名的数组,用100至109对数组元素赋值,并对其求和。需要在一个循环中使用数组。这是使用数组最经常的方式。 void main() int ARRAY 10; int sum=0; for (int i=0;i10;i+) ARRAYi=100+i; sum+= ARRAYi; ,5.2 数组元素的下标,2020/9/6,13,5.2数组元素的下标,数组的元素是由下标来区分的。使用数组时,只能分别对数组的各个元素操作。 对于一个已经声明过的数组,其元素的使用形式为: 数组名下标表达式 例如 salaries 6; int a=5; salariesa=10;,2020/9/6,14,注意,在使用数组元素时需要注意: 数组元素的下标表达式其结果必须为正整数。 数组元素的下标值不得超过声明时所定义的上下界。,2020/9/6,15,数组的下标,数组元素的下标是数组元素到数组开始地址的偏移量。 第1个元素的偏移量是0个数组元素大小,第2个元素的偏移量是1个数组元素大小,依次类推。 因此,数组元素是一系列大小相同的连续项,每项到公共基点(数组起始地址)的偏移量是固定的。,5.3 数组初始化,2020/9/6,17,5.3数组初始化,数组的初始化就是在定义数组时给部分或全部元素赋初值。 对于简单数据类型的数组,就是给数组元素赋值; 对于对象数组,每个元素都是某个类的一个对象,初始化就是调用该对象的构造函数。我们会在后面单独详细介绍。,2020/9/6,18,初始化数组的方法,在使用数组元素之前,必须先对它们赋值。 有以下两种初始化数组的方法: 在定义数组时初始化 在程序中对数组进行初始化,2020/9/6,19,全局数组初始化,C+自动将全局数组变量中的所有元素初始化为0或null。 一个全局的字符数组中的所有元素将为null(空),一个全局的数字数组中的所有元素将为0。 程序中应尽量限制全局数组变量的使用。如果要用,最好用语句将其显式初始化为0,2020/9/6,20,5.3.1数组成员的初始化,数组初始化时,用作初始化的数组元素值放在一个大括号中 例如: int a3= 1, 1, l ; /含三个元素的整型数组,元素的值都是1,2020/9/6,21,注意,初始化值的个数可少于数组元素个数。没有被初始化的元素将赋值为0。 初始化数组的值的个数不能多于数组元素个数,也不能用逗号来省略对部分元素的初始化,这种做法在C中是允许的,但在C+中不允许。,2020/9/6,22,错误例子,int array15=0,1,2,3,4,5; int array25, , 1, 2, 3 ; int array25=0,2,3,4; int array35= ;,2020/9/6,23,例5.2初始化全局和局部数组,#include using namespace std; int array15=1,2,3; static int array25=1; void main() int arr15=2; static int arr25=1,2; int n; cout global:n; for(n=0; n5; n+) cout array1n;,2020/9/6,24,cout nglobal static:n; for(n=0; n5; n+) cout array2n; cout nlocal:n; for(n=0; n5; n+) cout arr1n; cout nlocal static:n; for(n=0; n5; n+) cout arr2n; cout endl; 运行结果为: global: 1 2 3 0 0 /全局数组初始化的结果 global static: 1 0 0 0 0 /全局静态数组初始化的结果 local: 2 0 0 0 0 /局部数组初始化的结果 local static: 1 2 0 0 0 /局部静态数组初始化的结果,2020/9/6,25,5.3.2在程序中进行初始化,大多数情况下,在定义数组时并不知道它的内容,需要在程序中,由用户输入或读磁盘文件数据对数组进行初始化。这时,for循环语句是一个强有力的工具。 在数组使用中,数组名不能出现在赋值语句中等号的左边。,2020/9/6,26,注意,不能直接把一个数组赋给另一个数组 saved_sales =total_sales; /error 应使用一个循环语句将total_sales中的元素的值逐个赋给数组saved_sales中的每个元素 for (int i=0;iARRAY_SIZE;i+) saved_salesi =total_salesi;,2020/9/6,27,例5.3 将5个温度值赋给数组,#include void main() float temp5; temp0=31.3; temp1=28.7; temp2=32.2; temp3=34.5; temp4=19.7; coutDaily temperature for 5 daysn; for (int i=0;i5;i+) couttempin; ,2020/9/6,28,5.3.3数组省略初始化方法,有初始化的数组定义可以省略方括号中的数组大小。 例如,下面的代码中数组定义为5个元素: int array=0,1,2,3,4;,2020/9/6,29,数组的大小,编译时必须知道数组的大小。通常方括号内的数字决定了数组的大小。 有初始化的数组定义又省略方括号中的数组大小时,编译器统计花括号之间的元素个数,以求出数组的大小。 例如,下面的代码产生相同的结果: int array15= 0,1,2,3,4 ; int array2 = 0,1,2,3,4 ;,2020/9/6,30,大括号的使用,通过使用大括号,可在定义时初始化任何一种类型的数组。 例如: double sales= 4323.43,122355.32,343324.96 ; 注意:上面这种使用大括号来初始化数组的方法只能在定义数组时使用。在数组定义之后,就不能用这种方法了,而只能逐个元素地赋值。,2020/9/6,31,元素赋0,如果在数组定义时,只对其中部分元素赋了初值,C+会自动将其余的元素赋0。 如果希望将一个大数组中的所有元素同时初始化为0,则可以在定义这个数组时,只将数组的第一个元素赋初值0。这样,系统会自动把其余的元素都赋为0。,5.4 数组的大小和越界数组,2020/9/6,33,5.4数组的大小和数组越界,定义数组时,编译器必须知道数组的大小。 如果数组定义时省略了大小,只是由初始化的值来决定其大小。在程序中怎么知道数组的大小呢? sizeof操作解决了该问题。,2020/9/6,34,sizeof,sizeof()能够返回传递给它的数据类型所占用内存的字节数。 数组的大小可用用以下公式来计算: 数组大小 = sizeof(数组名) / sizeof(数组类型),所有元素所占内存,每个元素所占内存,2020/9/6,35,例5.7 用sizeof确定数组的大小,#include using namespace std; void main() int a=1,2,4,8,16; for(int i=0; i(sizeof(a)/sizeof(int); i+) cout ai ; cout endl; 运行结果为: 1 2 4 8 16,2020/9/6,36,数组和字符串,对于字符串的初始化,要注意数组实际分配的空间大小是字符串中字符个数加上末尾的0结束符。 例5.8 比较字符串数组大小和字符串长度的差别。 解:用sizeof计算数组大小,用strlen函数计算字符串长度。,2020/9/6,37,例5.8中 两个数组在内存中的存放int exemptions5=1,2,3,4,5; char sal_codes5=a,b,c,d,e; exemptions6=65;,2020/9/6,38,注意,C+允许对数组中的越界元素赋值,破坏了其它数组的内容,这很危险 防止的工作落在编程者的身上,5.5 字符数组,2020/9/6,40,5.5字符数组,我们知道,字符串常量是用一对双引号括起来的字符序列,每个字符占一个字节,并在末尾添加0作为结尾标记。,2020/9/6,41,5.5.1字符数组定义,C+的基本数据类型变量中,没有字符串变量,而是使用字符型数组来存放字符串。 如果我们对数组进行初始化赋值时,在末尾放置一个0,便构成了C+字符串。,2020/9/6,42,例5.9 字符数组的初始化和使用,#include void main() char str18=112,114,111,103,114,97,109,0 ; char str28=P,r,o,g,r,a,m,0 ; char str38=program; char str4=program; for (int i=0;i8;i+) coutstr1i; coutendl; coutstr2endl; coutstr3endl; coutstr4endl; ,2020/9/6,43,注意,字符串整体输入/输出时,要注意: 输出字符不包括0。 输出字符串时,输出项是字符数组名,输出时遇到0结束。 输入多个字符串时,以空格分隔;输入单个字符串时其中不能有空格。,2020/9/6,44,5.5.2初始化字符数组,初始化字符数组有两种方法, 一种是: char array10=“hello”; 另一种是: char array10= h, e, l, l, o, 0;,2020/9/6,45,比较,第一种方法用途较广,初始化时,系统自动在数组没有填值的位置用0补上。这种方法中的花括号可以省略 char array10=“hello”; 第二种方法如同初始化整型数组。这种方法通常用于输入不容易在键盘上生成的那些不可见字符。例如: char array10= t, t, t, t, 0;,2020/9/6,46,注意,不要忘记为最后的 0分配空间。如果要初始化一个字符串“hello”,那为它定义的数组至少有6个数组元素。 例如: char array5=“hello”; 该代码不会引起编译错误,但由于改写了数组空间以外的内存单元,所以是危险的会引起不可预料的错误。,2020/9/6,47,5.5.3 for循环用于字符数组,字符数组,也称为字符串,实际上是1字节的整数数组。 处理字符数组的方法与处理其他数组相同,但若考虑到了字符串末尾的 0结束符,是很有益的。,2020/9/6,48,例5.10字符串的输入和输出,输入一个字符串,输出这个字符串及字符数目。 #include using namespace std; void main() int a=0; char chArray30; cinchArray; for(int i=0; chArrayi!=0; i+) cout chArrayi; a+; cout endl; cout输入的字符数是:aendl; ,5.6 向函数传递数组,2020/9/6,50,5.6 向函数传递数组,无论何时,将数组作为参数传给函数,实际上只是把数组的地址传给函数。 物理上,把整个数组放在栈中是不合理的,因为栈大小是一定且有限的。 如果把传送给函数的整个数组都放在栈中(内存的大块复制),则很快会把栈空间用光。,2020/9/6,51,5.6.1传递给标准库函数,C+中有一个memset()的函数,它可以一字节一字节地把整个数组设置为一个指定的值。 memset()函数在 memory.h头文件中声明,它把数组的起始地址作为其第一个参数,第二个参数是设置数组每个字节的值,第三个参数是数组的长度(字节数,不是元素个数)。 其函数原型为: void * memset(void *,int ,unsigned); 其中void*表示地址。,2020/9/6,52,5.6.2传递给自定义函数,让一个函数求数组元素的和 需传递一个数组参数和数组大小参数 因为从传递的数组参数(地址)中,没有数组大小的信息。,2020/9/6,53,例5.12 数组名作为函数的形参,using namespace std; int sum(int , int); void main() static int ia5=2,3,6,8,10; int sumOfArray; sumOfArray=sum(ia, 5); cout “数组元素的和等于: ” sumOfArray endl; 运行结果为; 数组元素的和等于: 29,int sum(int array, int len) int iSum=0; for(int i=0; ilen; i+) iSum+=arrayi; return iSum; ,2020/9/6,54,注意,sum()函数以整数数组作为第一个参数,以整数作为第二个参数。 由于传递数组名实际上传递的是地址,所以函数原型中,数组参数的书写形式无须在方括号中写明数组大小。 如果写明了数组大小,编译器将忽略之,5.7 多维数组 (只需要掌握到2维),2020/9/6,56,5.7.1理解多维数组,一维数组是多个数值的单列表示,而多维数组则是数值的表格,甚至多表格表示,它具有多个下标值,最常用的表格是二维表格(具有两个下标)。,2020/9/6,57,例子,假定要记录一个垒球队中每个队员的击球数。队中有6个队员,进行了3场比赛。表中所示为击球记录。,2020/9/6,58,2020/9/6,59,5.7.2多维数组的表示方式,表示多维数组时,你必须让C+明白数组具有多维。多个下标,每个下标代表一个维、并用中括号括起。 例如,可使用下面的多维数组声明一个6行3列的整型数组teams: int teams63;/二维数组,2020/9/6,60,表5.2球队数组的下标,team表具有18个元素,元素下标值如下表,2020/9/6,61,总元素个数,多维数组的总的元素个数可以通过下标相乘获得。 假如你要记录年度使用的账单,如下数组声明所示, float utilities124; 记录12个月中四项开支的账单,数组元素为浮点类型。12乘以4得48,于是这个数组有48个元素。,2020/9/6,62,5.7.3数组在内存的映象,C+存储多维数组的方式与绝大多数其他的编程语言略有不同。 通过使用下标,不了解多维数组的内存映象也可以对其进行操作。 理解数组在内存中的形式,这对编制高级应用程序很有用处。,2020/9/6,63,传递和接收多维数组,二维数组实际上是“数组的数组”,它以行和列的形式出现,实际上还是一个一维数组,只不过数组的每个元素的类型不是整型,浮点型或字符型,而是另外一个数组。 传递和接收多维数组关键在于应明白多维数组是数组的数组。C+通过地址参数传递数组,多维数组也不例外。,2020/9/6,64,例子,一个 scores的56的整型数组,把 scores传给print_it()的函数: print_it ( scores ); /pass table to a function 函数print_it()必须知道所接收参数的类型以及该参数是一个数组,如果传递的参数是一维数组,可以如下编写语句: print_it (int scores); 或 print_it (int scores10);,2020/9/6,65,C+按行存储多维数组,通常,你无需过多考虑表格的物理存储方式,多维表即是元素为数组的数组,编程时只要用下标表示它们的行、列位置就行了。 多维数组按行存储。考虑一个44的表格,图5.4所示为这个表的直观映象,二维表内存映象依然是顺序的存储。,2020/9/6,66,二维表的内存映象,C+按行把多维数组映射到线性内存 图示一个44的数组 int table44 的内存映象,2020/9/6,67,5.7.4 定义多维数组,C+是宽松的,它允许在说明部分,初始化并定义多维数组。和一维数组一样,在初始化多维数组时要使用大括号。因为多维数组是数组的数组,所以在初始化时要使用嵌套的括号。,2020/9/6,68,例子,初始化三个数组:aral,ara2和 ara3。 int aral58, 5, 3, 25, 41; int ara224=4, 3, 2, 1, 1,2,3,4; int ara334=l,2,3,4, 5,6,7,8, 9,10,11,12;,2020/9/6,69,以一维数组的形式进行初始化,C+亦允许多维数组以一维数组的形式进行初始化,但必须注意要按行排列 下面是ara2和ara3的另一种初始形式: int ara224=4, 3, 2, 1,1,2,3,4; int ra334= l,2,3,4,5,6,7,8,9,10,11,12;,2020/9/6,70,二维数组看作是一维数组的一维数组,一维数组的4个元素是ara_name0 ara_name3。每一个元素则是其对应的一维数组的首地址。,2020/9/6,71,Arra0,int Arra32,Arra1,. . .,Arra00,Arra01,Arra10,Arra11,Arra20,Arra21,Arra2,2020/9/6,72,5.7.5表格与for循环,嵌套循环适用于多维数组 注意到for循环的循环次数与数组的下标数目相同,外层循环代表第一个下标(行下标);内层循环代表第二个下标(列下标)。 嵌套for循环将遍历表中的每一个元素。,2020/9/6,73,例5.13嵌套for循环处理多维表,int main() for (row=0;row2;row+) for (col=0;col4;col+) coutrow” ” coln; ,输出结果 00 01 02 10 11 12,2020/9/6,74,注意,表格的数据输入可以使用cin(),get()或其他函数,也可以在说明表格时为元素赋值。 通常使用来自磁盘上的数据文件。不管使用什么方法存储多维数组的数值,都可以使用嵌套for循环遍历每个元素,2020/9/6,75,例5.15 输出带标题的二维表格,void main() float disk24; /存放磁盘价格表 int row,col; disk00=2.30; /第一行第一列 disk01=2.75; disk02=3.20; disk03=3.50; disk10=1.75; disk11=2.10; disk12=2.60; disk13=2.95;,2020/9/6,76,couttSingle-Side,tDouble-Side tSingle-Side,tDouble-Siden; couttDouble-density,tDouble-density tHigh-density,tHigh-densityn; for (row=0;row2;row+)/打印表格 if (row=0) cout3 incht; else cout5 incht; for (col=0;col4;col+) cout$setprecision(2) diskrowcoltt; coutn; ,2020/9/6,77,程序运行结果,输出带标题的二维表格,2020/9/6,78,本章小结,本章介绍了如何定义和初始化一个数组。数组的初始化可以在声明部分进行,也可以在程序体中进行。 学习如何定义,初始化及处理多维数组,尽管并非所有数据适用于表格的紧缩格式,但它确实在很多时候非常有用。使用嵌套for循环可以遍历多维数组。 引入数组,处理数组元素比处理相同个数的单个变量要简单得多 作业 P119. 第 5, 9,15 题,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!