C语言程序设计-第6章--数组_第1页
C语言程序设计-第6章--数组_第2页
C语言程序设计-第6章--数组_第3页
C语言程序设计-第6章--数组_第4页
C语言程序设计-第6章--数组_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1、 程序设计技术基础第6章 数组2022/7/232前几章使用的变量都属于基本类型,例如整型、字符型、浮点型数据,这些都是基本的数据类型。对于有些数据,只用简单的数据类型是不够的,难以反映出数据的特点,也难以有效地进行处理。如果有10000名学生,每个学生有一个成绩,需要求这10000名学生的平均成绩。原有的基本数据类型就很难高效地完成这个任务。需要一种新的数据类型2022/7/233一维数组定义、初始化、引用、使用定义、初始化、引用、使用字符数组定义、初始化、引用、处理字符串、字符串处理函数、使用多维数组2022/7/2346.1 一维数组6.1.1一维数组的定义6.1.2 一维数组的初始化6

2、.1.3 一维数组成员的引用6.1.4 一维数组的使用6.1一维数组2022/7/2356.1.1一维数组的定义1. 一维数组的定义一维数组的定义格式如下:类型说明符 数组名数组长度例如,定义一个一维数组:int array6;6.1一维数组2022/7/2366.1.2 一维数组的初始化如同变量的初始化一样,一维数组的初始化也是在定义一维数组时直接给其成员赋初值。否则数组中各成员的值将是随机的,不可预料的。1. 一维数组初始化格式一维数组初始化的格式为:类型说明符 数组名数组长度=初值列表;例如对一个一维数组初始化:int array6=1, 2, 3, 4, 5, 6;经过上面的定义和初始

3、化之后该数组的成员分别为:array0=1、 array1=2、 array2=3、 array3=4、 array4=5、array5=6。6.1一维数组2022/7/2376.1.2 一维数组的初始化2. 一维数组初始化的几种情况(1) 对一维数组全部成员都赋初值时,数组长度可以缺省。系统将按照初值列表中的数值个数自动确定数组长度。例如:int array =1, 2, 3, 4, 5, 6;在上述过程中缺省了数组长度,但初值列表中有6个成员,因此系统自动确定该数组长度为6。(2) 当给出一维数组的数组长度时,可以在初值列表里列出部分成员的值。例如:int array6=1, 2, 3;在

4、初值列表中只列出了3个值,与其对应的是:array0=1、array1=2、array2=3。对于剩余的成员array3array5,系统将自动为其填充初值为0。因此在定义数值类型的一维数组时只要在初值列表中给出一个初值,其后的成员就全部赋0值。例如:int array6=0;6.1一维数组2022/7/2386.1.3 一维数组成员的引用一维数组定义后就可以使用了。由于C语言规定不能整体引用数组,所以只能逐个引用数组的成员。数组成员的表示的形式如下:数组名下标与数组定义中的数组长度不同,在对数组成员引用时,下标可以是整型常量、整型变量或整型表达式。例如:array0、array i、arra

5、y 2*i+1 在对数组成员进行引用时要注意下标从0开始,同时要避免混淆数组长度和下标区别而产生的越界问题。例如: float score 10; /*定义一维数组长度为10*/ b=score5; /*引用score数组中下标为5的成员,既数组中的第6个成员*/ w=score10; /*引用score10越界,因为数组成员为score0 score9 */6.1一维数组2022/7/239#includeint main() int i=0; /*初始化变量*/ int array7=0; /*初始化一维数组*/ printf(Please input 7 integers:n); for

6、(;i7;i+) /*用循环结构给一维数组赋值*/ scanf(%d, &arrayi); printf(nThe sequence in computer is: ); for(i=0;i7;i+) /*屏幕输出一维数组*/ printf(%d , arrayi); return 0;【例6-1】 将数列1, 3, 6, 10, 15, 21, 28用一维数组存放,并在屏幕上显示。分析:数列由7个三角形数构成,因此可以用一个数组长度为7的一维数组存放。程序如下:程序运行的结果为:Please input 7 integers:1 3 5 10 15 21 28The sequence in

7、computer is: 1 3 5 10 15 21 286.1一维数组2022/7/23106.1.4 一维数组的使用【例6-2】求Fibonacci数列的前20项,并将结果用一维数组存储。分析:按照Fibonacci数列的定义,首先使数组的前两项Fib0= Fib1=1,然后用公式Fibi= Fibi-1+ Fibi-2求出数列的后续各项。算法如图6-2所示:6.1一维数组2022/7/23116.1一维数组2022/7/2312【例6-3】向一个有序序列中插入一个数,并保持序列有序。例如向序列1,3,6,9,11中插入5得到序列1,3,5,6,9,11。分析:首先需要定义一个足够大的一

