ImageVerifierCode 换一换
你正在下载:

ja5.docx

[预览]
格式:DOCX , 页数:23 ,大小:32.15KB ,
资源ID:18200508      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-18200508.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ja5.docx)为本站会员(b****0)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

ja5.docx

1、ja5第5章 数 组在前几章中,我们所使用的都是基本数据类型,如 char,int 和 float等,为了满足某些复杂情况下的编程需要,C 语言还提供了构造类型的数据,构造数据类型是由基本数据类型按一定规则组成的,本章要介绍的数组就是一种构造类型的数据。数组是一组相同类型的变量的集合,数组中的每个成员称为数组元素,每个数组元素都可以当作单个变量来使用,同一个数组中的所有数组元素的数据类型必须相同,可以是基本数据类型,也可以是构造数据类型,因此,按数组元素的类型不同,数组又可分为整型数组,实型数组、字符型数组、指针型数组、结构型数组等。通过本章的学习,要求掌握一维数组、二维数组和字符数组的定义、

2、初始化以及数组元素的引用等;掌握有关字符串处理函数的使用方法。5.1 一维数组的定义和引用一维数组通常是指由只有一个下标的数组元素所组成的数组,它是C语言编程中经常使用的一类数组。5.1.1 一维数组的定义数组在使用中一定要先定义,后引用。其一般形式为: 类型说明符 数组名 常量表达式;其中:类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的标识符,常量表达式是数组元素个数,也称数组的长度。 例如:int a10; /* 说明数组a有10个元素 */ float b10,c20; /* 说明实型数组b有10个元素,实型数组c有20个元素 * / char str20; /* 说明

3、字符型数组str有20个元素 */使用数组类型说明时注意: 数组名的命名规则和变量名相同,遵循标识符规则,但不能与其他变量名重名。例如: int a; float a10; 则是非法的。 常量表达式可以是符号常量或常量表达式,但不允许为变量。例如:int n=5; int an; 则是非法的。另外,常量表达式是用一对方括号括起来,不能用圆括号。 常量表达式表示元素的个数,是从0开始计算的,如a5表示数组a有5个元素,这5个元素分别为:a0,a1,a2,a3,a4。5.1.2 一维数组元素的引用数组元素是组成数组的基本单元,它也是一种变量,和单个变量的使用方法一样。一个数组一旦经过类型说明之后,

4、即可使用该数组及其数组元素。数组元素的一般表示形式: 数组名下标其中,下标只能为整型常量或整型表达式,若为小数,系统自动取整。例如:a5,ai+j,a2*2等都是合法的数组元素。数组元素通常也称为下标变量,C语言规定只能逐个地引用下标变量,而不能一次引用整个数组。例如:要输出有10个元素的数组a,必须使用下面循环语句逐个输出各下标变量: for(i=0,i10;i+) printf(%d, ai);而不能写成printf(%d,a);形式。【例5.1】数组元素的引用。#include main( )int i,a10; for(i=0;i=0;i-) printf(%4d,ai); /* 循环

5、把数组元素从大到小输出 */ 程序运行结果: 19 17 15 13 11 9 7 5 3 1对于ai=2*i+1;如果输入的数据无规律,则改用scanf(“%d”,&ai);如果输出a5.2或a5.8)元素的值,则均输出a5元素的值,结果为11。5.1.3 一维数组的初始化数组元素和变量一样,除了用赋值语句对数组元素逐个赋值(如例7.1)外,还可以在类型说明时赋值,称为数组的初始化,对一维数组的初始化通常可以采用三种方式进行。1. 对数组的全部元素赋初值例如:int a10=0,1,2,3,4,5,6,7,8,9;括号中的各数据值即为各元素的初始值,各值之间用逗号间隔。使用时注意:即使各数组

6、元素的值全部相等,也必须逐个赋值,而不允许给数组整体赋初值。例如:整型数组a5的5个元素全部为1,初始化时应写成: int a5=1,1,1,1,1; 而不能写为:int a5=1;2对数组的部分元素赋初值当括号中的值的个数少于元素的个数时,只给前面部分元素赋初值,其余元素自动赋0值。例如:int a10=0,1,2,3,4;表示只给a0a45个元素赋值,后面的5个元素a5a9赋0值。又如:int b5=0,0,0,0,0;与 int b5=0; 结果相同。3对数组的全部元素赋初值时,可以不指定数组长度。例如:int a5=1,2,3,4,5;可写为:int a =1,2,3,4,5;系统会根

