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

上传人:本田雅阁 文档编号:3479269 上传时间:2019-09-01 格式:PPT 页数:63 大小:553.52KB
返回 下载 相关 举报
C大学基础教程第五章zhou.ppt_第1页
第1页 / 共63页
C大学基础教程第五章zhou.ppt_第2页
第2页 / 共63页
C大学基础教程第五章zhou.ppt_第3页
第3页 / 共63页
C大学基础教程第五章zhou.ppt_第4页
第4页 / 共63页
C大学基础教程第五章zhou.ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《C大学基础教程第五章zhou.ppt》由会员分享,可在线阅读,更多相关《C大学基础教程第五章zhou.ppt(63页珍藏版)》请在三一文库上搜索。

1、C+大学基础教程,第5章 数组 北京科技大学 计算机系,2019/9/1,北京科技大学计算机系,-2-,数组基本概念,数组是具有一定顺序关系的若干相同类型变量的集合。 组成数组的变量称为该数组的元素。 数组元素都有相同的变量名(数组名),但是有不同的下标。 数组属于构造类型,一个人N门课的成绩怎样存储和处理? 一个班N门课的成绩怎样存储和处理?,2019/9/1,北京科技大学计算机系,-3-,一维数组的定义与引用,一维数组的定义 类型说明符 数组名 常量表达式 ; 例如: int a10; 1) a 为整型数组名; 2)a数组有10个元素,每个元素都是整数数据:a0.a9,数 组,上C+课程的

2、学生成绩(120个学生) float scoresCPlus120;,scoresCPlus0,scoresCPlus119,一维数组的存储顺序,数组元素在内存中顺次存放,它们的地址是连续的。 Eg.int a10; 具有10个元素的数组 a,在内存中的存放次序如下:,数组名字是数组首元素的内存地址。 数组名是一个常量,不能被赋值。,数 组,2019/9/1,北京科技大学计算机系,-5-,一维数组的定义与引用,引用 数组必须先定义,后使用。 只能逐个引用数组元素,而不能一次引用整个数组 数组元素的引用是通过下标变量实现的。 元素的引用形式为: 数组名下标表达式 例如1:int a10; a0=

3、a5+a7-a2*3 2: int salaries 6; int a=5; salariesa=900;,数 组,2019/9/1,北京科技大学计算机系,-6-,注意,在使用数组元素时需要注意: 数组元素的下标表达式其结果必须正整数(0)。 数组元素的下标值从0开始,不得超过声明时所定义的上界。,2019/9/1,北京科技大学计算机系,-7-,数组的下标,数组元素的下标是数组元素到数组开始地址的偏移量。 第1个元素的下标为0,其地址是数组的首地址,第2个元素的下标为1,偏移量距离首地址是1个数组元素大小,依次类推。 因此,数组元素是一系列大小相同的连续项,每项到公共基点(数组起始地址)的偏移

4、量是固定的。,2019/9/1,北京科技大学计算机系,-8-,错误的数组定义语句,void VoidArray10; /void不可以做数组类型 int a=9; float floatArraya; /数组的长度不可以是变量 char charArray1.5+1.5; /3.0不是整数,2019/9/1,北京科技大学计算机系,-9-,例5.1 定义一个10个整数的数组,解:以ARRAY命名的数组,用100至109对数组元素赋值,并对其求和。需要在一个循环中使用数组。这是使用数组最经常的方式。 void main() int ARRAY 10; int sum=0; for (int i=0

5、;i10;i+) ARRAYi=100+i; sum+= ARRAYi; ,2019/9/1,北京科技大学计算机系,-10-,注意,不能直接把一个数组赋给另一个数组。假设要将数组total_sales的值拷贝到数组saved_sales中,使用下面的赋值方法就是错误的: saved_sales =total_sales; /error 应使用一个循环语句将total_sales中的元素的值逐个赋给数组saved_sales中的每个元素。如下面的代码所示: for (int i=0;iARRAY_SIZE;i+) saved_salesi =total_salesi;,2019/9/1,北京科技