8、维数组用于存放插入后的序列。其次,插入数值后,一维数组中,在插入位置后面的成员需要依次后移。算法如图6-3所示:6.1一维数组2022/7/23136.1一维数组2022/7/2314【例6-4】对给定的数列5, 2, 3, 4, 1用冒泡法按升序排序并在屏幕上输出结果。分析:冒泡法的思路是:将相邻数据两两依次比较,按从小到大或从大到小顺序交换,一趟过去之后,最大或最小的数字被交换到了最后一位。再从头开始比较,直到倒数第二位。这里是把最大的数字往后交换,如图6-4所示:6.1一维数组2022/7/23156.1一维数组2022/7/2316【例6-5】从键盘接受5个整数,用选择排序法按升序排列

9、并输出结果。分析:选择排序法的思路是:每一次从无序组的数据成员中选出最小(或最大)的一个成员,把它和无序组的第一个成员交换,无序组成员减少,有序组成员增加,直到全部待排序的数据成员排完,如图6-6所示:6.1一维数组2022/7/23172022/7/23186.2 多维数组6.2.1 多维数组的定义6.2.2 多维数组的初始化6.2.3 多维数组成员的引用6.2.4 多维数组的使用6.2 多维数组2022/7/23196.2.1 多维数组的定义1. 多维数组的定义多维数组的定义格式如下:类型说明符 数组名第1维长度 第2维长度 第n维长度;例:定义一个34的二维数组如下:int arr234

10、; arr200arr201arr202arr203arr210arr211arr212arr213arr220arr221arr222arr2236.2 多维数组2022/7/2320 6.2.2 多维数组的初始化赋值时按“行优先”的顺序对数组成员依次赋值。其初始化的形式为:类型说明符 数组名第1维长度 第2维长度 第n维长度=初值列表;在初始化时有如下两种情况,以二维数组arr234为例。1. 将初值写在一个大括号内(1)对全部成员显式赋初值int arr234 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;此时,可省略行下标,而不能省略列下标。如:int

11、 arr2 4 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;根据初值列表中所有数据为12个,而arr2每行为4列,系统会自动确定数组为3行。(2)对部分成员显式赋初值int arr234 = 1, 2, 3;此初始化的结果是arr200=1,arr201=2,arr202=3。后面未被显式赋初值的9个成员,会被系统自动赋予0。6.2 多维数组2022/7/23212. 把初值按行分组(1)对全部成员显式赋初值int arr234 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;(2)对部分成员显式赋初值int arr234 =

12、 1, 2, 5, 6, 9, 10, 11, 12;此初始化的结果是arr200=1,arr201=2,arr202=0,arr203=0,arr210=5,arr211=6,arr212=0,arr213=0,arr220=9,arr221=10,arr222=11,arr223=12。由于按行分组已经明确了行数,因此在此情况下可以缺省行下标,如:int arr2 4 = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12;int arr2 4 = 1, 2, 5, 6, 9, 10, 11, 12;这两个都是合法的。6.2 多维数组2022/7/23223. 二维

13、以上数组的初始化可将二维数组的初始化方法推广到更高维的数组,如:(1)int arr3234=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24;(2)int arr3 34= 1, 2, 5, 9, 10, 11, 13, 17, 18, 21, 22;(3)int arr3234=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24;(4)int arr3

14、 34=1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24;6.2 多维数组2022/7/23236.2.3 多维数组成员的引用1. 多维数组成员的引用格式多维数组成员的引用在原则上与一维数组是相同的,主要区别在下标的个数。如果定义的是一个n维数组,则此n维数组中成员的引用格式如下:数组名下标1下标2下标n;需要注意的是在数组定义时,方括号中给出的是某一维的长度。而数组引用时,成员中的下标是该成员在数组中的位置标识。2. 二维数组成员的引用还是以二维数组为例对多维数组的引用做