7、据括号中的数值个数,自动定义a数组长度为5。另外,如果定义数组时不进行初始化,其元素的初值与数组的存储类别有关。对于存储类别为自动类型的数组其元素的初值为随机的,而对于存储类别为静态的数组或外部数组,其元素的初值为零。与存储类别有关的知识,将在以后的章节中介绍。【例5.2】写出下面程序运行结果。#include main( ) int i, a10=61,2,13,4,25,6,87,8,39,10; /* 给数组a赋初值 */ for(i=0;i10;i+) /* 循环输出数组元素 */ printf(%4d”,ai); 程序运行结果: 61 2 13 4 25 6 87 8 39 10除上

8、述的初始化赋值和用赋值语句给数组元素赋值外,还有一种给数组元素赋值的方法,即在程序执行过程中,对数组元素作动态赋值。例如 for(i=0;i10;i+) scanf(%d,&ai);执行for语句时,逐个从键盘输入10个数到数组 a 中。5.1.4 一维数组程序举例【例5.3】输入20个整数,求出其中负数的个数。main( )int a20,i,n=0; for(i=0;i20;i+) scanf(“%d”,&ai); for(i=0;i20;i+) if(ai0) n+;for(i=0;i2#include main( ) int i;long f 20=1,1; /* 部分初始化 */fo

9、r(i=2;i20;i+) fi=fi-2+fi-1; /* 从第3项开始循环,实现后一项为前两项之和 */for(i=0;i20;i+) if(i%5= =0) printf(n); printf(“%-12ld”,fi);程序运行结果: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765【例5.5】输入10个数按从小到大的顺序排列。这是数组中常用的一个算法排序问题,排序是将一组随机排放的数按从小到大(升序)或从大到小(降序)重新排列。排序有冒泡法,选择法等,该例中采用冒泡法实现升序排列。选择排序的思路是:设有

10、10个元素a1a10,将a1与a2a10比较,若a1比a2a10都小,则不进行交换,即无任何操作。若a2a10中有一个以上比a1小,则将其中最小的一个(假设为ak)与a1交换,此时a1中存放了10个数中最小的数。第二轮将a2与a3a10比较,将剩下9个数中的最小者与a2对换,此时a2中存放的是10个数中次小的数。依次类推,共进行9轮比较,a1到a10就已按由小到大顺序存放。(本例中定义数组长度为11,对a0不用,只用a1到a10。)main() int a11; int i,j,k,t; printf(input 10 numbers :n); for (i=1;i11;i+) scanf(%

11、d,&ai); printf(n); for(i =1; i 10; i +) k= i;for(j= i +1;jaj) k=j; /*该循环结束时,得到ak是aia10中最小者*/ if (k!=i) /*若ai+1a10中有一个以上比ai小,则*/t=ai;ai=ak;ak=t; /*将ai +1a10中最小者ak与ai 交换*/ printf(the sorted numbers :n); for(i=1;i11;i+) printf(%5d ,ai); 5.2 二维数组的定义和引用前面介绍的是只有一个下标的数组,称为一维数组,在实际问题中有很多量是二维或多维的。5.2.1 二维数组的

12、定义二维数组定义一般形式为:类型说明符 数组名常量表达式1常量表达式2;其中:常量表达式1为第1维(称为行)下标的长度,常量表达式2为第2维(称为列)下标的长度。例如, int a34;说明了一个3行4列的整型数组,数组名为a,元素的个数共有34个。C语言对二维数组采用这样的定义方式,可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。例如,可以把a看作是一个一维数组,它有3个元素:a0、a1、a2,每个元素又是一个包含4个元素的一维数组。见图5.1。可以把a0、a1、a2看作是3个一维数组的名字。上面定义的二维数组可以理解为定义了3个一维数组,即相当于 float a04,a1

13、4,a24; a0a00 a01 a02 a03 0行 a1a10 a11 a12 a13 1行 a2a20 a21 a22 a23 2行 | | 0列 1列 2列 3列图5.1与一维数组一样,二维数组的下标也是从0开始的,在二维数组中实际上描述了一个3行4列的表格,二维数组中的两个下标自然的形成了表格中的行列对应关系。而实际上在计算机中,由于存储器是连续编址的,即存储单元是按一维线性排列的,所以二维数组在计算机中是转换成一维数组排列存放的,即先按列号由小到大存放第一行元素,再存放第二行元素因此,C语言中,二维数组是按行排列的。C允许使用多维数组。有了二维数组的基础,再掌握多维数组是不困难的。

14、例如,定义三维数组的方法是 float a234;多维数组元素在内存中的排列顺序:第一维的下标变化最慢,最右边的下标变化最快。5.2.2 二维数组元素引用二维数组元素的一般表示方法为:数组名下标下标其中,下标为整型常量或整型表达式,如为小数系统自动取整。二维数组元素又称双下标变量,和普通变量的使用方法一样,可以出现在表达式中,也可以被赋值,例如:b12=a23/2;由于下标变量和数组说明在表示形式上是一样,因此使用时应特别注意。例如:int a34; a34=2/3; 以上语句中的a34是完全不同的两个概念,第一个语句中的a34用来定义一个数组,说明该数组是一个二维整型数组,有34个元素;第二

15、个语句中的a34则是一个双下标变量,是数值a的第4行第5列的一个元素。 5.2.2 二维数组的初始化与一维数组相似,对于二维数组,也可以通过数组初始化给它们赋初值,通常也具有三种方式。1按行分段赋初值例如:int a34 =1,2,3,4,5,6,7,89,10,11,12;2按行连续赋初值例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;以上两种初始化方式是完全等价的,比较而言,第一种方式比较清晰明了,有助于阅读程序。3部分赋初值,同一维数组一样,未赋值元素自动取0值例如:int a33=0,1,0,0,2,3;赋值后的元素值为:0 1 0 0 0 2 3 0 0

16、C 语言允许对全部元素赋初值时,可以省略第一维的长度。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以写为:int a 41,2,3,4,5,6,7,8,9,10,11,12;编译系统在编译程序时通过对初始值表中所包含的元素的个数进行检测,能够自动确定这个二维数组的第一维长度。在定义时也可以只对部分元素赋初值而省略第一维的长度,但应分行赋初值。如:int a4=0,0,3,0,10;这样的写法,能通知编译系统;数组共有3行。数组各元素为 0 0 3 0 0 0 0 0 0 10 0 0从本节的介绍中可以看到:c语言在定义数组和表示数组元素时采用a这种两个方括弧的

17、方式,对数组初始化时十分有用,它使概念清楚,使用方便,不易出错。5.2.4 二维数组程序举例【例5.6】将一个二维数组中的行和列元素互换,存放到另一个二维数组中。如原数组为:a=,互换后为:b=#includemain( ) int a23=1,2,3,4,5,6;int b32,i,j; for(i=0;i2;i+) for(j=0;j3;j+) bji=aij; / * 对数组a和数组b进行行列元素互换 * / printf(Array a:n);for(i=0;i2;i+) / * 双重循环输出二维数组a * / for(j=0;j3;j+) printf(%4d,aij); /*注意数

18、据之间应有间隔*/ printf(n); /*注意换行*/ printf(Array b:n); for (i=0;i=2;i+) / * 双重循环输出数组b * / for (j=0;j=1;j+) printf(%4d,bij); printf(n);【例5.7】 用二维数组实现输入N个学生,M科成绩,(1)求出每门课的最高成绩(2)求出所有成绩中的最高者,并记下其所在的行号和列号。按照本例要求,可以定义一个N行M列的数组存放输入的原始数据,但是这里为了方便,可以把数组定义成N+1行M列,最后一行用于存放每门课的最高成绩,其他每行记录一个学生的M科成绩。据此写出以下程序:#define N

19、 4#define M 5main()int aN+1M, i,j, row_max, max, row, colum;printf(“nPlease input 4*5 data:n”); for (i=0;iN;i+) /*双重循环对数组元素作动态赋值*/ for (j=0;jM;j+) scanf(“%d”,&aij);for (j=0;jM;j+) /*求每门课的最高者*/ row_max=a0j; for (i=1;iN;i+) if(row_maxaij) row_max=aij; aNj=row_max; printf(“Inputted data:n”);for (i=0;iN

20、;i+) /*输出N个学生M科成绩*/ for (j=0;jM;j+)printf(“%5d”,aij); printf(“n”); printf(“Max of every row:n”);for (j=0;jM;j+) /*输出每门课的最高者*/printf(“%5d”,aNj); printf(“n”); max=a00; /*先将max置为a00*/row=0; colum=0; /*记下最初max对应的行号和列号*/ for (i=0;iN;i+) /*求最大者*/ for (j=0;jmax) max=aij; row=i; colum=j; printf(nmax(of all)

21、=%d,row=%d,colum=%dn,max,row,colum);5.3 字 符 数 组字符数组是一种用来存放和处理字符型数据的数组变量,字符数组中一个元素存放一个字符。因为字符数组与前两节所介绍的数值数组在存放和处理数据时的方法有所不同,所以这里单独对其进行讨论。5.3.1 字符数组的定义字符数组类型说明一般表示形式为:char 数组名常量表达式;char 数组名常量表达式1 常量表达式2;例如:char ch110; /* 说明ch1为一维字符数组,含有10个元素 */char ch256; /* 说明ch2为二维字符数组,含有56个元素 */5.3.2 字符数组的初始化字符数组的初

