C++课件第6章数组_第1页
C++课件第6章数组_第2页
C++课件第6章数组_第3页
C++课件第6章数组_第4页
C++课件第6章数组_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第6章 数组,本章主要介绍数组的定义及应用,包括一维数组、多维数组和字符数组以及字符串处理函数等,Visual C+程序设计基础,23.03.2021,2,数 组,C+除提供基本数据类型外,还提供了构造数据类型,如数组、结构体、共同体和类。 具有相同类型的若干个元素组成的有序集合称为数组。 如:int score30; 数组拥有一个公共的名字,称之为数组名。一个数组由若干个元素组成,数组内的每个元素的类型必须相同,它们在内存中占据的地址空间也是连续的,Visual C+程序设计基础,23.03.2021,3,一维数组的定义,一维数组定义的一般形式为: 存储类别 数据类型 数组名常量表达式 如:

2、auto int a10; 或 static int a10; 则定义了一个包含十个元素的数组,分别为a0,a1,a2,a9。C+语言中数组的下标从0开始; 为下标运算符;“常量表达式”中不能包含变量;数组名的命名必须符合标识符的命名规则,Visual C+程序设计基础,23.03.2021,4,一维数组的定义,对于数组定义应注意以下几点: 相同作用域内,数组名不能与其它变量名相同, 例如:void main() int a; float a10; /是错误的。 方括号中的常量表达式必须有确定的正整数值(不能为变量或实数),可以是符号常量。 例如: #define FD 5 void main

3、() int a3+2, b7+FD; /是合法的。 但是下述说明方式是错误的: void main() int n=5; int an, b5.5; /是错误的。 允许在同一个类型说明中,说明多个数组和多个变量。 例如: int a, b, c, d, k110, k220,Visual C+程序设计基础,23.03.2021,5,一维数组的初始化,1、一维数组的初始化:指在定义数组的同时,给数组元素赋值。如:int a5=1, 2, 3, 4, 5; 2、如果对全部数组元素赋初值,可以不指定数组长度。例如:int a =1,2,3,4,5; 和int a5=1,2,3,4,5; 相同 3、

4、可以只给部分数组元素赋初值。例如:int a10=0,1,2,3,4; 表示只给a0a4 5个元素赋值,而后5个元素自动赋0值。 4、当将数组定义为全局数组或静态数组时,如不给数组赋初值,则元素的值全部为0。 5、只能给元素逐个赋值,不能给数组整体赋值。例如:给数组元素全部赋1, 只能写为:int a5=1,1,1,1,1;而不能写为:int a5=1,Visual C+程序设计基础,23.03.2021,6,一维数组的使用,只能逐个使用数组元素, 而不能一次使用整个数组。 例如:输出有10个元素的数组必须使用循环语句 for(i=0; i10; i+) coutai; 而不能用一个语句输出整

