《C语言入门学习C第7章_数组课件》由会员分享,可在线阅读,更多相关《C语言入门学习C第7章_数组课件(65页珍藏版)》请在金锄头文库上搜索。
1、第七章第七章第七章数组 7.1 一维数组的定义和引用一维数组的定义和引用 C语言为这些数据,提供了一种构造数据类型:数语言为这些数据,提供了一种构造数据类型:数组。组。所谓数组所谓数组就是一组具有相同数据类型的数据的就是一组具有相同数据类型的数据的有序集合。有序集合。数据的特点:1.具有相同的数据类型2.使用过程中需要保留原始数据7.1一维数组的定义和引用C语言为这些数据,提1.1.一维数组的定义格式为一维数组的定义格式为:类型说明符类型说明符 数组名常量表达式;数组名常量表达式;例如:例如: int a10; 它表示定义了一个整形数组,数组名为a,此数组有10个元素。 7.1.17.1.1一
2、维数组的定义一维数组的定义 数组名定名规则和变量名相同,遵循标识符定名规则。数组说明中其他常见的错误:数组说明中其他常见的错误:数组说明中其他常见的错误:数组说明中其他常见的错误: float a0;/* /* 数组大小为数组大小为0 0没有意义没有意义 * */ / int k, ak; /* /* 不能用变量说明数组大小不能用变量说明数组大小* */ / 1.一维数组的定义格式为:7.1.1一维数组的定义注意:注意:定义数组时用到的“数组名常量表达式” 和引用数组元素时用到的“数组名下标” 是有区别的。例如例如:inta10;下标为0,1,2,3,4,5,6,7,8,9 7.1.2 7.1
3、.2一维数组元素的引用一维数组元素的引用1.1.数组元素的引用方式数组元素的引用方式数组名下标下标可以是整型常量或整型表达式。例如例如: : a0=a2*3注意:7.1.2一维数组元素的引用1.数组元素的引用方式对数组元素初始化的实现方法:对数组元素初始化的实现方法: 1.1.在定义数组时对数组元素赋以初值。在定义数组时对数组元素赋以初值。例如例如:int a:int a1010=0,1,2,3,4,5,6,7,8,9;=0,1,2,3,4,5,6,7,8,9;将数组元素的初值依次放在一对花括弧内。经过上面的定义和初始化之后,a0=0,a1=1,a2=2,a3=3,a4=4,a5=5,a6=6
4、,a7=7,a8=8,a9=9。 7.1.37.1.3一维数组的初始化一维数组的初始化对数组元素初始化的实现方法:1.在定义数组时对数组元素赋以 3. 3. 如果想使一个数如果想使一个数组组中全部元素中全部元素值为值为0 0,可以写成,可以写成: :int aint a1010=0;=0; 2. 2. 可以只给一部分元素赋值。可以只给一部分元素赋值。例如例如: int a: int a1010=0=0,1 1,2 2,3 3,4;4; 定义a数组有10个元素,但花括弧内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。3.如果想使一个数组中全部元素值为0,可以写成:2.4. 4.
5、 在在对对全部数全部数组组元素元素赋赋初初值时值时,由于数据的个数已,由于数据的个数已经经确定,因此可以不指定数确定,因此可以不指定数组长组长度。度。 例如例如:int a:int a5 5=1=1,2 2,3 3,4 4,5;5; 也可以写成也可以写成 int aint a=1=1,2 2,3 3,4 4,5;5; 4.在对全部数组元素赋初值时,由于数据的个数已经确定,因此例例例例7-17-17-17-1:用数组来处理用数组来处理, ,求解求解Fibonacci数列。数列。Fibonacci数列公式:数列公式:已知已知: : a a1 1=a=a2 2=1=1a an n=a=an-1n-1
6、+a+an-2 n-2 即即:1,1,2,3,5,8,13:1,1,2,3,5,8,137.1.47.1.4一维数组程序举例一维数组程序举例例7-1:用数组来处理,求解Fibonacci数列。Fibo程序举例程序举例程序举例程序举例2 2 2 2:用起泡法对用起泡法对1010个数排序个数排序( (由小到大由小到大) )。 第一趟比较 经过第一趟(共5次比较与交换)后,最大的数9已“沉底” 。然后进行对余下的前面5个数第二趟比较,程序举例2:用起泡法对10个数排序(由小到大)。第经第二趟比较如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两
7、比较。第如果有n个数,则要进行n-1趟比较。在第1趟比较中要进行n文件命名重要性起泡排序程序命名为:起泡排序程序命名为:qipaopaixu.c流程图和程序参见书上内容文件命名重要性流程图和程序参见书上内容习题讲解习题讲解输出数组中的最大值,文件名为输出数组中的最大值,文件名为zuidazhi.c第一步:定义一个数组,并赋予相应的值第一步:定义一个数组,并赋予相应的值第二步:找出最大值第二步:找出最大值第三步:输出数组中的最大值找出最大值思想:找出最大值思想: 第一个和第二个元素值比较,记住较大的元素值,刚才第一个和第二个元素值比较,记住较大的元素值,刚才比较得出的较大的元素值再和第三个元素值
8、比较,记住两个比较得出的较大的元素值再和第三个元素值比较,记住两个数中的较大值,依此类推,直到最后一个元素。数中的较大值,依此类推,直到最后一个元素。习题讲解输出数组中的最大值,文件名为zuidazhi.c第一习题讲解习题讲解数组中找出最大值元素的位置数组中找出最大值元素的位置命名为命名为zuidazhiweizhi.c找出最大值位置的思想:找出最大值位置的思想: 第一个和第二个元素值比较,记住较大的元素值位置,第一个和第二个元素值比较,记住较大的元素值位置,刚才比较得出的较大的元素值再和第三个元素值比较,记住两刚才比较得出的较大的元素值再和第三个元素值比较,记住两个数中的较大元素值位置,依此
9、类推,直到最后一个元素。个数中的较大元素值位置,依此类推,直到最后一个元素。习题讲解数组中找出最大值元素的位置找出最大值位置的思想:习题讲解习题讲解选择法排序的思想:选择法排序的思想:第一趟:找出数组中最大值和最后位置上的元素值交换第一趟:找出数组中最大值和最后位置上的元素值交换第二趟:最后元素值除外,剩余元素中找最大值和倒数第二第二趟:最后元素值除外,剩余元素中找最大值和倒数第二个位置上的元素值交换个位置上的元素值交换第三趟:最后第三趟:最后2个元素值除外,剩余元素中找最大值和倒数个元素值除外,剩余元素中找最大值和倒数第三个位置上的值交换第三个位置上的值交换依此类推依此类推选择法对数组元素排
10、序,文件名选择法对数组元素排序,文件名xuanzefapaixu.c思考:思考:如果仅知道最大值,然后和不同位置上的值交换,是否会造成如果仅知道最大值,然后和不同位置上的值交换,是否会造成数组元素值的丢失数组元素值的丢失习题讲解选择法排序的思想:选择法对数组元素排序,文件名xua习题讲解习题讲解查找一个数据值是否存在于数组中查找一个数据值是否存在于数组中方法二:折半查找文件名zhebanchazhao.c方法一:顺序查找文件名shunxuchazhao.c思考方法:首先,假设数组中元素是按升序排列,将数组中间位置的值与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置将数组分成前、后两
11、个子数组部分,如果中间位置的值大于查找关键字,则在前面部分进一步查找,否则进一步在后面部分查找。重复以上过程,直到查找成功,或直到子数组部分不存在为止,此时查找不成功。目的:为了提高查找速度前提条件:数组元素已经排好序习题讲解查找一个数据值是否存在于数组中方法二:折半查找例:已知一个升序排列的数组有十个数据,输入一个数,查例:已知一个升序排列的数组有十个数据,输入一个数,查找它是否存在。若存在打印该数及其所在位置,否则,输出找它是否存在。若存在打印该数及其所在位置,否则,输出“no found!no found!”. .假定:数组为假定:数组为a10,待查找的数为待查找的数为 x设三个位置指针
12、设三个位置指针 top(顶)(顶),bot(中)(中),mid(底)(底)使:使:top=0,bot=9,mid=(top+bot)/2=4.top=0,bot=9,mid=(top+bot)/2=4. 假假。则。则 x 必落在必落在 mid1bot 范围内。范围内。 2、否则,判断、否则,判断x a mid成立否。成立否。算法算法: :80152130455065869598680012345789aiimidbottop1、 若若x = a mid,则,则 已找到已找到真真。则。则 x 必落在必落在 topmid-1 范围内。范围内。重新设置位置指针:重新设置位置指针:bot=mid-1b
13、ot80152130455065869598重新设置位置指针:重新设置位置指针:top=mid+1 midbottop3、确定了新的查找范围后,重复上述,直到、确定了新的查找范围后,重复上述,直到找到或退出循环。找到或退出循环。 top退出循环条件为:两种状态其一:退出循环条件为:两种状态其一:退出循环条件为:两种状态其一:退出循环条件为:两种状态其一: x = a mid x = a mid 找到找到找到找到 bot top bot top例:已知一个升序排列的数组有十个数据,输入一个数,查找它是否补充习题补充习题在已排好序的含有在已排好序的含有n个元素的数组中插入一个数据值,个元素的数组中
14、插入一个数据值,使得数组中元素依然有序排列,文件名为使得数组中元素依然有序排列,文件名为charu.c第二步:插入点位置后的所有元素值都往后移动一位第一步:首先确定数据插入到数组中的位置思想方法思想方法:第三步:插入相应的数据值删除数组中和关键字相同的元素值,文件名为删除数组中和关键字相同的元素值,文件名为shanchu.c思考:删除一个数据需要数据元素已经排好序吗?补充习题在已排好序的含有n个元素的数组中插入一个数据值,使得补充习题补充习题插入排序:将插入排序:将n个数据输入到数组中,输入完成后,个数据输入到数组中,输入完成后,数组中的元素有序排列。数组中的元素有序排列。每输入一个数据到数组
15、中,都实现一次数据的插入(前面已讲)。思想方法:补充习题插入排序:将n个数据输入到数组中,输入完成后,数组中习题讲解习题讲解习题习题7.5,将一个数组中的值按逆序存放。,将一个数组中的值按逆序存放。将第一个位置数据和最后一个位置的数据交换,第二个位置的数据和倒数第二个位置的数据交换,依此类推,直到数据的中间位置。思考方法:本题无需对数组中的元素排序。习题讲解习题7.5,将一个数组中的值按逆序存放。 7.2 二维数组的定义和引用二维数组的定义和引用 7.2.17.2.1二维数组的定义二维数组的定义二维数组定义的一般形式为二维数组定义的一般形式为类型说明符 数组名常量表达式常量表达式;例如:例如:
16、定义a为34(3行4列)的数组,b为510(5行10列)的数组。如下:float a34,b510;不能写成不能写成 float afloat a3 3,4 4,b b5 5,1010; ;7.2二维数组的定义和引用7.2.1二维数组的定义二注意:注意:我们可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如:例如:可以把a看作是一个一维数组,它有3个元素:a0、a1、a2,每个元素又是一个包含4个元素的一维数组。注意:我们可以把二维数组看作是一种特殊的一维数组:它的元素又 7.2.1二维数组的定义二维数组的定义 二维数组中的元素在内存中的排列顺序是:按行存放,即先顺序存放第
17、一行的元素,再存放第二行的元素 一维数组在内存中的存放一维数组在内存中的存放一维数组在内存中的存放一维数组在内存中的存放下图表示对下图表示对下图表示对下图表示对a a3 34 4数数数数组存放的顺序组存放的顺序组存放的顺序组存放的顺序 7.2.1二维数组的定义二维数组中的元素在内存中的排 值值值值 数组元素数组元素数组元素数组元素b b0000b b0101b b0202b b1010b b1111b b1212b b2020b b2121b b2222例如:例如:整型数组整型数组 b33= 1,2,3, 4,5,6, 7,8,9 ;123456789值数组元素b0二维数组元素的表示形式为:数
18、组名下标下标数组名下标下标例如:例如: a23下标可以是整型表达式,如 a2-12*2-1数组元素可以出现在表达式中,也可以被赋值例如:例如:b b1 12 2=a=a2 23 3/2/2不要写成不要写成 a a2 2,3 3,a a2-12-1,2*2-12*2-1形式形式 7.2.2二维数组的引用二维数组的引用二维数组元素的表示形式为:数组元素可以出现在表达式中,也可以常出现的错误有:常出现的错误有: int a34; /* /* 定义定义a a为为3434的数组的数组 * */ / a34=3; 在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。常出现的错误有:在使用数组元素
19、时,应该注意下标值应在已定义可以用下面可以用下面4 4种方法对二维数组初始化:种方法对二维数组初始化:.分行给二维数组赋初值。例如:例如: int aint a3 34 4=1=1,2 2,3 3,44,55,6 6,7 7,88,99,1010,1111,12; 12; .可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。例如:例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12; 7.2.3 7.2.3二维数组的引用二维数组的引用可以用下面4种方法对二维数组初始化:.分行给二维数组赋初值.可以对部分元素赋初值。例如:例如:inta34=1,5,9;1 0
20、 0 01 0 0 05 0 0 0 5 0 0 0 9 0 0 0也可以对各行中的某一元素赋初值,如int aint a3 34 4=1=1,00,66,00,0 0,11;11; 1 0 0 01 0 0 00 6 0 00 6 0 00 0 0 11 00 11 01 0 0 01 0 0 05 6 0 0 5 6 0 0 0 0 0 0也可以只对某几行元素赋初值。如:int a34=1,5,6; .可以对部分元素赋初值。1000也可以对各行中.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。例如:例如:int aint a3 34 4=1=1,2 2
21、,3 3,4 4,5 5,6 6,7 7,8 8,9 9,1010,1111,12;12;它等价于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。例如例如:int aint a4 4=0=0,0 0,33,00,10;10;0030000001000.如果对全部元素都赋初值,则定义数组时对第一维的长度可以不 7.2.47.2.4二维数组程序举例二维数组程序举例 例例7.4 7.4 将一个二维数组行和列元素互换,存到另一个将一个二维数组行和列元素互换,存到另一个 二维数组中。二维数组中。例如:例如:a= 1
22、 2 3 1 4a= 1 2 3 1 4 4 5 6 b= 2 5 4 5 6 b= 2 5 3 6 3 6文件名为hangliehuhuan.c7.2.4二维数组程序举例例7.4将一个二维数组行和例例7.5: 7.5: 有一个有一个34的矩阵,要求编程序求出其中值最大的的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。文件名为那个元素的值,以及其所在的行号和列号。文件名为erweishuzuqiuzuidazhiweizhi.cerweishuzuqiuzuidazhiweizhi.c N-S流程图表示算法流程图表示算法 如下:如下:例7.5:有一个34的矩阵,要求编程
23、序求出其中值最大的那1 2 3 41 2 3 45 6 7 8 5 6 7 8 9 10 11 1213 14 15 16例:4行4列二维数组的对角线元素置0。例: 4行4列二维数组的上三角元素置0补充习题补充习题0 2 3 00 2 3 05 0 0 8 5 0 0 8 9 0 0 120 14 15 00 0 0 00 0 0 05 0 0 0 5 0 0 0 9 10 0 013 14 15 01 2 3 41 2 3 45 6 7 8 5 6 7 8 9 10 11 1213 14 15 161234例:4行4列二维数组的对角线元素置0。 7.3 字符数组字符数组 7.3.17.3.1
24、字符数组的定义字符数组的定义定义方法与前面介绍的类似。例如:char c10;c0=I;c1= ;c2=a;c3=m;c4= ;c5=h;c6=a;c7=p;c8=p;c9=y;7.3字符数组7.3.1字符数组的定义定义方法与对字符数组初始化,可逐个字符赋给数组中各元素。对字符数组初始化,可逐个字符赋给数组中各元素。例如:例如:char c10=I,a,m,h,a,p,p,y 7.3.27.3.2字符数组的初始化字符数组的初始化对字符数组初始化,可逐个字符赋给数组中各元素。7.3.2如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符。char cchar
25、c1010=c=c, ,pp,rr,oo,gg,rr,aa,m; m; 如果初值个数小于数组长度,则只将这些字符赋给数charc如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。char cchar c=I, ,a,m, ,h,=I, ,a,m, ,h,a,p,p,y;a,p,p,y;数组数组c c的长度自动定为的长度自动定为1010。如果提供的初值个数与预定的数组长度相同,在定义charc 7.3.37.3.3字符数组的引用字符数组的引用例例7.6 输输出一个字符串。出一个字符串。程序如下:程序如下:#includevoid main()
26、char c10=I, ,a,m, ,a, ,b,o,y; int i; for(i=0;i字符串2,函数值为一正整数。(3)(3) 如果字符串1str2) printf(yes);而只能用if(strcmp(str1,str2)0) printf(yes);比较的结果由函数值带回6. strlen函数函数 其一般形式为其一般形式为:strlen (字符数组字符数组) strlen是测试字符串长度的函数。函数的值为字符串中的实际长度(不包括0在内)。例如:例如:char str10=China;char str10=China;printf(%d,strlen(str);printf(%d,s
27、trlen(str);输出结果不是10,也不是6,而是5。也可以直接测试字符串常量的长度,如strlen(China); 6.strlen函数7. 7. strlwr函数函数 其一般形式为其一般形式为:strlwr (strlwr (字符串字符串) ) strlwr函数的作用是将字符串中大写字母换成小写字母。 8. 8. strupr函数函数 其一般形式为其一般形式为:strupr (strupr (字符串字符串) ) strupr函数的作用是将字符串中小写字母换成大写字母。 7.strlwr函数8.strupr函数补充习题补充习题将一个字符串中的字符逆序存放。将一个字符串中的字符逆序存放。判
28、断一个字符串是否为回文串。判断一个字符串是否为回文串。如:字符串“abcdcba”思想方法和前面讲过的逆序存放数据类似补充习题将一个字符串中的字符逆序存放。判断一个字符串是否为回补充习题补充习题将一个字符串前端的将一个字符串前端的*号删除。号删除。第一步:判断字符串前端有多少个*号第二步:将*号后面的字符逐个往前移动那个位置第三步:在字符串结尾加上结束标记思想方法:练习编程:(1)将一个字符串中间的连续将一个字符串中间的连续*号删除号删除(2)将一个字符串结束标记前的)将一个字符串结束标记前的*号删除。号删除。补充习题将一个字符串前端的*号删除。第一步:判断字符串前补充习题补充习题将s所指字符
29、串中下标为偶数的字符删除,串中剩余字符形成的新串放在t所指数组中。例如,当s所指字符串中的内容为ABCDEFGHIJK,则在t所指数组中的内容应是BDFHJ。从键盘输入一组小写字母,保存在字符数组str中。把字符数组str中字符下标为奇数的小写字母转换成对应的大写字母,结果仍保存在原数组中。例如,输入acegikm,输出aCeGiKm。将一个字符串中的空格删除。(空格字符也可以是其他字符)补充习题将s所指字符串中下标为偶数的字符删除,串中剩余字符形补充习题补充习题对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按ASCII值码升序排列。把字符串str2倒置后接在字符串str1后面。例如
30、:字符串str1为“Howdo”,字符串str2=?oduoy,结果输出:Howdoyoudo?。把一个整数转换成字符串,并倒序保存在字符数组str中。例如:当n=13572468时,str=86427531。补充习题对长度为7个字符的字符串,除首、尾字符外,将其余5个补充习题补充习题比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),输出较长的字符串。若两个字符串长度相等,则输出第1个字符串。例如,输入beijingshanghai(为回车键),结果输出:shanghai。实现两个字符串的连接(不使用库函数strcat),即把p2所指的字符串连接到p1所指的字符串后。补充习题比
31、较两个字符串的长度,(不得调用C语言提供的求字符例例7 .8 7 .8 输入一行字符,统计其中有多少个单词,单输入一行字符,统计其中有多少个单词,单 词之间用空格分隔开。词之间用空格分隔开。 7.3.7 7.3.7字符数组应用举例字符数组应用举例 例7.8输入一行字符,统计其中有多少个单词,单7例例7.9 7.9 有有3 3个字符串个字符串, ,要求找出其中最大者要求找出其中最大者 程序如下程序如下: :#include#includevoidmain()charstring20;charstr320;inti;for(i=0;i3;i+)gets(stri);。例7.9有3个字符串,要求找出其中最大者程序如下:不要放过任何一个看上去很简单的小编程问题他们往往并不那么简单,或者可以引伸出很多知识点;会用VisualC+,并不说明你会编写C语言程序;学习编程最好的方法之一就是阅读源代码;学习编程的秘诀是:编程,编程,再编程。不要放过任何一个看上去很简单的小编程问题