22、始化通常采用的两种方式:1. 逐个给数组中的各元素赋初值例如:char ch10=C, ,P,r,o,g,r,a,m;赋值后各元素的值为: ch0 ch1 ch2 ch3 ch4 ch5 ch6 ch7 ch8 ch9CProgram0其中,ch9未赋值,系统自动赋空字符(即0)当对全部元素赋初值时可以省去长度说明,上式可写为:char ch =C, ,P,r,o,g,r,a,m;这时数组 ch 的长度自动定为 9。使用时注意:若括号中提供的初值个数大于字符长度,系统按语法错误处理;若初值个数小于数组长度,则将字符赋给前面的数组元素,其余元素自动赋空字符(即0)。2用字符串直接给字符数组赋初值

23、在C语言中,将字符串作为字符数组来存放。上面的初始化语句就是用一个一维的字符数组存放一个字符串“C Program”中的字符。这个字符串的实际存储长度与数组长度相等。有时,人们关心的是有效字符串的长度而不是字符数组的长度。例如,定义一个字符数组长度为100,而实际有效字符只有40个。为了测定字符串的实际长度,C语言规定了一个“字符串结束标志”,以字符0代表。如果有一个字符串,其中第10个字符为0,则此字符串的有效字符为9个。也就是说,在遇到字符0时,表示字符串结束,由它前面的字符组成字符串。系统对字符串常量也自动加一个0作为结束符。例如“C Program”共有9个字符,但在内存中占10个字节