6、大学计算机系,-11-,一维数组的初始化,可以使数组得到初值: 在声明数组时对数组元素赋以初值。 例如:int a10=0,1,2,3,4,5,6,7,8,9; 可以只给一部分元素赋初值。其他元素自动赋值为0 例如:int a10=0,1,2,3,4; 在对全部数组元素赋初值时,可以不指定数组长度。长度为初值的个数。 例如:int a =1,2,3,4,5 等价于 int a5=1,2,3,4,5,数 组,2019/9/1,北京科技大学计算机系,-12-,大括号的使用,通过使用大括号,可初始化任何一种类型的数组。 例如,要记录前三年的销售总额,则可以如下定义并初始化一个数组: double s

7、ales= 4323.43,122355.32,343324.96 注意:上面这种使用大括号来初始化数组的方法只能在定义数组时使用。在数组定义之后,就不能用这种方法了,而只能逐个元素地赋值。 double sales3; sales= 4323.43,122355.32,343324.96,2019/9/1,北京科技大学计算机系,-13-,全局数组初始化,C+自动将全局数组变量中的所有元素初始化为0或null。 如果未赋初值,那么一个全局的字符数组中的所有元素将为null(空),一个全局的数字数组中的所有元素将为0。 程序中应尽量限制全局数组变量的使用。如果要用,也最好在程序中用语句将其显式初

8、始化为0,以明确表示编程者的意图。,2019/9/1,北京科技大学计算机系,-14-,错误例子,例如下面的代码对数组进行初始化是错误的: int array15=0,1,2,3,4,5; /error初始化值个数多于数组元素个数 int array25, , 1, 2, 3 ; /error不能加入“,”来跳过不赋值的元素。 int array25=0,2,3,4; /error不能加入“,”来跳过不赋值的元素。 int array35= ; /error语法格式错误,2019/9/1,北京科技大学计算机系,-15-,例5.2初始化全局和局部数组,#include using namespac

9、e std; int array15=1,2,3; static int array25=1; void main() int arr15=2; static int arr25=1,2; int n; cout “global:“; for(n=0; n5; n+) cout “ “ array1n; 运行结果为: 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 /局部静态数组初始化的结果,cout

10、 “nglobal static:“; for(n=0; n5; n+) cout “ “ array2n; cout “nlocal:n“; for(n=0; n5; n+) cout “ “ arr1n; cout “nlocal static:“; for(n=0; n5; n+) cout “ “ arr2n; cout endl;,2019/9/1,北京科技大学计算机系,-16-,例5.3 将5个温度值赋给数组,#include “stdafx.h“ #include void main() float temp5; temp0=31.3; temp1=28.7; temp2=32.

11、2; temp3=34.5; temp4=19.7; cout“Daily temperature for 5 daysn“; for (int i=0;i 5 ;i+) couttempi“n“; ,2019/9/1,北京科技大学计算机系,-17-,数组的大小和数组越界,定义数组时,编译器必须知道数组的大小。 如果数组定义时省略了大小,由初始化的值的个数来决定数组大小。 在程序中怎么知道数组的大小呢? sizeof操作解决了该问题。,2019/9/1,北京科技大学计算机系,-18-,sizeof,sizeof()能够返回传递给它的数据类型所占用内存的字节数。 如果将一个数组变量传给sizeo

12、f(),则它将返回系统为此数组在内存中预留的字节数。 因此,数组的大小可用用以下公式来计算: 数组大小 = sizeof(数组名) / sizeof(数组类型),2019/9/1,北京科技大学计算机系,-19-,例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,2019/9/1,北京科技大学计算机系,-20-,一维数组的

