700 likes | 853 Views
主要内容安排. 第一章: C++ 入门 第二章:基本数据类型与输入输出 第三章:表达式与语句 第四章:过程化语句 第五章:函数 第六章:程序结构 第七章:数组. 第七章 数组. 7.1 数组定义 7.2 访问数组元素 7.3 初始化数组 7.4 向函数传递数组 7.5 二维数组 7.6 数组应用 小结. 第七章 数组. 引言 : ( 1 )在这之前所介绍的数据都是基本数据类型(整形,字符型,浮点型)。 ( 2 )人们经常需要使用大量集中在一起的数据来工作, C++ 支持数组处理来满足这一需求。
E N D
主要内容安排 第一章:C++入门 第二章:基本数据类型与输入输出 第三章:表达式与语句 第四章:过程化语句 第五章:函数 第六章:程序结构 第七章:数组
第七章 数组 7.1 数组定义 7.2 访问数组元素 7.3 初始化数组 7.4 向函数传递数组 7.5 二维数组 7.6 数组应用 小结
第七章 数组 引言: (1)在这之前所介绍的数据都是基本数据类型(整形,字符型,浮点型)。 (2)人们经常需要使用大量集中在一起的数据来工作,C++支持数组处理来满足这一需求。 (3)数组可以是一维的,也可以是多维的,许多重要的应用都是基于数组的。
7.1 数组定义 定义: 数组是一个由若干同类型变量组成的集合。 一维数组的定义格式: 类型说明符 数组名 [常量表达式];
7.1 数组定义(续1) 说明: (1)类型说明符:说明数组元素的类型 (2)数组名:命名规则同变量名 (3)常量表达式:表示元素的个数,即数组长度。 (4)[]:下标运算符,优先级高,结合性从左至右。 (5)数组下标从0开始,到n-1;下标是数组元素到数组开始的偏移量。
7.1 数组定义(续2) 注意: (1)存储:固定大小、连续的空间 (2)作用域: 局部作用域:栈区、内容不确定,局部可见 全局作用域:全局数据区、初始化为0,全局可见 静态局部作用域:全局数据区、初始化为0,局部可见
7.1 数组定义(续3) 例1: char a[5]; 小结: (1)定义了一个字符数组,存储该数组占5个字符。 (2)这个字符数组可以是最长为4个字符的单词,因为数组第5个字节用于`\0`字符,用`\0`字符结束的字符数组构成一个字符串。
7.1 数组定义(续4) 例2: int iArray [10] ; //全局数组 void funcA( ); void funcB( ); void main( ) { funcA( ); funcB( );} void funcA( ) { static int iStaticlocal[30] ;//局部静态数组 //… } void funcB( ) { int iLocal[20] ; //局部数组 //…}
7.1 数组定义(续5) 使用说明: (1)如果要定义一个很大的数组,将其定义为静态或全局数级组,或将其在堆内分配。 (2)在编译时,数组定义中的下标必须确定。 (3)不允许用全局变量的值确定数组下标。 (4)允许用常量来规定数组元素个数。
7.1 数组定义(续6) 例: void main( ) { int size = 50; int array[size] ; //error:不能用变量来描述数组定义中的元素个数 //… }
7.1 数组定义(续7) 例: (续1) int size = 50; void main( ) { int array[size] ; //error:不允许用全局变量的值来确定数组下标 //… }
7.1 数组定义(续8) 例: (续2) const int size = 50; const int n = size * sizeof(int) ; void main() { int array[size] ; //ok char charray[n] ; //ok:允许用常量来规定数组元素个数 //… }
第七章 数组 7.1 数组定义 7.2 访问数组元素 7.3 初始化数组 7.4 向函数传递数组 7.5 二维数组 7.6 数组应用 小结
7.2 访问数组元素 引言:数组中特定元素通过下标来访问。 格式:数组名[常量表达式] 说明: (1)长度为n的数组,其下标范围为:0~n-1。 (2)若超出数组边界,不会在程序的编译与连接中反映出来,直到结果不正确或死机。
7.2 访问数组元素(续1) 补充: 一维数组的输入与输出:一重循环 例1: int a[10], i; for(i=0; i<=9; i++)cin>>a[i]; //输入 for(i=0; i<=9; i++)cout<<a[i]<<endl; //输出
7.2 访问数组元素(续2) 例2:求斐波那契数列 void main( ) { int iArray[10],i; iArray[0]=1; iArray[1]=1; for(i=2;i<10;i++) iArray[i]= iArray[i-1]+ iArray[i-2] ; for(i=0;i<10;i++)cout<< iArray[i]<<endl; }
7.2 访问数组元素(续3) 字符数组:也称为字符串,实际是1字节的整数数组,字符串末尾用`\0`结束符。 例3:下面的程序输出一个字符串 //ch7_1.cpp #include<iostream.h> void main( ) { char chArray[30] ; cin.get(chArray,30) ; for(int i=0;chArray[i]!=`\0`;i++) cout<<chArray[i] ; cout<<endl; }
7.2 访问数组元素(续4) 补充库函数: 原型: get(char *target,int count ,char delimeter=`\n`); 功能:输入一系列字符,直到输入流中出现结束符或所读字符个数已达到要求读的字符的个数。
第七章 数组 7.1 数组定义 7.2 访问数组元素 7.3 初始化数组 7.4 向函数传递数组 7.5 二维数组 7.6 数组应用 小结
7.3 初始化数组 主要内容: 一、数组的初始化 二、初始化字符数组 三、省略数组大小
7.3 初始化数组 一、数组的初始化 定义:在定义数组时,使它包含程序马上能使用的值。 格式:类型说明符 数组名 [常量表达式]={常数表}; 例: int iArray[10]={1,1,2,3,5,8,13,21,34,55}; //初始化
7.3 初始化数组(续1) 使用说明: (1)初始化数组的值的个数不能多于数组元素个数,也不能通过跳过逗号的方式来省略。 (2)初始化值的个数可少于数组元素个数。前面的按序初始化相应值,后面的初始化为0。
7.3 初始化数组(续2) 例:初始化数组 //ch7_2.cpp #include<iostream.h> int array1[5]={1,2,3}; static int array2[5]={1}; void main( ) { int arr1[5]={2}; static int arr2[5]={1,2}; int n; cout<<〞global:\n〞;
7.3 初始化数组(续3) 例:初始化数组 (续1) for(n=0;n<5;n++) cout<<〞〞<<array1[n] ; cout<<〞\nglobal static:\n〞; for(n=0;n<5;n++) cout<<〞〞<<array2[n] ; cout<<〞\nlocal:\n〞; for(n=0;n<5;n++) cout<<〞〞<<arr1[n] ; cout<<〞\nlocal static:\n〞; for(n=0;n<5;n++) cout<<〞〞<<arr2[n] ; cout<<endl; }
7.3 初始化数组(续4) 例:初始化数组 (续2) 运行结果: 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
7.3 初始化数组(续5) 二、初始化字符数组 方法1: char array[10]={〞hello〞}; char array[10]=〞hello〞; 方法2: char array[10]={′h′,′e′,′l′,′l′,′o′,′\0′}; 注意: 不要忘记为最后的`\0`分配空间。
7.3 初始化数组(续6) 三、省略数组大小 (1)定义数组时方括号内的数字决定了数组的大小。 (2)有时初始化的数组定义省略方括号中数组的大小,编译器统计花括号之间的元素个数,以求出数组的大小。 (3)用sizeof确定数组的大小。 (4)省略数组大小只能在有初始化的数组定义中。 (5)在定义数组的场合,无论如何,编译器必须知道数组的大小。
7.3 初始化数组(续7) 例://ch7_3.cpp #include<iostream.h> void main( ) { static int a[ ]={1,2,4,8,16} ; for(int i= 0;i<(sizeof(a)/sizeof(int));i++) cout<<a[i]<<〞〞; cout<<endl; } 小结:sizeof(a):数组占空间的大小; sizeof(int):数组元素占空间的大小; sizeof(a)/sizeof(int):数组元素的个数。
7.3 初始化数组(续8) 例://ch7_4.cpp #include<iostream.h> #include<string.h> void main( ) { char ch[ ]= 〞how are you〞; cout<<〞size of array:〞<<sizeof(ch)<<endl; cout<<〞size of string:〞 <<strlen(〞how are you〞)<<endl; } 运行结果为:size of array:12 size of string:11
第七章 数组 7.1 数组定义 7.2 访问数组元素 7.3 初始化数组 7.4 向函数传递数组 7.5 二维数组 7.6 数组应用 小结
7.4 向函数传递数组 主要内容: 一、传递给标准库函数 二、传递给自定义函数
7.4 向函数传递数组 引言: 无论何时,将数组作为参数传给函数,实际上只是把数组的地址传给函数。 原因:栈大小是有限的。如果把传送给函数的整个数组都放在栈中,则很快会把栈空间用光。
7.4 向函数传递数组(续1) 一、传递给标准库函数 函数原型为: void *memset(void*,int,unsigned); 功能:一字节一字节的把整个数组设置为一个指定的值。
7.4 向函数传递数组(续2) 说明: (1)memset()函数在mem.h头文件中声明。 (2)第一个参数代表数组的起始地址, 第二个参数是设置数组每个字节的值, 第三个参数是数组的长度(以字节数为单位)。 小结:数组名作参数即数组作参数,它仅仅只是一个数组的起始地址而已。
7.4 向函数传递数组(续3) 例:将数组元素全部设置成0 #include<mem.h> void main() {int ia1[50] ; int ia2[500] ; memset(ia1,0,50*sizeof(int)) ; memset(ia2,0,500*sizeof(int)) ; //… }
7.4 向函数传递数组(续4) 二、传递给自定义函数 例:调用一个函数求数组元素之和 //ch7_5.cpp #include<iostream.h> int sum(int[],int) ; void main( ) { static int ia[5]={2,3,6,8,10}; int sumOfArray; sumOfArray=sum(ia,5) ; cout<<〞sum of array:〞<< sumOfArray <<endl; }
7.4 向函数传递数组(续5) 例:调用一个函数求数组元素之和(续) int sum(int array[ ],int len) ; { int isum=0; for(int i = 0;i<len;i++) isum + =array[i] ; return isum; } 运行结果: sum of array:29
7.4 向函数传递数组(续6) 说明: (1)sum()函数以数组名作为第一个参数,用来传递数组的起始地址(首地址),方括号代表的是数组,不能省略,但下标参数可以省略。 (2)以整数作为第二个参数,用来传递数组的大小,不能省略。
第七章 数组 7.1 数组定义 7.2 访问数组元素 7.3 初始化数组 7.4 向函数传递数组 7.5 二维数组 7.6 数组应用 小结
7.5 二维数组 主要内容: 一、二维数组定义 二、初始化 三、省略第一维大小 四、作为参数传递 五、降维处理
7.5 二维数组 一、二维数组定义 需要两个下标标识某个元素的数组称为二维数组。 定义格式: 类型说明符 数组名[常量表达式1][常量表达式2];
7.5 二维数组(续1) 说明: (1)常量表达式1:代表行下标,从0开始,到n-1 (2)常量表达式2:代表列下标,从0开始,到m-1 (2)数组元素的个数:行下标*列下标 (3)存储:固定大小、先行后列(行优先)、连续的空间 (4)访问数组元素: 数组名 [常量表达式1] [常量表达式2] (5)输入输出:双重循环
7.5 二维数组(续2) 例: int a[3][4]; 说明:表示一个名为a的3行*4列的整型二维数组,第一个下标范围是0~2,第二个下标范围是0~3。二维数组是按先行后列的顺序在内存中线性排列的。 a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] … a[2][3]
7.5 二维数组(续3) 二、初始化 格式: 类型说明符 数组名 [常量表达式1] [常量表达式2]={常数表} ; 说明: 常数表中的值是按行用花括号组合在一起的。 例:int b[2][3]={{1,2,3},{4,5,6}};
7.5 二维数组(续4) 例://ch7_6.cpp #include<iostream.h> void main( ) { int array1[2][3]={1,2,3,4,5}; int array2[2][3]={{1,2},{4}}; int i,j; for(i=0;i<2;i++) { for(j=0;j<3;j++) cout<<array1[i][j]<<〞,〞; cout<<endl; }
7.5 二维数组(续5) 例://ch7_6.cpp (续) cout<<endl; for(i=0;i<2;i++) { for(j=0;j<3;j++) cout<<array2[i][j]<<〞,〞; cout<<endl; } }
7.5 二维数组(续6) 例://ch7_6.cpp (续) 运行结果: 1,2,3, 4,5,0, 1,2,0, 4,0,0,
7.5 二维数组(续7) 三、省略第一维大小 如果对全部元素都赋初值,则定义数组时对第一维的大小可以忽略,但第二维的大小不能省。 例: int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 与下面的代码是等价的 int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
7.5 二维数组(续7) 四、作为参数传递 作为参数传递一个二维数组给函数,其意义为内存地址,所以原型中,声明整数数组参数的形式只能省略左边的方括号。
7.5 二维数组(续8) 例:定义一个3*4的数组,表示3个学生,每个学生有4次测验成绩,求所有学生中的最好成绩。 //ch7_7.cpp #include<iostream.h> int maximum(int[][4],int,int) ; void main( ) { int sg[3][4]={{68,77,73,86}, {87,96,78,89},{90,70,81,86}}; cout<<〞the max grade is〞 <<maximum(sg,3,4)<<endl; }