第第6章章 数组数组Visual C+程序设计基础程序设计基础1数 组 C+除提供基本数据类型外,还提供了除提供基本数据类型外,还提供了构造数构造数据类型据类型,如数组、结构体、共同体和类如数组、结构体、共同体和类具有相同类型的若干个元素组成的有序集合称具有相同类型的若干个元素组成的有序集合称为为数组如:如:int score30;数组拥有一个公共的名字,称之为数组拥有一个公共的名字,称之为数组名数组名一个数组由若干个元素组成,数组内的每个元素的个数组由若干个元素组成,数组内的每个元素的类型必须相同,它们在内存中占据的地址空间也类型必须相同,它们在内存中占据的地址空间也是是连续连续的Visual C+程序设计基础程序设计基础2一维数组的定义一维数组定义的一般形式为:一维数组定义的一般形式为:存储类别存储类别 数据类型数据类型 数组名数组名常量表达式常量表达式如:如:auto int a10;或或 static int a10;则定义了一个包含十个元素的数组,分别为则定义了一个包含十个元素的数组,分别为a0,a1,a2,a9C+语言中语言中数组的下标从数组的下标从0开始开始;为下标运算符为下标运算符;“常量表达式常量表达式”中不中不能包含变量;数组名的命名必须符合标识符的命能包含变量;数组名的命名必须符合标识符的命名规则。
名规则Visual C+程序设计基础程序设计基础3一维数组的定义对于数组定义应注意以下几点:对于数组定义应注意以下几点:q相同作用域内,数组名不能与其它变量名相同,相同作用域内,数组名不能与其它变量名相同,例如:例如:void main()int a;float a10;/是错误的是错误的q方括号中的常量表达式必须有确定的正整数值方括号中的常量表达式必须有确定的正整数值(不能为变不能为变量或实数量或实数),可以是符号常量可以是符号常量例如:例如:#define FD 5 void main()int a3+2,b7+FD;/是合法的是合法的但是下述说明方式是错误的:但是下述说明方式是错误的:void main()int n=5;int an,b5.5;/是错误的是错误的q允许在同一个类型说明中,说明多个数组和多个变量允许在同一个类型说明中,说明多个数组和多个变量例如:例如:int a,b,c,d,k110,k220;Visual C+程序设计基础程序设计基础4一维数组的初始化1、一维数组的初始化:指在定义数组的同时,给数组元、一维数组的初始化:指在定义数组的同时,给数组元素赋值如:如:int a5=1,2,3,4,5;2、如果对全部数组元素赋初值,可以不指定数组长度。
如果对全部数组元素赋初值,可以不指定数组长度例如:例如:int a=1,2,3,4,5;和和int a5=1,2,3,4,5;相同相同3、可以只给部分数组元素赋初值可以只给部分数组元素赋初值例如:例如:int a10=0,1,2,3,4;表示只给表示只给a0a4 5个元素个元素赋值,赋值,而后而后5个元素自动赋个元素自动赋0值值4、当将数组定义为全局数组或静态数组时,如不给数组、当将数组定义为全局数组或静态数组时,如不给数组赋初值,则元素的值全部为赋初值,则元素的值全部为05、只能给元素逐个赋值,不能给数组整体赋值只能给元素逐个赋值,不能给数组整体赋值例如:给数组元素全部赋例如:给数组元素全部赋1,只能写为只能写为:int a5=1,1,1,1,1;而不能写为:而不能写为:int a5=1;Visual C+程序设计基础程序设计基础5一维数组的使用q只能逐个使用数组元素,只能逐个使用数组元素,而不能一次使用整个数组而不能一次使用整个数组例如:输出有例如:输出有10个元素的数组必须使用循环语句个元素的数组必须使用循环语句 for(i=0;i10;i+)coutai;而不能用一个语句输出整个数组,下面的写法是错误的;而不能用一个语句输出整个数组,下面的写法是错误的;couta;下面的程序也是错误的:下面的程序也是错误的:int a5,b5=1,2,3,4,5;a=b;同样,数组元素的赋值也只能逐个赋值。
同样,数组元素的赋值也只能逐个赋值int a3;a0=1;a1=2;a2=3;或或 for(int i=0;ia1,交换a0a2,交换第3次a0a3,不交换第4次a0a5,交换7一维数组应用实例(选择法排序)Visual C+程序设计基础程序设计基础经过第1轮循环后,找到了最小的数1,并将其放到了a0中,下面将找次小的数,并将其放到a1中a0 a1 a2 a3 a4 a5第1轮后第1次第2次a1a2,交换a1a4,交换第4次a1a5,交换第1轮比较结束后的状态:第2轮开始:8一维数组应用实例(选择法排序)Visual C+程序设计基础程序设计基础经过第经过第2轮循环后,找到了次小的数轮循环后,找到了次小的数4,并将其放到了,并将其放到了a1中,依此类推,经过中,依此类推,经过5轮后即可完成排序工作轮后即可完成排序工作a0 a1 a2 a3 a4 a5第5轮后最终结果为:for(i=0;i5;i+)for(j=i+1;jaj)temp=ai;ai=aj;aj=temp;完成该选择法排序的程序段为:9一维数组应用实例(选择法排序)Visual C+程序设计基础程序设计基础另一种快速的选择法排序算法为:另一种快速的选择法排序算法为:a0 a1 a2 a3 a4 a5初始状态第1轮循环第2轮循环第3轮循环第4轮循环第5轮循环将a0和最小的数a5交换将a1和次小的数a2交换下一步a2和a4交换下一步a3和a4交换10一维数组应用实例(选择法排序)q在在a0至至 an-1 中找出一中找出一个最小值,假定是个最小值,假定是 at,把把at与与a0交换,使得交换,使得 a0最小;最小;q再在再在 a1至至 an-1 中找出中找出一个最小值一个最小值 at,把,把at与与a1交换,使得交换,使得 a1最小最小q依次类推,直到从依次类推,直到从 an-2和和 an-1中找出最小值。
中找出最小值Visual C+程序设计基础程序设计基础一般情况下,对于一般情况下,对于N个数据的排序问题,该算法可描述为:个数据的排序问题,该算法可描述为:for(i=0;iN-1;i+)t=i;for(j=i+1;jaj)t=j;if(t!=i)temp=ai;ai=at;at=temp;11例:把一列无序数据例:把一列无序数据(如如15 8 4 13 6 1)放在数组放在数组a0a5中,要求按升序排列中,要求按升序排列一维数组应用实例(冒泡法排序)Visual C+程序设计基础程序设计基础初始状态第第1次:次:a0a1,交换,交换a0和和a1第第2次:次:a1a2,交换,交换a1和和a2第第3次:次:a2a3,交换,交换a2和和a3第第4次:次:a3a4,交换,交换a3和和a4第第5次:次:a4a5,交换,交换a4和和a5这是第1轮排序后的结果,最大的数沉到了最下面,小数则向上移动12 经过第经过第1轮轮5次次比较,找出了最大的数比较,找出了最大的数15并将其保存到并将其保存到a5中,其它数上浮在第中,其它数上浮在第2轮比较中,将轮比较中,将a0a4按前述按前述方法进行方法进行4次次交换后,可得到第交换后,可得到第2个比较大的数个比较大的数13,存放于,存放于a4中。
依此类推,可得到排序结果依此类推,可得到排序结果一维数组应用实例(冒泡法排序)Visual C+程序设计基础程序设计基础第1轮第2轮第3轮第4轮第5轮13一般的,对于一般的,对于N个数据的冒泡法排序,该算法可描述为:个数据的冒泡法排序,该算法可描述为:一维数组应用实例(冒泡法排序)Visual C+程序设计基础程序设计基础q a0与与a1比较比较,若若a0a1,两数交换;然后两数交换;然后 a1与与 a2比较,重复上述步骤结果比较,重复上述步骤结果大数沉底,小数上升,大数沉底,小数上升,an-1中为最大的数中为最大的数q a0到到 an-2,两两比较两两比较q 依次类推,直到从依次类推,直到从 a0和和 a1中找出最大值沉底中找出最大值沉底for(i=0;iN-1;i+)for(j=0;jaj+1)t=aj;aj=aj+1;aj+1=t;14二维数组的定义格式:格式:类型说明类型说明 数组名数组名常量表达式常量表达式1常量表达式常量表达式1例如:例如:int a23;说明:说明:定义了一个定义了一个2行行3列的二维数组,数组元素个数为列的二维数组,数组元素个数为(常量表达式常量表达式1)*(常量表达式常量表达式2)的值,即共有的值,即共有6个整型数据,个整型数据,在内存开辟了连续在内存开辟了连续24个字节存储单元。
数组每一维的下个字节存储单元数组每一维的下标都从标都从0开始对于二维数组,逻辑上可以把它看成是一个表格结构,对于二维数组,逻辑上可以把它看成是一个表格结构,第一个下标代表第一个下标代表“行号行号”,第二个下标代表列号第二个下标代表列号Visual C+程序设计基础程序设计基础15二维数组的定义 在在C+中,二维数组元素在内存中的存放方式为按行中,二维数组元素在内存中的存放方式为按行存放,称为存放,称为行主顺序行主顺序C+语言把二维数组看成是一种语言把二维数组看成是一种特殊的一维数组,即由特殊的一维数组,即由a0,a1两个元素组成,而两个元素组成,而a0、a1又是由一维数组组成又是由一维数组组成例如上例中数据在内存中的存放顺序为:例如上例中数据在内存中的存放顺序为:a:a0:a1:必须强调的是,必须强调的是,a0,a1不能当作下标变量使用,它们不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量是数组名,不是一个单纯的下标变量Visual C+程序设计基础程序设计基础a00 a01 a02a10 a11 a1216多维数组的定义 对于三维数组来说,可以依据二维数组的定义方法来对于三维数组来说,可以依据二维数组的定义方法来定义:如定义:如int a234;其中第一个下标称为其中第一个下标称为“页下标页下标”,第二个下标称为,第二个下标称为“行行下标下标”,第三个下标称为,第三个下标称为“列下标列下标”。
这个三维数组在这个三维数组在内存中同样要占据连续的内存空间上面定义的三维数内存中同样要占据连续的内存空间上面定义的三维数组在内存中将先放第组在内存中将先放第0页中的数组元素,然后放第一页中页中的数组元素,然后放第一页中的数组元素,每页中的元素还是按的数组元素,每页中的元素还是按“行主顺序行主顺序”存放Visual C+程序设计基础程序设计基础17二维(多维)数组的引用对二维数组的引用可通过双重循环来实现对二维数组的引用可通过双重循环来实现例如要引用例如要引用a34数组中的元素:数组中的元素:for (i=0;i3;i+)for (j=0;j4;j+)aij=0;使数组中的全部元素赋使数组中的全部元素赋0或:或:for (i=0;i3;i+)for (j=0;jaij;从键盘输入数据给数组元素从键盘输入数据给数组元素Visual C+程序设计基础程序设计基础18二维(多维)数组的初始化对二维数组进行初始化的方式有:对二维数组进行初始化的方式有: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 则未赋初值的其余元素值自动为则未赋初值的其余元素值自动为0Visual C+程序设计基础程序设计基础19二维(多维)数组实例例:要求输出如下的杨辉三角例:要求输出如下的杨辉三角(要求输出要求输出10行行)11 11 2 11 3 3 11 4 6 4 11 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 11 9 36 84 126 126 84 36 9 1 Visual C+程序设计基础程序设计基础20数组和函数 数组可以作为函数的参数进行数据传送数组数组可以作为函数的参数进行数据传送数组用作函数参数有两种形式,用作函数参数有两种形式,一种是数组元素作函一种是数组元素作函数参数;数参数;另一种是数组名作函数参数。
另一种是数组名作函数参数数组元素作函数实参数组元素作函数实参 数组元素作为函数实参使用与普通变量作函数数组元素作为函数实参使用与普通变量作函数参数是完全相同的,在发生函数调用时,参数是完全相同的,在发生函数调用时,把作把作为实参的数组元素的值传送给形参,实现单向的为实参的数组元素的值传送给形参,实现单向的值传送Visual C+程序设计基础程序设计基础21数组和函数数组名作为函数参数数组名作为函数参数1、数组名作函数参数时,要求形参和实参都必须是类型相、数组名作函数参数时,要求形参和实参都必须是类型相同的数组,当形参和实参不一致时,即会发生错误同的数组,当形参和实参不一致时,即会发生错误2、数组名作函数参数时,不是进行值的传送,而是地址的数组名作函数参数时,不是进行值的传送,而是地址的传送,传送,也就是说把实参数组的首地址赋予形参数组名也就是说把实参数组的首地址赋予形参数组名形参数组名取得该首地址之后,也就等于有了实在的形参数组名取得该首地址之后,也就等于有了实在的数组实际上是形参数组和实参数组为同一数组,共数组实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间同拥有一段内存空间。
3、当用数组名作函数参数时,、当用数组名作函数参数时,由于形参和实参为同一数由于形参和实参为同一数组,组,因此当形参数组发生变化时,实参数组也随之变因此当形参数组发生变化时,实参数组也随之变化4、在函数形参表中,允许不给出形参数组最高维大小、在函数形参表中,允许不给出形参数组最高维大小Visual C+程序设计基础程序设计基础22Visual C+程序设计基础程序设计基础程序中的函数程序中的函数p()用于计算:用于计算:10niiibyaxp主函数利用函数完成计算主函数利用函数完成计算:7021iiivds90432iiiwvsint 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(void)cout“ns1=“_;cout“ns2=“_;a*xi+b*yii=0,s=0p(1,d,2,v,8)p(3,v,4,w,10)23字 符 数 组字符数组:字符数组:用于存放字符型数据的数组称为字符数组。
用于存放字符型数据的数组称为字符数组它的定义形式和元素的引用方法与一般的数组相同它的定义形式和元素的引用方法与一般的数组相同例如:例如: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,系统自动在,系统自动在china的末尾加字符串的末尾加字符串结束标志结束标志0字符串结束标志字符串结束标志(0):它占内存,但不计入串的长度它占内存,但不计入串的长度例如:例如:coutc;coutc;注意:用注意:用cin输入时,是以空格或回车作为字符串的结束的输入时,是以空格或回车作为字符串的结束的对二维对二维(多维多维)数组的初始化数组的初始化 char c215=H,o,w,a,r,e,y,o,u,I,a,m,a,s;或或 char c 15=“How are you”,”Iam a s”;或或 char c 15=“How are you”,”Iam a s”;Visual C+程序设计基础程序设计基础25字符数组的输入输出Visual C+程序设计基础程序设计基础逐个字符的输入输出。
逐个字符的输入输出这种输入输出的方法,通常是使用这种输入输出的方法,通常是使用循环语句来实现的如:循环语句来实现的如:char str10;cout“输入十个字符:输入十个字符:”;for(int i=0;istri;/A .A行将输入的十个字符依次送给数组行将输入的十个字符依次送给数组str中的各个元素中的各个元素定义定义赋值赋值26字符数组的输入输出Visual C+程序设计基础程序设计基础把字符数组作为字符串输入输出把字符数组作为字符串输入输出对于一维字符数组的输对于一维字符数组的输入,在入,在cin中仅给出数组名;输出时,在中仅给出数组名;输出时,在cout中也只给出数中也只给出数组名void main(void)char s150,s260;cout s1;cin s2;cout “n s1=“s1;cout “n s2=“s2 “n”;输入:输入:abcdstringcin只能输入一个单词,只能输入一个单词,不能输入一行单词不能输入一行单词数组名数组名数组名数组名输出到输出到0为止为止27字符数组的输入输出Visual C+程序设计基础程序设计基础当要把输入的一行作为一个字符串送到字符数组中时,则当要把输入的一行作为一个字符串送到字符数组中时,则要使用函数要使用函数cin.getline()。
这个函数的第一个参数为字符这个函数的第一个参数为字符数组名,第二个参数为允许输入的最大字符个数数组名,第二个参数为允许输入的最大字符个数cin.getline(数组名数组名,数组空间数数组空间数);char s180;.cin.getline(s1,80);首先开辟空间首先开辟空间28字符数组的输入输出Visual C+程序设计基础程序设计基础void main(void)char s381;cout”输入一行字符串输入一行字符串:”;cin.getline(s3,80);cout”s3=”s3字符串字符串2,这个值为两个字,这个值为两个字符串不相同字符的符串不相同字符的ASCII码值的差码值的差q 函数值为一负整数:表示字符串函数值为一负整数:表示字符串1字符串字符串2Visual C+程序设计基础程序设计基础而应为:而应为:if(strcmp(str1,str2)=0)如果如果str1、str2是两个字符数组名,而且都赋了值,是两个字符数组名,而且都赋了值,则下面的语则下面的语句都是合法的:句都是合法的:strcmp(str1,str2);strcmp(“Japan”,”China”);strcmp(str1,“China”);32字符串处理函数4、字符串比较函数、字符串比较函数strncmp格式:格式:strncmp(字符数组名字符数组名1或字符串或字符串1,字符数组名字符数组名2或字符串或字符串2,n)功能:比较前功能:比较前n个字符的大小,若字符串长度小于个字符的大小,若字符串长度小于n,则与,则与strcmp函数相同。
函数相同char c=BASIC“;cc10=“BASICCPP”;strncmp(cc,c,5);/结果为结果为05、求字符串长度函数、求字符串长度函数strlen格式:格式:strlen(字符数组名或字符串字符数组名或字符串)功能:求出字符数组或字符串的长度并返回其值此函数功能:求出字符数组或字符串的长度并返回其值此函数测出的长度不包括测出的长度不包括0字符例如:例如:char str10=“china”;coutstrlen(str);结果为结果为5Visual C+程序设计基础程序设计基础33字符串处理函数6、字符串大小写转换函数、字符串大小写转换函数 注:注:lowercase和和uppercase 大写转换为小写:大写转换为小写:strlwr(字符数组名字符数组名)小写转换为大写:小写转换为大写:strupr(字符数组名字符数组名)功能:两个函数返回转换后的字符串功能:两个函数返回转换后的字符串例:例:#include#include void main()char s20;strcpy(s,THIS IS A TEST);strlwr(s);/strcpy(s,this is a test);strupr(s);coutsendl;则原来的大写字母全部变成了小写字母,而小写字母则则原来的大写字母全部变成了小写字母,而小写字母则变成了大写字母。
变成了大写字母Visual C+程序设计基础程序设计基础34字符串处理函数实例1、求字符串、求字符串abn012的长度的长度2、char s80,sp=HELLO;strcpy(s,sp);s0=h;coutsendl;其结果为:其结果为:3、coutA:TCEX1.c;4、coutstrlen(t0650 xffn);5、coutstrlen(tv0willn);6、coutstrlen(x69082n);7、char s=“China0Nanjing”;int m=sizeof(s);则则m的值是:的值是:Visual C+程序设计基础程序设计基础 答答 案案1.92.hELLO3.A:TCEX1.c4.35.96.17.1435调试程序的方法1)单步调试)单步调试 以行为单位,每运行一步,程序就会中以行为单位,每运行一步,程序就会中断,可以实时查询目前各变量的状态及程序断,可以实时查询目前各变量的状态及程序的走向可以选择是否进入子函数可以选择是否进入子函数2)运行到光标处)运行到光标处 可以直接使程序运行到光标处再进行单可以直接使程序运行到光标处再进行单步调试,这种方法可以不必运行正确的循环步调试,这种方法可以不必运行正确的循环而直接到有疑问的地方。
而直接到有疑问的地方Visual C+程序设计基础程序设计基础36。