




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数组,按序排列的相同类型数据元素的集合称为数组。数组类型是一种常用的构造型数据类型,它有若干分量。一般把这些分量称为数组元素。在C语言中,没有提供动态数组的类型,即:定义一个数组之后,就确定了它所容纳的同类元素的个数(即数组大小)。这就构成了数组类型的两个特点:一方面,其大小必须是确定的,不允许随机变动;另一方面,其元素必须是同质的,即类型相同,不允许出现混合类型。数组中各个元素的相对位置(即下标)是确定的,分别“按号就坐”。通过数组名和下标可以惟一的确定数组中的元素,不会发生混乱。,5.1一维数组的定义和引用5.2字符数组5.3多维数组5.4应用举例,5.1一维数组的定义和引用,5.1.1一维数组的定义在使用一个数组之前,必须对它加以定义。它的任务是:标识数组的名称;确定数组的大小,即数组中元素的个数;表明数组的基类型,即其元素的类型。一维数组的一般定义形式为:数据类型数组名整型常数表达式;例如:inta10;doublevalue5;longintarray6*6;,定义数组时应注意:数组名是标识符,它遵循标识符的命名规则。数组名之后是一对方括号,它是数组标志,不能用圆括号。方括号内是整型常量表达式。整型常量表达式是一种其值为正整数的表达式,它表示该数组元素的个数,即数组大小。,表示数组大小的整型常量表达式中不能包含变量。例如,不能利用scanf()函数接收用户输入的数值来随意指定数组的大小。intn,errn;scanf(d,&n);这是不行的。对定义好的数组,C编译在内存中为它分配一片连续的空间。基地址是指该数组在内存中的起始地址。,5.1.2一维数组元素的引用在C语言中,引用一维数组元素的一般形式是:数组名下标下标可以是整型常量或整型表达式。例如:a0a1a2*2a86;在引用数组元素时应注意:在C语言中,数组元素的下标是从0开始计算,而不是从1开始。数组元素是变量。一个数组元素可以像同类型的单一变量那样在表达式中执行相应的操作。,例5-2:设有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。问在第20年时,共有多少头牛?分别输出从第1年至第20年每年的牛数。由题意,可得到如下的数据:设Un表示第n年(n4)时牛的头数,由表中数据间的关系可得出下式:UnUnUn3(n4)根据这个式子,建立一个数组ncow存放各年牛的头数。,程序如下:#includevoidmain()inti,ncow201;ncow12;ncow23;ncow34;,for(i4;i20;i)ncowincowi1ncowi3;for(i1;I20;i)printf(12d,ncowi);if(i50)printf(n);,5.1.3一维数组的初始化对数组提供初值的方式有两种:分别为各个元素提供初值和对整个数组初始化。对数组元素提供初值的方式可以像对待同类型的简单变量那样,利用赋值语句直接赋值,或者通过调用scanf()函数,由用户输入各元素的值。例如,inta5;a010;a15;inti,a10;for(i0;i10;i)ai0;,利用数组初始化方式可以为整个数组提供初值。一维数组初始化的一般形式是:数据类型数组名整型常量表达式初始值;初值表是一些由逗号分隔开的初值符,它是表示初值的常量表达式。inta100,1,2,3,4,5,6,7,8,9;各个初值括在一对花括号中,从左到右依次赋给数组的各个元素。,例5-3:求下列数的总和及平均值:95,86,90,92,89,75,88,96,91,93。#includevoidmain()staticintarray1095,86,90,92,89,75,88,96,91,93;inti,sum;i0;sum0;,while(i10)sumarrayi;printf(Thesumdn,sum);printf(Theaverage.1fn,(double)sum/10);,对一维数组初始化时应注意以下几点:在经典C语言中规定,只有静态(static)数组和外部(extern)数组才能初始化。但在ANSIC和标准C中取消了这一限制。就是说,对自动数组也可以初始化。外部数组和静态数组的初始化工作是在编译时进行,因此,只进行一次;而自动数组的初始化工作是在程序执行时进行,从而可进行多次。,对数组初始化时,初值符的个数不能多于数组元素的个数,但允许初值符的个数少于数组元素的个数。当初值符个数少于数组元素个数时,出现在初值表中的初值就对前面的若干个数组元素依次赋值,而其余的数组元素隐含用0赋初值。inta101,2,3,4,5;若没有对静态和外部数组显式地进行初始化,则系统会对它们自动进行初始化,即所有数组元素都赋予0。staticintnum10;,例5-5:用数组处理例4-14的Fibonacci数列问题。为了简化程序,这里只求前30项。利用数组fib保存该数列各个项。/*Fibonacciarray*/#includevoidmain()inti;longintfib301,1;,for(i2;i30;i)fibifibi1fibi2;for(i0;i30;i)if(i50)printf(n);printf(12ld,fibi);,如果一维数组在定义时带有初始化项,那么,数组的大小可以省略。在编译时系统会根据初值表中初值符的个数计算数组中元素的个数。inta1,2,3,4,5;这种形式就等同于:inta51,2,3,4,5;如果初值符的类型与数组元素的类型不一致,则把初值符类型转换为数组元素的类型。,5.2字符数组,通常使用的字符数组是一维数组(当然,字符数组也可以是多维数组),其元素的类型是字符量。一个字符数组元素中存放一个字符。5.2.1字符数组的定义和引用字符数组的一般定义形式是:char数组名整型常量表达式;由整型常量表达式的值决定数组的大小。charname15;字符数组占用一片连续的空间,如图5-3所示。每一个元素占用的单元应足以存放一个字符量,通常是一个字节。,5.2.2字符数组的初始化对字符数组赋初值的方式有以下几种:利用赋值语句对数组元素赋初值。例如:charname15;name0M;name1e;name2n;name3g;name40;,利用库函数(如scanf(),由用户为字符数组输入初值。例如:charcity15;scanf(s,city);用字符常量作为初值符,对字符数组进行初始化。chars11p,r,o,g,r,a,m,m,i,n,g;用字符串直接对字符数组初始化。staticcharc15Beijing;,但应注意,字符串是以空字符0作为结束标志,下述两种初始化方式就有差别:staticcharb1C,h,i,n,a;staticcharb2China;如果指定的字符数组的大小恰好等于字符串直接量中显式出现的字符个数,那么字符串结束标志0就不被放入字符数组中。chartabc,s3abc;它们等同于:charta,b,c,0,sa,b,c;,例5-9:对字符数组初始化,然后打印出各个元素的字符和相应的ASCII编码值。#includevoidmain()inti;staticcharc12InChina;for(i0;I12;i)printf(cd*,ci,ci);printf(nsn,c);,程序运行结果为:I73*n110*32*C67*h104*i105*n110*a97*0*0*0*0*InChina,对字符数组初始化时,应该注意以下几点:在经典C中规定,只有外部数组和静态数组才能初始化,但在ANSIC和标准C中都取消了这一限制,即,自动类字符数组也可以初始化。对外部数组和静态数组的初始化是在编译时进行,只做一次;对自动数组的初始化是在执行时进行,因而,在程序运行过程中,可对自动数组多次进行初始化。,对字符数组初始化时,初值表中提供的初值个数(即在一对花括号中的字符个数)不能大于给定数组的长度。初值符的个数可以小于数组的长度。在这种情况下,只将提供的字符依次赋给字符数组中前面的相应元素,而其余的元素自动补0(即空字符0的值)。如果想用提供的初值符个数来确定数组大小,那么在定义时可以省略数组大小。,5.3多维数组,在C语言中,数组的元素还可以是数组,这样就构成多维数组。所以,二维数组可以看成是“数组的数组”。5.3.1二维数组的定义二维数组的一般定义形式是:数据类型数组名整型常量表达式整型常量表达式inta510;doublematrix32*31;,按照多维数组的定义,二维数组其实是一个“数组的数组”。上面数组a的元素a08,a34,a40等是整型量,而a0,a1,a4的基本类型却是“数组”。二维数组在书写形式上采用方括号成对并列出现。inta510;下述形式是不正确的:inta5,10;inta(5,10);inta5,10;inta510;(两对方括号中间有空格)inta(5)(10);(应该使用方括号),5.3.2二维数组的内部表示C语言中,二维数组的元素是“先按行、再按列”排列的。intab45;,5.3.3多维数组的定义多维数组的一般定义形式为:数据类型数组名整型常量表达式整型常量表达式整型常量表达式;例如,描述空间矩阵需用三维数组:doublespace355;,5.3.4二维数组引用二维数组元素的表达形式是:数组名下标表达式下标表达式;其中,下标表达式的值必须是整数。ab00是数组ab的第0行第0列元素。在引用数组元素时应注意:二维数组的行下标和列下标的值都是从0开始的。就一般情况而言,如果二维数组定义时行的长度为M,列的长度为N,那么,合法的数组行下标值是0M1,列下标值是0N1。二维数组元素可像同类型的简单变量那样在表达式中使用,但应注意:行下标、列下标都应齐备。,例5-10:写一个程序,计算两个矩阵相乘得到的第三个矩阵,并打印计算结果。程序如下:#includevoidmain()inti,j,k;inta43,b35,c45;printf(InputelementsofmatrixA.n);for(i0;i4;i)for(j0;j3;j)scanf(d,&aij);printf(InputelementsofmatrixB.n);,for(j0;j3;j)for(k0;k5;k)scanf(d,&bjk);printf(MatrixCisasbelow:n);for(i0;i4;i)for(k0;k5;k)cik0;for(j0;j3;j)cikaij*bjk;printf(6d,cik);printf(n);,5.3.5二维数组的初始化对二维数组初始化的形式有两种:与一维数组初始化的形式相同,即:由一对花括号把所有初值都括起来,其中的初值依次赋予二维数组的各个元素。例如:intmatrix550,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4;,可用花括号把同一行元素的初值括起来,得到如下常用的形式:intmatrix550,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4;,对二维数组初始化时,还应注意以下几点:在ANSIC和标准C中规定,对外部、静态以及自动的二维数组都可以进行初始化。对外部和静态二维数组的初始化是在编译时进行的,只作一次;而自动二维数组的初始化是在程序运行时进行,因此能作多次。对外部和静态数组定义时,如没有显式进行初始化,则系统自动对它们初始化:所有元素都置为0。但是,在自动数组定义时若没有显式初始化,其元素的值是杂乱的。,如果在定义二维数组时又对它的全部元素提供初值,那么,该数组的第一维的长度可以省去,但第二维的长度不能缺少。例如:staticintday_tab130,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31;,可以对部分元素赋初值。即:若初值个数比数组元素个数少,则后面无对应初值的元素都自动用零补充。例如:floaty431,3,2,4,5,9,;,初始化的结果是:y001,y013,y020,y102,y114,y120,y205,y219,y220,,而第3行的3个元素都为0(数据类型都要转换成float型)。用矩阵形式表示,即:,在这种情况下,如果去掉内部的花括号,那么就会产生不同的初始化结果:floaty431,3,2,4,5,9;其结果是:y001,y013,y022,y104,y115,y129,,而第2行和第3行的全部元素(共6个)都为0,即:,如果只对部分数组元素提供初值,又省略第一维的长度(行长),那么应分行赋初值,既使某行没有对应的初值,也必须保留对应该行的一对花括号。例如:inta40,1,6,0,0,5,1,0,0,8;编译时能确定数组a有4行4列,各个数组元素的值如下面矩阵所列:,对二维字符数组可用字符串直接量进行初始化,每个字符串直接量对应一行数组元素。,例5-12:输入一个月份的数字,输出相应的英文名字。#includevoidmain()intn;staticcharname10invalid,January,February,March,April,May,June,July,August,September,October,November,December;printf(Inputamonthnumber!n);scanf(d,&n);printf(sn,(n1|n12)?name0:namen);,5.4应用举例,例5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版智慧城市投资入股合同示范文本
- 2025年度预付款担保公司针对艺术品交易合同
- 2025殡葬服务绿色殡葬理念推广与应用合同
- 2025年度文化旅游区特色商铺租赁合作协议
- 2025年度高端企业市场分析及战略规划商务咨询服务合同
- 2025年度地铁隧道建设第三方监理合同范本
- 2025版体育馆室内篮球场租赁及配套器材供应合同
- 2025年特色民宿改造升级设计与施工合同
- 2025年度能源行业财务担保合同发行与会计处理规范
- 2025版新型生态绿化工程承包合同下载
- 中控室培训课件
- 自考《01685动漫艺术概论》考试复习题库(含答案)
- 2025年中考语文复习之小题狂练300题(名著阅读):《艾青诗选》《水浒传》(10题)
- 除颤仪的使用方法及操作流程课件
- 环境卫生整治项目合同范例
- ARDS患者的观察与护理
- 红色国潮风纳西族介绍模板
- 医院安防监控系统维保方案
- GB/T 44570-2024塑料制品聚碳酸酯板材
- 祖遗户遗产继承协议书范文
- 第二章 处方调剂课件
评论
0/150
提交评论