1、第第第第4 4章章章章 数组数组数组数组本章主要知识点本章主要知识点(1)一维数组的定义和引用。Inta100;a0a1a2a99(2)二维数组的定义和引用。(3)字符数组与字符串的应用。.第第第第4 4章章章章 数组数组数组数组4.2 一维数组的定义和引用一维数组的定义和引用 4.3 二维数组的定义和引用二维数组的定义和引用 4.5 综合实训综合实训 4.4 字符数组与字符串字符数组与字符串4.1 数组应用的数组应用的C程序实例程序实例.2.C程序实例程序实例11.C程序实例程序实例14.1 4.1 数组应用的数组应用的数组应用的数组应用的C C程序实例程序实例程序实例程序实例数组是若干具有
2、相同数据类型且按一定存储顺序排列的一组变量。数组中的变量称数组元素。每一个元素通过数组名和存储位置(下标)来确定。根据确定数组的一个元素所需要的下标数把数组分为一维数组、二维数组、三维数组等,二维以上的数组也称为多维数组。.4.1.1 C4.1.1 C程序实例(程序实例(程序实例(程序实例(1 1)1.C程序实例1【例4.1】应用一维数组,实现从键盘输入10个整数,输出其中的最小数。程序名为l4_1.cpp。#includestdio.hmain()inta10,i,min;/*定义一维整型数组a及整型变量i和min,数组a有10个元素*/for(i=0;i10;i+)/*循环输入数组a的10
3、个元素*/scanf(%d,&ai);min=a0;/*设a0元素为最小值min的初值*/for(i=1;iai)min=ai;printf(MIN=%dn,min);/*输出找到的最小值min*/.例例例例4.14.1 程序结果程序结果程序结果程序结果在【例4.1】程序实例中,输入10个整型数12,34,56,9,21,-12,34,0,-3,1分别存放在一维数组a的10个元素中。故程序运行结果见下图所示。输入数据输出结果.4.1.1 C4.1.1 C程序实例(程序实例(程序实例(程序实例(2 2)2.C程序实例2【例4.2】应用二维数组,实现从键盘为23数组输入值,并输出数组所有元素之和。
4、程序名为l4_2.cpp。#includestdio.hmain()inta23,i,j,sum=0;/*定义二维整型数组a及整型变量i,j和sum,数组a有2行3列6个元素*/for(i=0;i2;i+)/*按行向数组a输入6个元素,并将元素值送入sum进行累加求和*/for(j=0;j3;j+)scanf(%d,&aij);sum+=aij;printf(Sum=%dn,sum);/*输出和值sum*/.例例例例4.24.2 程序结果程序结果程序结果程序结果在【例4.2】程序实例中,输入6个整型数23,12,45,-12,-34,35分别存放在二维数组a两行三列的6个元素中。故程序运行结果
5、见下图所示。输入数据输出结果.4.2.2 一维数组元素的引用一维数组元素的引用 4.2.1 一维数组的定义一维数组的定义 4.2 4.2 一维数组的定义和引用一维数组的定义和引用一维数组的定义和引用一维数组的定义和引用 4.2.3 一维数组的初始化一维数组的初始化.定义数组时,应该注意以下几点:()常量表达式的值必须是一个正的整数值。()数组定义后,数组的长度就不能再改变。()定义时,可用一个类型说明符来定义多个相同类型的数组和变量,相互之间用逗号分隔。如【例4.1】程序实例中“inta10,i,min;”定义了一维整型数组a和整型变量i及min。4.2.1 4.2.1 一维数组的定义一维数组
6、的定义一维数组的定义一维数组的定义 一维数组定义的一般格式为:类型说明符 数组名常量表达式;在【例4.14.1】实例中“int a10;”表示数组名是a,数组元素是整型,数组有个元素。故定义了一个个元素的整型数组a。(1)类型说明符可以是int、char和float等,指明该数组的类型,即数组中每个元素的类型;(2)数组名的命名规则遵循标识符的命名规则,它代表数组存储时的首地址;(3)常量表达式是指数组的长度,即数组元素的个数。.【例4.14.1】程序实例中“int a10”定义了一个10元素的整型数组a,则数组的10个元素分别是a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,通过
7、for(i=0;i10;i+)scanf(%d,&ai);语句完成数组元素赋值,即输入给10个元素a0到a9。min=a0;功能是假设a0元素为最小元素,将其值赋给记录最小值的变量min。语句for(i=1;iai)min=ai;完成从a1到a9逐个元素与min比较,并将较小的元素值赋给min。最后循环结束后,min存储的是最小元素的值。输出语句printf(MIN=%dn,min);执行后,输出结果为:MIN=-12。注意:在一维数组引用过程中要防止下标越界问题。如“int a10”定义的数组a,数组a中不包括a10元素,下标为10已经越界。对于数组下标越界问题,C语言编译系统不进行检测,即
8、不进行错误报告,只是会造成程序运行结果的错误。4.2.2 4.2.2 一维数组元素的引用一维数组元素的引用一维数组元素的引用一维数组元素的引用 数组的使用仍然遵从“先定义,后使用”的原则。数组使用是通过数组元素引用实现的,而不能直接使用整个数组,每一个数组元素就是一个简单变量。一维数组的数组元素表示形式为:数组名下标下标是一个整型常量或整型表达式。一维数组元素的下标从0开始,如果数组长度为n,则元素的最大下标为n-1。.4.2.3 4.2.3 一维数组的初始化一维数组的初始化一维数组的初始化一维数组的初始化 类型说明符 数组名常量表达式=初始值表;一维数组初始化时,要注意以下两点:(1)当初始
9、化,初始值表给出全部元素值时,则数组长度可缺省。如,前例造价于int a=12,-3,4,0,367;(2)给数组中的部分元素赋初始值。如,int a5=1,2,3;则按照下标递增的顺序依次赋值,后两个元素系统自动赋0值。即a0=1,a1=2,a2=3,而a3和a4系统自动赋值为0。(3)数组中的全部元素赋初值为0。如,int a5=0;在定义一维数组同时给数组元素赋初始值,称为一维数组的初始化。一般格式为:初始值表中数据与数组元素依次对应,初始值表中的数据用逗号(,)分隔。如,int a5=12,-3,4,0,367;则数组a的5个元素依次取得初始值。.o对输入的10个整数,完成以下任务:o
10、1、输出其中的最大值和最小值;o2、输出他们的平均值以及比平均值大的数;.#includestdio.hmain()inti;floatscore10,aver=0.0;printf(Pleaseinputscoresof10students:);for(i=0;i10;i+)/*输入10位学生成绩并累加和*/scanf(%f,&scorei);aver+=scorei;aver/=10;/*求出10位学生的平均成绩*/printf(Theaveragescoreis:%.2fn,aver);printf(Theyare:);for(i=0;iaver)printf(%6.2f,scorei)
11、;4.5 4.5 综合实训(综合实训(综合实训(综合实训(1 1【例例4.54.5】)【例4.5】输入10位学生的成绩,求出平均分,并输出高于平均分的同学成绩。程序名为l4_5.cpp。.4.5 4.5 综合实训(综合实训(综合实训(综合实训(1 1【例例4.54.5】结果)结果)结果)结果)运行结果输出平均成绩输出高于平均分成绩输入10个成绩.o从键盘上任意输入10个整形数据存到数组a中,编程求出a中相邻两元素之和,并将这些和存放在数组b中,按每行3个元素的形式输出。.4.3.2 二维数组元素的引用二维数组元素的引用 4.3.1 二维数组的定义二维数组的定义 4.3 4.3 二维数组的定义和
12、引用二维数组的定义和引用二维数组的定义和引用二维数组的定义和引用 4.3.3 二维数组的初始化二维数组的初始化.二维数组被定义后,编译系统将为该数组在内存中分配一片连续的存储空间,按行的顺序连续存储数组中的各个元素。即先顺序存储第一行元素,从a00到a02,再存储第二行的元素,从a10到a12。数组名a仍然代表数组的起始地址。4.3.1 4.3.1 二维数组的定义二维数组的定义二维数组的定义二维数组的定义 二维数组定义的一般格式为:类型说明符 数组名常量表达式1常量表达式2;(1)类型说明符和数组名含义均与一维数组相同。(2)二维数组区别于一维数组的根本在于数组名后有两个常量表达式。常量表达式
13、1表示行数,而常量表达式2表示列数。也就是他们分别指出数组的行长度和列长度。在【例4.2】实例中“inta23;”表示数组名是a,数组元素是整型,数组有2行3列,共计6(23)个元素。即定义了一个2行3列的整型数组a。二维数组的行列下标也是从0开始。则数组a的6个元素是:a00,a01,a02a10,a11,a12.for(i=0;i2;i+)/*按行向数组a输入6个元素,并将元素值送入sum进行累加求和*/for(j=0;j3;j+)scanf(%d,&aij);sum+=aij;外循环中变量i指示行下标,内循环中变量j指示列下标,从而完成6次输入,即231245-12-3435,输入6个元
14、素值,并将值依次送入sum变量累加求和。循环结束后,由输出语句printf(Sum=%dn,sum);完成累加和sum的输出,结果为:Sum=694.3.2 4.3.2 二维数组元素的引用二维数组元素的引用二维数组元素的引用二维数组元素的引用 二维数组元素的引用形式为:数组名行下标列下标行(列)下标表达式可以是整型常量、整型变量及表达式,表示二维数组的行(列)长度。下标值仍然从0开始,到行(列)长度减1。在【例4.2】程序实例中“inta23;”,定义了一个2行3列的二维整型数组a,则在内存中依次连续存储的数组元素为a00,a01,a02,a10,a11,a12,通过循环嵌套语句给数组a的各个
15、元素输入值。如下:.(1)数组的全部元素都赋初值时,则定义数组时对第一维长度可以缺省。如,int a 3=1,2,3,4,5,6;等价于 int a23=1,2,3,4,5,6;(2)在分行赋值时),可以在定义时省略第一维的长度。如,int a 3=0,0,3;赋值后数组a的元素分别为:0 00 0 30 定义二维数组时,给数组元素赋初值称为二维数组初始化。二维数组初始化时要注意二维数组的元素排列顺序。初始值的排列顺序必须与数组元素在内存的存储顺序完全一致。具体的方法如下:1.分行给二维数组赋初值。2.按数组排列顺序对各元素赋初值。3.对部分元素赋初值。4.赋初值时,有些情况可缺省第一维长度,
16、但第二维长度不能缺省。如,int a23=1,2,3,4,5,6;此方法数据所处的行列位置不直观,尤其是数据多时,数据存储所在的行列需要仔细定位,容易出现错误。4.3.3 4.3.3 二维数组的初始化二维数组的初始化二维数组的初始化二维数组的初始化 如,inta23=1,2,3,4,5,6;按行赋初值的方法直观。如,int a23=1,0,4;此法对数组中各行部分元素赋初值,其余元素值自动为0。即赋值后数组a的各元素为:1 00 0 40.4.4.2 字符数组的初始化字符数组的初始化 4.4.3 字符数组的引用字符数组的引用 4.4.1 字符数组的定义字符数组的定义 4.4 4.4 字符数组与
17、字符串字符数组与字符串字符数组与字符串字符数组与字符串4.4.4 字符数组的输入输出字符数组的输入输出 4.4.5 字符串处理函数字符串处理函数.4.4.1 4.4.1 字符数组的定义字符数组的定义字符数组的定义字符数组的定义 字符数组是用来存放字符数据的数组,即数组的数据类型是字符型(char)的数组称为字符数组。字符数组的每个元素存放一个字符。字符数组的定义形式为:一维字符数组定义:二维字符数组定义:如,charc10;/*定义了一个10个元素的一维字符数组c*/charc210;/*定义了一个2行10列的二维字符数组c*/由于字符型与整型是互相通用的,因此上面的定义也可改为:intc10
18、;intc210;但是,此种方法定义会浪费存储空间。char数组名常量表达式;char数组名常量表达式1常量表达式2;.字符串是用双引号括起来的字符序列,在C语言中,字符串是利用字符数组来存放和处理的。(1)用字符串常量初始化一维字符数组。如,charc=“Howareyou”;也写成:charc=“Howareyou”;相当于:charc=H,o,w,a,r,e,y,o,u,0(2)二维数组初始化时,也可以使用字符串进行初始化。例如:charc8=white,black;4.4.2 4.4.2 字符数组的初始化字符数组的初始化字符数组的初始化字符数组的初始化 1.用字符常量初始化数组2.用字
19、符串常量初始化数组(1)一维字符数组初始化,如,charc10=a,b,c,d,e,f,g,h,i,j;(2)二维字符数组初始化,如,charc210=a,b,c,d,e,;字符数组c各元素初值为:abc0000000de0000000(3)当初值个数与字符数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。(4)用整型常量初始化字符数组。如,charc5=H,111,119;.4.4.3 4.4.3 字符数组的引用字符数组的引用字符数组的引用字符数组的引用 字字符符数数组组的的引引用用,也也是是通通过过对对数数组组逐逐个个元元素素引引用用实实现现的的。引引用用数数组组
20、的的元元素素可可以得到一个字符。以得到一个字符。【例例4.34.3】应用一维字符数组,输入一个字符串。程序名为应用一维字符数组,输入一个字符串。程序名为l4_3.cppl4_3.cpp。#include stdio.h#include stdio.hmain()main()char c=How are you!;char c=How are you!;/*/*定义一维数组定义一维数组c c有有1313元素元素*/int i;int i;for(i=0;i13;i+)for(i=0;i13;i+)/*/*通过循环控制输出数组每个元素通过循环控制输出数组每个元素*/printf(%c,ci);pr
21、intf(%c,ci);printf(n);printf(n);运行结果:运行结果:How are you!How are you!.4.4.4 4.4.4 字符数组的输入输出字符数组的输入输出字符数组的输入输出字符数组的输入输出 通过scanf()或getchar()对字符数组输入赋值,通过printf()或putchar()对字符数组输出,在1.4节中已介绍。使用scanf()和printf()完成输入输出时,%c格式是逐个字符元素输入输出,而%s格式是对整个字符串一次完成输入和输出。在使用%s格式时请注意以下问题:(1)在scanf中使用格式说明符s实现整串的输入。如,char c20;
22、scanf(“%s”,c);执行时,若输入:abcd则字符串将从数组c的起始地址(&c0或数组名c)开始依次放入数组c中,数组剩余空间补0。(2)用s格式符输入字符串时,空格、Tab符和回车符只能作为分隔符而不能输入到数组中。如,若输入字符串为:How are you!则只有字符串“How”存入到数组中,其余被截掉。(3)当输入项为数组元素的地址时,输入数据将从这一元素开始存放。(4)输入字符串时,避免发生越界。(5)在printf()中使用格式说明符s可以实现整串的输出。其调用形式为:printf(“%s”,c);c是存储单元的首地址。调用这个函数时,将从c地址开始输出存储单元中的字符,直到
23、遇到第一个0为止。输出结束后不自动换行。.4.4.5 4.4.5 字符串处理函数字符串处理函数字符串处理函数字符串处理函数 C语言编译系统提供了大量处理字符串的库函数,下面介绍几种常用的函数。使用字符串输入函数gets()和输出函数puts()时,要用#include命令将“stdio.h”头文件包含到源文件中。而使用其他的字符串处理函数时,要用#include命令将“string.h”头文件包含到源文件中。1.字符串输入函数gets()2.字符串输出函数puts()5.字符串复制函数strcpy()6.字符串比较函数strcmp()3.字符串长度函数strlen()4.字符串连接函数strc
24、at().如:charc20;gets(c);执行上面的语句,如果输入:Howareyou!则将读入的12个字符依次存入到c0开始的存储单元中,并在其后自动加入一个字符串结束标志0。4.4.5 4.4.5 字符串处理函数(字符串处理函数(字符串处理函数(字符串处理函数(1 1)1.字符串输入函数gets()调用gets()函数实现字符串的输入,其调用形式为:gets(字符数组);功能:从终端输入一个字符串(包括空格)赋给从字符数组起始的存储单元中,直到读入一个回车符为止。回车符读入后,不作为字符串的内容,系统将自动用0替换,作为字符串结束的标志。.如:charc=Hownarenyou!;pu
25、ts(c);输出结果:Howareyou!4.4.5 4.4.5 字符串处理函数(字符串处理函数(字符串处理函数(字符串处理函数(2 2)2.字符串输出函数puts()调用puts()函数实现字符串的输出,其调用形式为:puts(字符数组);功能:将字符数组起始地址开始的一个字符串(以0结束的字符序列)输出到终端,并将字符串结束标志0转化成n,自动输出一个换行符。.如:charc20=Hownarenyou!;printf(%dn,strlen(c);输出结果:124.4.5 4.4.5 字符串处理函数(字符串处理函数(字符串处理函数(字符串处理函数(3 3)3.字符串长度函数strlen()
26、调用strlen()函数实现字符串长度的测试,其调用形式为:strlen(字符数组或字符串);功能:测试字符数组起始地址开始的字符串(以0结束的字符序列)有效长度。函数值为字符数组或字符串的有效字符个数,不包括0在内。.如:charc130=Howareyou!n;charc1=Iamfine!;printf(%s,strcat(c1,c2);输出结果:Howareyou!Iamfine!4.4.5 4.4.5 字符串处理函数(字符串处理函数(字符串处理函数(字符串处理函数(4 4)4.字符串连接函数strcat()调用strcat()函数实现两个字符串的连接,其调用形式为:strcat(字符
27、数组1,字符数组2或字符串);功能:将字符数组2(字符串)连接到字符数组1的后面,函数值为字符数组1的地址。使用strcat()函数应注意两个问题:(1)连接前字符数组1和字符数组2的尾部都有一个0,连接时将字符数组1后的0自动取消,字符数组2后的0一并连接到字符数组1后。(2)字符数组1必须有足够长度,以便在其有效字符后能够容纳下字符数组2中的字符串。.如:charc130,c2=Howareyou!n;printf(%s,strcpy(c1,c2);输出结果:Howareyou!4.4.5 4.4.5 字符串处理函数(字符串处理函数(字符串处理函数(字符串处理函数(5 5)5.字符串复制函
28、数strcpy()调用strcpy()函数实现字符串的拷贝,其调用形式为:strcyp(字符数组1,字符数组2或字符串);功能:将字符数组2(字符串)复制到字符数组1中去。函数值为字符数组1的起始地址。在使用strcpy()函数时,需要注意下面问题:(1)字符数组1的长度容纳字符数组2中的字符串。(2)将字符数组2中字符串的结束标志0一起复制到字符数组1中。(3)strcpy()函数能够将字符数组2前面若干个字符复制到字符数组1中。如:strcpy(c1,c2,4);该语句的作用是将c2中前面的4字符复制到c1中去,然后系统自动添入一个字符串结束标志0。.当字符串中的对应字符全部相等且同时遇到
29、0字符时,则两个字符串相等,否则,以第一个不相同的字符的比较结果作为整个字符串的比较结果,比较结果由函数值带回,具体情况见下表所示。4.4.5 4.4.5 字符串处理函数(字符串处理函数(字符串处理函数(字符串处理函数(6 6)6.字符串比较函数strcmp()调用strcmp()函数实现字符串的大小比较,其调用形式为:strcmp(字符数组1或字符串1,字符数组2或字符串2);功能:将两个字符数组(字符串)自左向右对应的字符逐个进行比较(按ASCII码值大小比较),直到出现不同字符或遇到0字符为止,函数值为一个整型数。字符串大小情况函数值VC+6.0函数值TC 2.0函数值字符串1等于字符串
30、200字符串1大于字符串21首不同字符的ASCII码差值(正整数)字符串1小于字符串2-1首不同字符的ASCII码差值(负整数).2.程序实例程序实例2【例例4.6】3.程序实例程序实例3【例例4.7】1.程序实例程序实例1【例例4.5】4.5 4.5 综合实训综合实训综合实训综合实训4.程序实例程序实例4【例例4.8】.4.5 4.5 综合实训(综合实训(综合实训(综合实训(2 2【例例4.64.6】)【例4.6】用冒泡法对10个整型数按升序进行排序。冒泡法是使较小的值像空气泡一样逐渐“上浮”到数组的顶部,而较大的值逐渐下沉到数组的底部。具体思路是:从第一数开始将相邻的两个数比较,较大的数向
31、后移动,较小的数向“上浮”一个,经过一轮的比较,最大的数移动到末尾。对剩下的数继续下一轮的比较和移动。如果n个数比较,这样n-1轮后,就完成了排序工作。程序名为l4_6.cpp,程序如下:.排序问题:将10个数按照由小到大的顺序排列。o基本思路:冒泡排序法o#includeoMain()oint a10;int I,j,t;oFor(i=0;i10;i+)scanf(“%d”,&ai);oFor(j=0;j9;j+)o for(i=0;i9-j;i+)o t=ai;,ai=ai+1;ai+1=t;oFor(i=0;i10;i+)printf(“%d”,ai);o.#includestdio.h
32、main()inti,j,t,a10;printf(Pleaseinput10numbers:n);for(i=0;i10;i+)/*输入10个整数存入数组a中*/scanf(%d,&ai);for(i=0;i9;i+)/*对数组a中的10个整数排序*/for(j=0;jaj+1)/*前面的元素大于后面的元素则交换*/t=aj;aj=aj+1;aj+1=t;printf(Thesortednumbersare:);for(i=0;i10;i+)/*输出数组a中的10个元素*/printf(%d,ai);printf(n);4.5 4.5 综合实训(综合实训(综合实训(综合实训(2 2【例例4.
33、64.6】程序程序 ).4.5 4.5 综合实训(综合实训(综合实训(综合实训(2 2【例例4.64.6】结果)结果)结果)结果)运行时输入:8967458732104523运行结果:输出排序结果输入10个无序数.练习题:o1、输出以下图案:o*o *o *o *o *o2、有一个已经排好序的数组,要求输入一个数后,按原来顺序的规律将它插入数组中。.选择法的思路是:从第一元素开始逐个元素进行比较,并记录下较小元素的下标,经过一轮的比较和记录后,记录的下标为最小元素的下标,将该元素与第一个元素交换。对剩下的数继续下一轮的比较和记录。如果n个数比较,这样n-1轮后,就完成了排序工作。程序名为l4_
34、7.cpp。程序如下:4.5 4.5 综合实训(综合实训(综合实训(综合实训(3 3【例例4.74.7】)【例4.74.7】用选择法对10个整型数按升序进行排序。.#includestdio.hmain()inti,k,j,t,a10;printf(Pleaseinput10numbers:n);for(i=0;i10;i+)scanf(%d,&ai);/*输入10个整数存入数组a中*/for(i=0;i9;i+)/*对数组a中的10个整数排序*/k=i;for(j=i+1;jaj)k=j;t=ak;ak=ai;ai=t;/*本轮最小的元素与本轮首的元素交换*/printf(Thesorted
35、numbersare:);for(i=0;i=0;I-)aI=n%10;n3=n3/10;n4=x*x*x*x;for(I=9;I=2;I-)aI=n4%10;n4=n4%10;for(I=0;I=9;I+)sai+;for(I=0;I=9;I+)if(sI=1)if(I=9)printf(“n the number is%dn”,x);else break;x+while(x22);.练习:o输入一行字符,统计其中有多少个单词,单词用空格分隔开。.oGets(str);oFor(i=0;(c=stringi)!=0;i+)oif(c=)word=0;o else if(word=0)o word=1;o num+;.