15、说明,如arr213。在引用时需要注意以下几点:(1)数组成员在引用前必须先定义,例如:float arr223; /*引用前必须定义*/arr202=1.2; /*在定义后可以引用*/6.2 多维数组2022/7/2324(2)在引用数组成员时注意不要越界,例如:float arr223; /*引用前必须定义*/arr223=1.2; /*引用越界*/因为数组成员引用的下标是从0开始的,所以该数组中最后一个成员应该是arr212。C语言在编译时不检查越界错误,但在运行时会引起程序出错或导致错误结果。(3)成员的下标可以是整型变量或表达式。数组定义时的数组长度,只能是整型常量或整型常量表达式。

16、而引用时,成员下标可以是整型常量、整型变量或整型表达式。例如,当i和j已定义为整型变量且已赋值,则可用arr2i-1j+2表达成员。注意:需要检查i-1和j+2的结果是否越界。6.2 多维数组2022/7/23253. 二维以上数组成员的引用二维以上数组成员的引用与二维数组类似,例如:定义了一个三维数组:int arr3345;则引用其成员arr3102并赋值的语句为:arr3102=89;6.2 多维数组2022/7/2326 6.2.4 多维数组的使用【例6-6】有一个33的整数矩阵A,分别求其主、副对角线成员之和。6.2 多维数组2022/7/23276.2 多维数组2022/7/232

17、86.2 多维数组2022/7/2329【例6-8】三角阵是一种重要的矩阵。试把一个55的矩阵A,转换成一个下三角阵。6.2 多维数组2022/7/23306.2 多维数组2022/7/2331【例6-9】试输出以下图形: 6.2 多维数组2022/7/23322022/7/23336.3 字符数组6.3.1 字符数组的定义6.3.2 字符数组的初始化6.3.3 字符数组成员的引用6.3.4 字符数组处理字符串6.3.5 字符串处理函数6.3.6 字符数组的使用6.3 字符数组2022/7/23346.3.1 字符数组的定义1. 一维字符数组的定义char 数组名数组长度;例如:char la

18、stname10;2. 二维字符数组的定义char 数组名数组长度1数组长度2;例如:char name238;如果要用到更高维度的数组形式,其定义与二维字符数组类似。字符型数据也可以使用整型数组来存储。但是,字符型数据只占用1个字节,显然使用整型型数组存储字符数据会浪费空间,因此很少这样使用。6.3 字符数组2022/7/2335 6.3.2 字符数组的初始化1. 对一维字符数组的初始化格式对一维字符数组的初始化采用如下格式:char lastname5= L, i, a, n, g ;上述语句把5个字符分别赋给lastname 0lastname 4这5个成员。字符数组定义的规则:(1)

19、如果在定义字符数组时不进行初始化,则数组中各成员的值将是随机的,不可预料的。(2) 如果花括号中提供的初值个数(即字符个数)大于数组长度,则按语法错误处理。(3) 如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些成员,其余的成员自动定为空字符(即0)。例如:char lastname 5= L, i , u;6.3 字符数组2022/7/2336(4) 如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。例如:char lastname =Z, h, e, n, g ;数组lastname的长度自动定为5。2. 对二维字符数组的初始化

20、格式对二维字符数组的初始化采用如下格式:(1)char name235= Z, h, o, u, W, u , Z, h, e , n, g ;(2)char name2 5= Z, h, o, u, W, u , Z, h, e, n, g ;(3)char name235= Z, h, o, u, 0, W, u, 0, 0, 0, Z, h, e, n, g ;(4)char name2 5= Z, h, o, u, 0, W, u, 0, 0, 0, Z, h, e, n, g ;其逻辑形式如图6-12所示。显然(3)、(4)不推荐。6.3 字符数组2022/7/2337 6.3.3

21、字符数组成员的引用定义完一个字符数组后就可以对其成员进行引用,例如:(1)char lastname5; lastname1=N;(2)char name235; name212=m;【例6-11】 替换姓氏(姓氏的拼音)并输出。6.3 字符数组2022/7/23386.3 字符数组2022/7/2339【例6-12】 用二维数组表示一组姓氏的拼音,并输出。6.3 字符数组2022/7/2340 6.3.4 字符数组处理字符串1. 字符串在字符数组中的形式字符串是指用双引号引起来的若干有效字符的序列。在C语言中下面都是合法的字符串:Happy new year;C program!;y=Ax+

22、B;sum*16;%d%fn例如:char lastname6= Zheng; /*等价于 char lastname6= Zheng */则数组成员的值为: lastname0=Z、lastname 1=h、lastname 2=e、lastname 3=n、lastname 4=g、lastname 5=06.3 字符数组2022/7/23412. 字符串结束符由于字符串后面隐含了字符0。因此用字符串初始化字符数组时,要特别注意数组长度的定义。如果char lastname5= Zheng;则会出现错误。字符0在字符串中叫串结束符是“字符串结束标志”。有了这个标志系统就可以自动计算字符串的