13、举例,例: 6个整数排列顺序,从小到大排列输出。 1)定义存放6个数的变量 int a6; 2)先从6个数中找到最小,放到a0中。 for (i=1;iai) swap(a0,ai); 3)再从5个数中找到最小,放到a1中。 for (i=2;iai) swap(a1,ai);,数 组,2019/9/1,北京科技大学计算机系,-21-,以6个数:3、7、5、6、8、0为例。 思路: 第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。 第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个

14、数则是次小的数; 。,选择法序排序(从小到大)。,2019/9/1,北京科技大学计算机系,-22-,不交换,不交换,不交换,不交换,第一趟 j=0,交换,选择法序排序(续)。,2019/9/1,北京科技大学计算机系,-23-,j=1,j=2,j=3,j=4,j=0,选择法序排序(续)。,2019/9/1,北京科技大学计算机系,-24-,一维数组的举例,例: 6个整数排列顺序,从小到大排列输出。 算法的实现使用二重循环: for (j=0;jai) swap(ai,aj);,数 组,2019/9/1,北京科技大学计算机系,-25-,理解多维数组(5.7),一维数组是多个数值的单列表示,而多维数组

15、则是数值的表格,甚至多表格表示,它具有多个下标值,最常用的表格是二维表格(具有两个下标)。,2019/9/1,北京科技大学计算机系,-26-,例子,假定要记录一个垒球队中每个队员的击球数。队中有6个队员,进行了3场比赛。表中所示为击球记录。,2019/9/1,北京科技大学计算机系,-27-,三维表的图示,C+提供存储多维数据的能力,尽管现实世界很少碰到三维以上的情况。,存储顺序 按行存放,上例中数组a的存储顺序为:,二维数组的声明 类型说明符 数组名常量表达式常量表达式 例如:float a34;,引用 例如:b12=a23/2,下标不要越界,二维数组的定义及引用,数 组,2019/9/1,北

16、京科技大学计算机系,-29-,表5.2球队数组的下标,team表具有18个元素, 定义: int team63 元素下标值如下表,2019/9/1,北京科技大学计算机系,-30-,C+按行存储多维数组,二维数组实际上是“数组的数组”,它以行和列的形式出现,实际上还是一个一维数组,只不过数组的每个元素的类型不是整型,浮点型或字符型,而是另外一个数组。 数组元素也是连续存储的,按行存储,即最右边的下标变化最快,最左边的下标变化最慢。,2019/9/1,北京科技大学计算机系,-31-,二维数组看作是一维数组的一维数组,一维数组的4个元素是ara_name0 ara_name3。每一个元素则是其对应的

17、一维数组的首地址。,2019/9/1,北京科技大学计算机系,-32-,二维表的内存映象,C+按行把多维数组映射到线性内存 图示一个44的数组 int table33 的内存映象,分行给二维数组赋初值 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 将所有数据写在一个内,按顺序赋值 例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 可以对部分元素赋初值 例如:int a34=1,0,6,0,0,11;,二维数组的初始化,数 组,2019/9/1,北京科技大学计算机系,-34-,5.7.5表格与for循环,嵌套循环适用于多维数组 注意到fo

18、r循环的循环次数与数组的下标数目相同,外层循环代表第一个下标(行下标);内层循环代表第二个下标(列下标)。 嵌套for循环将遍历表中的每一个元素。,2019/9/1,北京科技大学计算机系,-35-,例5.13嵌套for循环处理多维表,int main() for (row=0;row2;row+) for (col=0;col4;col+) coutrow” ”col“n“; 将产生如下输出结果 0 0 0 1 0 2 1 0 1 1 1 2,2019/9/1,北京科技大学计算机系,-36-,例5.15 输出带标题的二维表格,void main() float disk24; /存放磁盘价格表