5、个数组,下面的写法是错误的; couta; 下面的程序也是错误的: int a5, b5=1,2,3,4,5; a=b; 同样,数组元素的赋值也只能逐个赋值。 int a3; a0=1; a1=2; a2=3; 或 for(int i=0;i3;i+) ai=i+1,Visual C+程序设计基础,23.03.2021,7,一维数组应用实例(选择法排序,Visual C+程序设计基础,例:把一组无序的数据(如15, 8, 4, 13, 6, 1)放在数组a0 a5中,要求将其按升序排序(结果应为1, 4, 6, 8, 13, 15,a0 a1 a2 a3 a4 a5,初始状态,第1次,第2次,

6、a0a1, 交换,a0a2, 交换,第3次,a0a3, 不交换,第4次,a0a4, 不交换,第5次,a0a5, 交换,23.03.2021,8,一维数组应用实例(选择法排序,Visual C+程序设计基础,经过第1轮循环后,找到了最小的数1,并将其放到了a0中,下面将找次小的数,并将其放到a1中,a0 a1 a2 a3 a4 a5,第1轮后,第1次,第2次,a1a2, 交换,a1a3, 不交换,第3次,a1a4, 交换,第4次,a1a5, 交换,第1轮比较结束后的状态,第2轮开始,23.03.2021,9,一维数组应用实例(选择法排序,Visual C+程序设计基础,经过第2轮循环后,找到了次

7、小的数4,并将其放到了a1中,依此类推,经过5轮后即可完成排序工作,a0 a1 a2 a3 a4 a5,第5轮后最终结果为,for(i=0;iaj) temp=ai; ai=aj; aj=temp;,完成该选择法排序的程序段为,23.03.2021,10,一维数组应用实例(选择法排序,Visual C+程序设计基础,另一种快速的选择法排序算法为,a0 a1 a2 a3 a4 a5,初始状态,第1轮循环,第2轮循环,第3轮循环,第4轮循环,第5轮循环,将a0和最小的数a5交换,将a1和次小的数a2交换,下一步a2和a4交换,下一步a3和a4交换,23.03.2021,11,一维数组应用实例(选择

8、法排序,在a0至 an-1 中找出一个最小值,假定是 at,把at与a0交换,使得 a0最小; 再在 a1至 an-1 中找出一个最小值 at,把at与a1交换,使得 a1最小 依次类推,直到从 an-2和 an-1中找出最小值,Visual C+程序设计基础,一般情况下,对于N个数据的排序问题,该算法可描述为,for(i=0;iaj) t=j; if(t!=i) temp=ai; ai=at; at=temp;,23.03.2021,12,例:把一列无序数据(如15 8 4 13 6 1)放在数组a0a5中,要求按升序排列,一维数组应用实例(冒泡法排序,Visual C+程序设计基础,初始状

9、态,第1次:a0a1,交换a0和a1,第2次:a1a2,交换a1和a2,第3次:a2a3,交换a2和a3,第4次:a3a4,交换a3和a4,第5次:a4a5,交换a4和a5,这是第1轮排序后的结果,最大的数沉到了最下面,小数则向上移动,23.03.2021,13,经过第1轮5次比较,找出了最大的数15并将其保存到a5中,其它数上浮。在第2轮比较中,将a0a4按前述方法进行4次交换后,可得到第2个比较大的数13,存放于a4中。依此类推,可得到排序结果,一维数组应用实例(冒泡法排序,Visual C+程序设计基础,第1轮,第2轮,第3轮,第4轮,第5轮,23.03.2021,14,一般的,对于N个

10、数据的冒泡法排序,该算法可描述为,一维数组应用实例(冒泡法排序,Visual C+程序设计基础,a0与a1比较,若a0a1,两数交换;然后 a1与 a2比较,重复上述步骤。结果大数沉底,小数上升,an-1中为最大的数。 a0到 an-2,两两比较。 依次类推,直到从 a0和 a1中找出最大值沉底,for(i=0;iaj+1) t=aj; aj=aj+1; aj+1=t;,23.03.2021,15,二维数组的定义,格式: 类型说明 数组名常量表达式1常量表达式1 例如:int a23; 说明:定义了一个2行3列的二维数组,数组元素个数为(常量表达式1)*(常量表达式2)的值,即共有6个整型数据

11、,在内存开辟了连续24个字节存储单元。数组每一维的下标都从0开始。 对于二维数组,逻辑上可以把它看成是一个表格结构,第一个下标代表“行号”,第二个下标代表列号,Visual C+程序设计基础,23.03.2021,16,二维数组的定义,在C+中,二维数组元素在内存中的存放方式为按行存放,称为行主顺序。C+语言把二维数组看成是一种特殊的一维数组,即由a0,a1两个元素组成,而a0、a1又是由一维数组组成。 例如上例中数据在内存中的存放顺序为: a:a0: a1: 必须强调的是,a0, a1不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量,Visual C+程序设计基础,23.03.20

12、21,17,多维数组的定义,对于三维数组来说,可以依据二维数组的定义方法来定义:如 int a234; 其中第一个下标称为“页下标”,第二个下标称为“行下标”,第三个下标称为“列下标”。这个三维数组在内存中同样要占据连续的内存空间。上面定义的三维数组在内存中将先放第0页中的数组元素,然后放第一页中的数组元素,每页中的元素还是按“行主顺序”存放,Visual C+程序设计基础,23.03.2021,18,二维(多维)数组的引用,对二维数组的引用可通过双重循环来实现。 例如要引用a34数组中的元素: for (i=0;iaij; 从键盘输入数据给数组元素,Visual C+程序设计基础,23.03

13、.2021,19,二维(多维)数组的初始化,对二维数组进行初始化的方式有: 1、分行赋初值 例如:int a23=1,3,5,2,4,6; 2、按数组在内存中的排列顺序赋初值 例如:int a23=1,2,5,2,4,6; 在对二维数组赋初值时(全部数据),可以省略对第一维长度的说明,这时第一维的长度由所赋初值的行数所决定,但第二维不能省略。 例如:int a23=1,3,5,2,4,6; 可以表示为:int a 3=1,3,5,2,4,6; 和 int a 3=1,3,5,2,4,6; 3、可以对部分元素赋初值 例如:int a23=1,2; 或 int a23=1,0,4 则未赋初值的其余

14、元素值自动为0,Visual C+程序设计基础,23.03.2021,20,二维(多维)数组实例,例:要求输出如下的杨辉三角(要求输出10行) 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 615 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1,Visual C+程序设计基础,23.03.2021,21,数组和函数,数组可以作为函数的参数进行数据传送。数组用作函数参数有两种形式,一种是数组元素作函数参数; 另一种是数组名作函数参数。 数

15、组元素作函数实参 数组元素作为函数实参使用与普通变量作函数参数是完全相同的,在发生函数调用时, 把作为实参的数组元素的值传送给形参,实现单向的值传送,Visual C+程序设计基础,23.03.2021,22,数组和函数,数组名作为函数参数 1、数组名作函数参数时,要求形参和实参都必须是类型相同的数组,当形参和实参不一致时,即会发生错误。 2、数组名作函数参数时,不是进行值的传送,而是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。 3、当用数组名作函数参数时, 由于形参和实参

16、为同一数组, 因此当形参数组发生变化时,实参数组也随之变化。 4、在函数形参表中,允许不给出形参数组最高维大小,Visual C+程序设计基础,23.03.2021,23,Visual C+程序设计基础,程序中的函数p( )用于计算,主函数利用函数完成计算,int p(int a, int x, int b, int y, int n) int i, s; for(_; in; i+) s+=_; return s;,int d=2,3,5,4,9,10,8; int v=7,6,3,2,5,1,8,9,3,4; int w=1,2,3,4,5,6,7,8,9,10,void main(voi

17、d) cout“ns1=“_; cout“ns2=“_;,a*xi+b*yi,i=0,s=0,p(1,d,2,v,8,p(3,v,4,w,10,23.03.2021,24,字 符 数 组,字符数组:用于存放字符型数据的数组称为字符数组。它的定义形式和元素的引用方法与一般的数组相同。 例如:char ch10; 字符数组初始化: 1、将字符逐个赋给数组中的各元素。 如:char c5=c, h, i, n, a; 或:char c =c, h, i, n, a; 2、直接用字符串常量给数组赋值。如: char c6=“china”; 或者 char c = “china”; 此时数组长度为6,系

18、统自动在china的末尾加字符串结束标志0。 字符串结束标志(0):它占内存,但不计入串的长度。 例如:cout“please input 10 number:”; 在执行cout函数时,每输出一个字符,则检测下一个字符是否为0,若是则停止输出,Visual C+程序设计基础,23.03.2021,25,字 符 数 组,字符数组的引用: 1、可以引用字符数组里的单个元素; 2、引用整个字符串 例如:char c5; cinc ; coutc; 注意:用cin输入时,是以空格或回车作为字符串的结束的 对二维(多维)数组的初始化 char c215= H,o,w, ,a,r,e,y,o,u, I,

19、a,m, ,a, ,s; 或 char c 15=“How are you”,”Iam a s”; 或 char c 15=“How are you”,”Iam a s,Visual C+程序设计基础,23.03.2021,26,字符数组的输入输出,Visual C+程序设计基础,逐个字符的输入输出。这种输入输出的方法,通常是使用循环语句来实现的。如: char str10; coutstri;/A . A行将输入的十个字符依次送给数组str中的各个元素,定义,赋值,23.03.2021,27,字符数组的输入输出,Visual C+程序设计基础,把字符数组作为字符串输入输出。对于一维字符数组的

20、输入,在cin中仅给出数组名;输出时,在cout中也只给出数组名,void main (void ) char s150, s260; cout s1; cin s2; cout “n s1 = “ s1; cout “n s2 = “ s2 “n”;,输入:abcd string,cin只能输入一个单词,不能输入一行单词,数组名,数组名,输出到0为止,23.03.2021,28,字符数组的输入输出,Visual C+程序设计基础,当要把输入的一行作为一个字符串送到字符数组中时,则要使用函数cin.getline( )。这个函数的第一个参数为字符数组名,第二个参数为允许输入的最大字符个数,ci

21、n.getline(数组名, 数组空间数,char s180; . cin.getline(s1, 80,首先开辟空间,23.03.2021,29,字符数组的输入输出,Visual C+程序设计基础,void main (void ) char s381; cout”输入一行字符串:”; cin.getline(s3,80); cout”s3=”s3n;,当输入行中的字符个数小于80时,将实际输入的字符串(不包括换行符)全部送给s3;当输入行中的字符个数大于80时,只取前面的80个字符送给字符串,定义,从键盘接收一行字符,输出到0为止,23.03.2021,30,字符串处理函数,C+语言的函数

22、库中提供了一批用于处理字符串的函数,程序中可以通用这些函数来处理字符串,使用时应包含头文件string.h。 1、字符串拷贝函数 strcpy 格式: strcpy (字符数组名1,字符数组名2或字符串) 功能:把字符数组2或字符串复制到字符数组1 要求:字符数组1原来的内容被覆盖掉了,因此字符数组1必须足够大到存放字符数组2或字符串。 例如: char str10; strcpy(str, ”Hello”); 说明:该函数实质上是给字符串赋值的另一种形式。像str1=“china”或str1=str2这样的表达式都是不合法的,Visual C+程序设计基础,23.03.2021,31,字符串

23、处理函数,2、字符串连接函数strcat (注:catenate:连接) 格式: strcat (字符数组名1,字符数组名2或字符串) 功能:将两个字符串合并成一个字符串,合并后的字符串放在字符数组1中 例:str120=“string”; str2=“function”;strcat(str1, str2); 结果:str1字符串为:stringfunction 作用:该函数把str2所指字符串的内容连接到str1字符串的后面,自动删去str1字符串后的0。为了进行这项操作,要求str1字符串后面有足够的空间来容纳str2字符串的内容,Visual C+程序设计基础,23.03.2021,3

24、2,程序中对两个字符串相等的判断不能使用下列语句: if (str1= =str2),字符串处理函数,3、字符串比较函数strcmp 格式:strcmp(字符串1,字符串2); 作用:对两个字符串自左向右按照各字符的ASCII进行比较,直到出现不同字符或者遇到0时退出比较,退出时: 函数返回值为0:表示两个字符串相同; 函数值为一正整数:表示字符串1字符串2,这个值为两个字符串不相同字符的ASCII码值的差 函数值为一负整数:表示字符串1字符串2,Visual C+程序设计基础,而应为:if (strcmp(str1, str2)= =0),如果str1、str2是两个字符数组名,而且都赋了值,则下面的语句都是合法的: strcmp(str1,str2); strcmp(“Japan”,”China”); strcmp(str1,“China”,23.03.2021,33,字符串处理函数,4、字符串比较函数strncmp 格式:strncmp(字符数组名1或字符串1,字符数组名2或字符串2,n) 功能:比较前n个字符的大小,若字符串长度小于n,则与strcmp函数相同。 char c=BASIC“; cc10=“BASICCPP”; strncmp(cc,c,5); /结果为0 5、求字符串长度函数strlen 格式: strlen (字符数组名或字符串) 功能:求出字符数组

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论