23、长度。当然,在定义字符数组时还是需要估计所要存放字符串的长度,保证数组长度始终大于等于字符串实际长度。如果在一个字符数组中存放的字符个数是变化的,应考虑最多字符的情况,数组长度在定义时选择一个最大值。如:char name236= Zhou , Wu , Zheng ; 在三个字符串中Zheng 有6个字符,比其他两个长,所以数组第二维下标长度为6。数组形式如图6-13所示:6.3 字符数组2022/7/23423字符串的输入/输出对字符串的输入/输出,除了用 “%c” 外,还可以用 “%s”,配合格式输出函数printf和格式输入函数scanf对字符串有效字符整体输入/输出。 (1) 用pr

24、intf函数和“%s”格式输出字符串。例如:将整个字符串一次输出:char lastname = Zheng ;printf(%s, lastname);(2) 用scanf函数和“%s”格式输入一个字符串。例如:从键盘输入字符串并赋给字符数组。char lastname6;scanf(%s, lastname);如果要用一个scanf函数输入多个字符串,则在输入时以空格或回车分隔。例如:char lastname16, lastname26, lastname36;scanf(%s%s%s, lastNamel, lastName2, lastName3);6.3 字符数组2022/7/23

25、43【例6-13】用格式%s的scanf函数给一个字符数组赋值。6.3 字符数组2022/7/2344(3)字符串输出函数putsputs函数的作用是将一个字符串输出到屏幕上。与printf不同,puts在输出字符串时,遇到0后会自动加上换行。其调用形式为:puts(字符数组名)【例6-14】用puts函数输出的字符串中可以包含转义字符。6.3 字符数组2022/7/2345(4)字符串输入函数gets不同于读取一个字符的函数getchar(),gets( )函数用于从键盘缓冲区中读取字符串,直到出现换行符,最后加上0作为字符串结束。其调用形式为:gets(字符数组名)由于gets函数可以输入

26、含有空格的字符串,所以这一点上比scanf函数要方便一些。例如:从键盘输入的字符串“LP,Qing”,并赋给字符数组name2。回车是gets函数的输入结束标志。【例6-15】用gets和puts函数输入、输出字符数组中的字符串。6.3 字符数组2022/7/2346 6.3.5 字符串处理函数#include1字符串复制函数strcpystrcpy函数用于字符串复制的函数,其调用形式为:strcpy(字符数组1, 字符串/字符数组2)该函数的作用是将字符串复制到字符数组1中去。需要注意的是strcpy中字符数组1的长度不应小于被复制的字符串的长度。此外,字符数组1必须写成数组名形式。例如:c

27、har sl10, s2 = “Zheng”;strcpy(sl, s2);复制前后sl的状态如图6-14所示:6.3 字符数组2022/7/23472. 两个字符串的连接函数strcatstrcat是用于连接两个字符串的函数。其调用形式为:strcat(字符数组1, 字符串/字符数组2)该函数的作用是把字符数组2中存放的字符串连接到字符数组l中存放的字符串的后面,连接的结果依然放在字符数组1中,连接前,两个字符串的后面都有0,连接时将字符数组1中的字符串后面的0取消,然后进行连接。最后在连接组成的新串末尾保留0。函数调用后返回的是字符数组1的地址,也就是新串保存在数组1中。例如:char s

28、l40= The teachers name is ;char s220=Han Lidou;printf(%s, strcat(sl, s2);输出结果为The teachers name is Han Lidou。6.3 字符数组2022/7/23483. 字符串比较函数strcmpstrcmp作用是比较字符串1和字符串2。其调用形式为:strcmp(字符串1/字符数组1, 字符串2/字符数组2)strcmp(sl, s2);strcmp(United States, P.R. China);运行结果为1。strcmp(s, Han);strcmp(Dou, s);其中,s、s1和s2是存放字符串的字符数组名。字符串比较的规则是按自左至右的顺序对两个字符串的字符逐对比较字符的ASCII码值,直到出现不同的字符或遇到0为止。当字符串1等于字符串2时,strcmp函数的返回值为0;当字符串1大于字符串2时,strcmp函数的返回值为正整数;当字符串1小于字符串2时,st

温馨提示

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

评论

0/150

提交评论