24、,最后一个字节0 是由系统自动加上的。字符串作为一维数组存放在内存中。有了结束标志0后,字符数组的长度就显得不那么重要了。在程序中往往依靠检测0 的位置来判定字符串是否结束,而不是根据数组的长度来决定字符串长度。当然,在定义字符数组时应估计实际字符串长度,保证数组长度始终大于字符串实际长度。如果在一个字符数组中先后存放多个不同长度的字符串,则应使数组长度大于最长的字符串的长度。我们以前曾用过以下的语句:printf(How do you do?n);即输出一个字符串。在执行此语句时系统怎么知道应该输出到哪里为止呢?实际上,在内存中存放时,系统自动在最后一个字符n的后面加了一个0作为字符串结束标

25、志,在执行printf函数时,每输出一个字符检查一次,看下一个字符是否0。遇0就停止输出。对C语言处理字符串的方法有以上的了解后,我们可以用字符串常量来使字符数组初始化。例如:char ch10=C program;或 char ch =C program;也可以省去括号,直接写为:char ch10=C program; 或 char ch =C program;使用时注意:对用双引号括起来的字符串常量,C编译系统会自动在其后面加上一字符的结束标志符0。如上例,编译系统通过计算初值个数自动确定该数组长度为10,其中字符串长度为9,加上结束标志符0。因此,字符串方式赋初值比逐个字符赋初值要多占

26、一个字节,用来存放字符串结束标志0。上面的数组ch在内存中实际存放的是:C program0。需要说明的是:字符数组并不要求它的最后一个字符为0,甚至可以不包含0。像以下这样写完全是合法的:char c5=c,h,i,n,a;是否需要加0,完全根据需要决定。但是由于系统对字符串常量自动加一个0。因此,人们为了使处理方法一致,便于测定字符串的实际长度,以及在程序中作相应的处理,在字符数组中也常常人为地加上一个0。如:char c6=c,h,i,n,a,0;注意,C语言中,没有专门的字符串变量,通常用一个字符数组来存放一个字符串。5.3.3 字符串的输入与输出字符串的输入输出有两种方式1用格式符%

27、c实现逐个字符输入输出。【例5.8】阅读程序,写出程序结果。#include main( ) char a4; int i; printf(请输入三个字符:); /* 从键盘输入单个字符赋给字符串的每个元素 */ scanf(%c,%c,%c,&a0,&a1,&a2); printf(输入的字符串是:); for(i=0;i3;i+) /* 为逐个输出字符设置的循环 */ printf(%c,ai); /* 输出各元素的单个字符 */ 程序运行结果: 请输入三个字符: a,b,c 输入的字符串是: abc2. 用格式符%s实现整个字符串输入输出采用格式符%s后,将使字符数组的输入输出变和简单、方便。【例5.9】用格式符

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2