19、 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;,2019/9/1,北京科技大学计算机系,-37-,cout“tSingle-Side,tDouble-Side“ “tSingle-Side,tDouble-Siden“; cout“tDouble-density,tDouble-density“ “tHigh-density,tHigh-densityn“; for (row=0;row2;r

20、ow+) /打印表格 if (row=0) cout“3 incht“; else cout“5 incht“; for (col=0;col4;col+) cout“$“setprecision(2) diskrowcol“tt“; cout“n“; ,2019/9/1,北京科技大学计算机系,-38-,程序运行结果,输出带标题的二维表格,2019/9/1,北京科技大学计算机系,-39-,将一个二维数组行和列元素互换,存到另一个二维数组中,例如:,main() 程序 static int a23=1,2,3,4,5,6; static int b32,i,j; cout “array a:n“

21、; for(i=0;i=1;i+) for(j=0;j=2;j+) cout setwidth(5)aij; bji=aij; cout endl; cout “array b:n“; for(i=0;i=2;i+) for(j=0;j=1;j+) cout setwidth(5)bij; cout endl; ,运行结果: array a: 1 2 3 4 5 6 array b: 1 4 2 5 3 6,2019/9/1,北京科技大学计算机系,-40-,字符数组,字符串常量:是用一对双引号括起来的字符序列,每个字符占一个字节,并在末尾添加0作为结尾标记。例如:“china“ 没有字符串变量

22、,用字符数组来存放字符串,2019/9/1,北京科技大学计算机系,-41-,字符数组的定义和引用,Eg. 字符数组: char a 5; 存储该数组占5个字节。每个元素的类型是字符型。数组下标从0开始,分别是a0,a1,a2,a3,a4。,格式: char 数组名常量表达式;,2019/9/1,北京科技大学计算机系,-42-,用字符数组存储和处理字符串,例: static char str8=112,114,111,103,114,97,109,0; static char str8=p,r,o,g,r,a,m,0; static char str8=“program“; static cha

23、r str =“program“;,字符数组的初始化,字符串,static char str7 可否?,对数组进行初始化赋值时,在末尾放置一个0,便构成了C+字符串。,例: static char str7=p,r,o,g,r,a,m;,2019/9/1,北京科技大学计算机系,-43-,注意,不要忘记为最后的 0分配空间。如果要初始化一个字符串“hello”,那为它定义的数组至少有6个数组元素。 例如,下面的代码给数组初始化,但会引起不可预料的错误: char array5=“hello”; 该代码不会引起编译错误,但由于改写了数组空间以外的内存单元,所以是危险的。,2019/9/1,北京科技

24、大学计算机系,-44-,例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; ,2019/9/1,北京科技大学计算机系,-45-,数组在内存中的存放,数组元素都是存放在一片连续的内存

25、单元中的。 下图显示 char name=”Ray Krebbs”的内存情况,2019/9/1,北京科技大学计算机系,-46-,字符串的输入/输出,方法 逐个字符输入输出 将整个字符串一次输入或输出 例:char c =“China“; coutc; 注意 输出字符不包括 0 输出字符串时,输出项是字符数组名,输出时遇到0结束。 输入多个字符串时,以空格分隔;输入单个字符串时其中不能有空格。,字符串,2019/9/1,北京科技大学计算机系,-47-,2019/9/1,北京科技大学计算机系,-48-,若改为: static char str13; cinstr; 运行时输入数据: How are

26、 you?,内存中变量 str 内容如下: str: H o w 0,2019/9/1,北京科技大学计算机系,-49-,字符串处理函数,strcat(连接),strcpy(复制), strcmp(比较),strlen(求长度), strlwr(转换为小写), strupr(转换为大写) 头文件,字符串,2019/9/1,北京科技大学计算机系,-50-,字符串处理函数,#include #include void main() char str1=“China“; char str2100; strcpy(str2,str1); cout “str2:“ str2 endl; strcat(st

27、r2,“hello“); cout “str2:“ str2 endl; cout “strlen(str2):“ strlen(str2) endl; cout “sizeof(str2):“ sizeof(str2) endl; ,字符串,China,Chinahello,10,100,例5.8,2019/9/1,北京科技大学计算机系,-51-,例5.10字符串的输入和输出,输入一个字符串,输出这个字符串及字符数目。 #include using namespace std; void main() int a=0; char chArray30; cinchArray; for(int

28、i=0; chArrayi!=0; i+) cout chArrayi; a+; cout endl; cout“输入的字符数是:“aendl; ,2019/9/1,北京科技大学计算机系,-52-,数组作为函数参数,数组元素作实参,与单个变量一样。 数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。,数 组,2019/9/1,北京科技大学计算机系,-53-,使用数组元素作为函数参数,定义 int swap( int b,int c) 调用 int a10; . swap(a1,a2);,数 组,2019/9/1,北京科技大学计算机系,-

29、54-,使用数组名作为函数参数,定义 int sort( int b10) int sort (int b, int number) 调用 int a10; . sort(a); sort(a,10);,数 组,b0,b1,2019/9/1,北京科技大学计算机系,-55-,5.6 向函数传递数组,无论何时,将数组作为参数传给函数,实际上只是把数组的地址传给函数。 物理上,把整个数组放在活动记录中是不合理的,因为存储活动记录的空间大小是一定且有限的。 如果把传送给函数的整个数组都放在栈中(内存的大块复制),则很快会把栈空间用光。,2019/9/1,北京科技大学计算机系,-56-,传递给自定义函数

30、,若要让一个函数求数组元素的和,需传递一个数组参数和数组大小参数。因为从传递的数组参数(地址)中,没有数组大小的信息。,2019/9/1,北京科技大学计算机系,-57-,#include 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,例5.12 数组名作为函数的形参,int sum(int a

31、rray, int len) int iSum=0; for(int i=0; ilen; i+) iSum+=arrayi; return iSum; ,ia,2019/9/1,北京科技大学计算机系,-58-,注意,sum()函数以整数数组作为第一个参数,以整数作为第二个参数。 由于传递数组名实际上传递的是地址,所以函数原型中,数组参数的书写形式无须在方括号中写明数组大小。 如果写明了数组大小,编译器将忽略之。数组形参的全方括号只是告诉函数,该参数是个数组的起始地址。,2019/9/1,北京科技大学计算机系,-59-,例5-4 使用数组名作为函数参数,主函数中初始化一个矩阵并将每个元素都输出

32、,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,并输出各行元素的和。,数 组,int Table34 = 1,2,3,4,2,3,4,5,3,4,5,6;,2019/9/1,北京科技大学计算机系,-60-,void main(void) int Table34 = 1,2,3,4,2,3,4,5,3,4,5,6; for (int i = 0; i 3; i+) for (int j = 0; j 4; j+) cout Tableij “ “; cout endl; RowSum(Table,3); ,2019/9/1,北京科技大学计算机系,-61-,#incl

33、ude void RowSum(int A 4, int nrow) int sum; for (int i = 0; i nrow; i+) sum = 0; for(int j = 0; j 4; j+) sum += Aij; Ai0 = sum; cout “Sum of row “ i “ is “ sum endl; ,2019/9/1,北京科技大学计算机系,-62-,运行结果: 1 2 3 4 2 3 4 5 3 4 5 6 Sum of row 0 is 10 Sum of row 1 is 14 Sum of row 2 is 18,2019/9/1,北京科技大学计算机系,-63-,本章小结,本章介绍了如何定义和初始化一个数组。数组的初始化可以在声明部分进行,也可以在程序体中进行。 现在我们已经学习过了如何定义,初始化及处理多维数组,尽管并非所有数据适用于表格的紧缩格式,但它确实在很多时候非常有用。使用嵌套for循环可以遍历多维数组。 通过本章的学习,我们知道,通过引入数组,处理数组元素比处理相同个数的单个变量要简单得多,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1