《C语言与程序设计教程》课件第4章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《C语言与程序设计教程》课件第4章.ppt》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言与程序设计教程 语言 程序设计 教程 课件
- 资源描述:
-
1、第第4章章 数组数组 4.1 一维数组4.2 二维数组 4.3 字符数组和字符串 4.4 典型例题精讲4.1 一维数组一维数组4.1.1 一维数组的定义一维数组的定义数组元素可以有多个下标,下标的个数表示数组的维数,只有一个下标时表示该数组为一维数组。数组的使用也必须遵循“先定义,后使用”这一原则。一维数组定义的一般形式如下:类型标识符 数组名常量表达式;数组定义包含以下几个要点:(1)类型标识符用来指明数组元素的类型,同一数组的元素其类型相同;类型标识符可以是任意一种基本数据类型或者构造数据类型。(2)数组名的命名规则与普通变量相同,但不得与其他变量或数组同名;数组名表示该数组在内存中存放的
2、首地址,是一个地址常量。(3)方括号“”是数组的标志,方括号中的常量表达式表示数组的元素个数,即数组的长度(大小)。(4)常量表达式是整型常量、符号常量及由它们组成的表达式,但不允许出现变量。例如:int a5;在此,数组a共有5个元素:a0、a1、a2、a3和a4,且每个元素都是整型的。特别要注意的是,数组元素的下标从0开始,直至数组元素的个数减1,数组a的内存分配示意见图4-1,从图中可以看到:数组名a实际上就是数组元素a0的地址。C语言的编译器不对数组的越界问题进行检查,直到运行时才给出出错信息,这一点要特别注意。图4-1 int a5的内存分配示意例4.1 指出下面的数组定义中哪些是正
3、确的,哪些是错误的。int x40,y20,z(10);float b7.5,s8;int m;char m15,chm;解 对本题的数组定义说明如下:(1)对“int x40,y20,z(10);”,其中数组x、y的定义是正确的,而数组z的定义有错,因为数组的标志是方括号“”,而不是圆括号“()”。(2)对“float b7.5,s8;”,其中数组s定义是正确的,而数组b因其表示数组元素个数的常量表达式是一浮点型常量,而不是整型常量,因此出错。(3)对“char m15,chm;”,数组m因为与整型变量m同名而出错,数组ch的常量表达式是一变量m,而不是常量,因此出错。4.1.2 一维数组的
4、引用和初始化数组必须先定义、后使用,并且只能逐个引用数组元素而不能一次引用整个数组。数组元素的引用格式为:数组名下标其中,方括号“”中的下标只能是整型常量或整型表达式。例如:a5bi+2*j /*i和j均为整型变量*/ci+1 /*i为整型变量*/都是合法的数组元素。程序在引用数组元素的值之前,必须先给数组元素置初始值。数组元素的初始值可以由键盘输入,也可以通过赋值语句来设置。在程序每次运行时数组元素的初值都固定不变的情况下,可以在数组定义时就给定其元素的初值;这种方式称为数组的初始化。数组初始化可以有以下几种方法:(1)在数组定义时给数组所有元素赋初值。例如:int a5=0,1,2,3,4
5、,;将数组元素的初值用“,”分隔依次写在一对花括号“”内。经过上面的定义和初始化之后,就有:a0=0,a1=1,a2=2,a3=3,a4=4如果想使一个数组中全部元素的初值均为0,则可写成:int a10=0,0,0,0,0,0,0,0,0,0;或者:int a10=0;此时,a0被赋初值0,而其余未赋初值的数组元素均由系统给其赋0。注意,如果写成:int a10=2;则a0被赋初值2,而其余数组元素均由系统给其赋初值0。(2)数组定义时只给前面一部分元素赋初值。例如:int b10=0,1,2,3;定义b数组有10个元素,其中前4个元素赋予了初值,而后6个元素值自动被赋以“0”值(仅对数值型
6、数组)。(3)如果数组的全部元素都设置了初值,则定义中可不指定数组的长度。例如:int a5=1,2,3,4,5;可以写成:int a=1,2,3,4,5;此时,系统会根据花括号“”中的初值个数来确定数组的长度,但是数组的标志“”不能省略。此外,如果提供的初值个数小于希望的数组长度,则方括号中的常量表达式不能省略。例如,需要定义数组a长度为10,但初值前5个为1、2、3、4、5,则不能写成:int a=1,2,3,4,5;而必须写成:int a10=1,2,3,4,5;除了数组初始化之外,通常是通过for语句循环为数组的每一个元素读入数据或者输出数据。例如:int a10,i;for(i=0;
7、i10;i+)scanf(%d,&ai);为数组a的每一个元素输入数据,或者通过下面的for语句输出每一个数组元素的值:for(i=0;i10;i+)printf(%4d,ai);例4.2 已定义数组a如下:int a6=1,2,3,4,5,6;现通过下面两种输出语句来输出数组a中每一个元素的值:(1)printf(%4d,a6);(2)printf(%4d,a);请指出它们的错误并给出正确的输出语句。解 语句(1)只是输出了下标序号为6这个数组元素的值,而没有输出所有数组元素的值,并且数组a只有a0a5这6个数组元素而并不存在a6,所以该语句是错误的。语句(2)输出的变量是数组名a,而a是一
8、个地址常量,它代表数组a的首地址,所以该语句也无法输出所有数组元素值而仅输出了数组a的首地址。正确的输出语句如下:for(i=0;i=5;i+)printf(%d,ai);例4.3 给数组a输入任意一组数据,然后实现数组元素的逆置,最后输出逆置后的数组元素。解 实现数组元素的逆置示意见图4-2。图4-2 实现数组元素的逆置示意因此,对n个数据元素进行逆置的for语句只能循环n/2次。实现逆置的程序如下:#includevoid main()int a20,i,n,x;printf(Input number of elements:);scanf(%d,&n);printf(Input elem
9、ent:n);for(i=0;in;i+)/*输入数据*/scanf(%d,&ai);printf(Before:n);/*输出输入的数据*/for(i=0;in;i+)printf(%4d,ai);printf(n);for(i=0;in/2;i+)/*实现逆置*/x=ai;ai=an-i-1;an-i-1=x;printf(After:n);for(i=0;in;i+)printf(%4d,ai);printf(n);运行结果:Input number of elements:10Input element:1 2 3 4 5 6 7 8 9 10Before:1 2 3 4 5 6 7
10、8 9 10After:10 9 8 7 6 5 4 3 2 1例4.4 用数组实现Fibonacci数列前20项数据的输出。解 在第3章中求Fibonacci数列的方法是每求出两个值时就进行输出,然后继续求后继的两个值。这里,我们每求出一个值就保存于数组f中;当求出所需长度的Fibonacci数列后(已保存于数组f中),再通过for循环输出数组f中保存的Fibonacci数列值。程序编写如下:#includevoid main()int i;int f20=1,1;for(i=2;i20;i+)fi=fi-2+fi-1;for(i=0;i20;i+)if(i%5=0)/*每输出5项换一行*/
11、printf(n);printf(%12d,fi);printf(n);运行结果:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765例4.5 任意输入一个十进制数,将其转换成二进制数并按位保存于数组中,最后输出数组中所保存的二进制数。解 由十进制数转换为二进制数的方法可知:将十进制数每次除2,其余数按先后顺序逆序排列即为该十进制数对应的二进制数。因此,我们采用的方法如下:当十进制数n不等于0时,先对2取余(即“%”),将余数存于数组a中,然后对n除以2,再重复刚才的这两步操作,直到n等于0;这样最终a0、a1、a
12、i-1保存着该十进制数对应二进制数的最低位、次低位、最高位的值。程序编制如下:#includevoid main()int i=0,j,n,a20;printf(Input data:);scanf(%d,&n);while(n!=0)ai=n%2;n=n/2;i+;printf(Output:n);for(j=i-1;j=0;j-)/*二进制数由高位到低位输出*/printf(%4d,aj);printf(n);运行结果:Input data:11Output:1 0 1 1 4.2 二维数组二维数组 4.2.1 二维数组的定义二维数组的定义如果一维数组看做是同一类型变量的一个线性排列,那么
13、二维数组则可认为是同一类型变量的一个平面排列,即行和列。实际上也是这样,二维数组元素有两个下标,一个是行下标,一个是列下标。由于二维数组是多维数组中比较容易理解的一种,并且它可以代表多维数组处理的一般方法,所以,在此主要介绍二维数组。二维数组定义的一般形式如下:类型标识符 数组名常量表达式1常量表达式2;其中,常量表达式1表示第一维的长度(即行数),常量表达式2表示第二维的长度(即列数)。二维数组元素的总数为常量表达式1与常量表达式2的乘积。例如:int a34;定义了一个3行4列的数组,数组名为a,其数组元素的类型为整型,该数组共有34个元素,这些元素排列如下:a00,a01,a02,a03
14、a10,a11,a12,a13a20,a21,a22,a23注意,二维数组的定义不能写成:int a3,4;与一维数组的定义相同,二维数组定义中的两个常量表达式必须是常量,不能是变量。二维数组在内存中是以一维线性方式排列的,并且采用行优先原则:先存储第一行元素,然后在第一行元素之后顺序存储第二行元素,依此类推,直至存储完二维数组中的全部元素。对于定义了3行4列的“int a34;”来说,其内存分配示意如图4-3所示。图4-3 对应“int a34;”的内存分配示意由图4-3可知,数组名a是二维数组a的起始地址,也就是数组元素a00的地址;而a0、a1、a2则分别是二维数组a各行的起始地址;即a
15、0对应数组元素a00的地址、a1对应数组元素a10的地址,而a2则对应数组元素a20的地址。我们可以这样理解,即把二维数组看做是一种特殊的一维数组,这个数组中的每个元素又是一个一维数组。也就是说,我们把二维数组a看做是一个一维数组,它有3个元素a0、a1和a2,而每一个元素又是一个包含了4个元素的一维数组,而a0、a1和a2就是其对应的数组名。因此,a0、a1和a2在二维数组中是数组名(即为一个地址),而决不能当作元素使用,并且a0和a都是指向a00这个数组元素的地址。4.2.2 二维数组的引用和初始化二维数组元素的引用方式为:数组名行下标1列下标2其中,方括号“”中的行、列下标既可以是整型常
16、量也可以是整型表达式。二维数组也必须先定义后使用,并且也只能逐个引用数组元素。二维数组存在着行和列,因此二维数组的行下标是在0到数组行数减1之间变化,而列下标是在0到数组列数减1之间变化。同样,C语言也不对二维数组做越界检查,所以要特别注意。例如,对二维数组的定义:int a22;则a10=5;a01=a11+8;都是正确的,而a12=10;/*列越界*/a0,0=7;/*行下标和列下标都必须放在方括号“”中*/是错误的。二维数组的初始化可以有以下几种方法:(1)按行分段给每个元素赋初值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;这种赋初值方法比较直观,行和列
17、都很清楚。(2)按数组元素在内存中的排列顺序给每个元素赋值。例如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;(3)给部分元素赋初值。当“”中值的个数少于二维数组的元素个数时,只给前面的部分元素赋值,而后面的元素自动取“0”值。例如:int a33=1,2,3,4;它等价于:int a33=1,0,0,2,3,0,4,0,0;(4)给全部元素赋初值。此时定义二维数组的第一维(行)大小可以省略,但第二维(列)大小不能省略。否则无法知道行和列各自的大小。例如:int a4=1,2,3,4,5,6,7,8,9;则系统根据每行放4个元素,放下这9个值必须大于等于9个元素,故需
18、要3行;即二维数组a为3行4列。又如:int a4=1,2,3,1,2,4;对于这种按行分段赋值方式,系统会根据最外面的花括号内有几个花括号“”来确定行数;因此系统认为二维数组a有3行。例4.6 一程序如下:#includevoid main()int x32=0,i;for(i=0;i3;i+)scanf(%d,xi);printf(%d%d%dn,x00,x01,x10);若运行时输入:2 4 6则输出的结果为 。A)200 B)204 C)240 D)246 解 我们知道,x0、x1和x2分别对应二维数组x各行的首地址,即数组元素x00、x10和x20的地址(xi即为&xi0)。所以,语
19、句“scanf(%d,xi);”写法正确(因xi为一地址);这样当输入为“2 4 6”时,相应的数组元素x00的值为2、x10的值为4、x20的值为6,而其余数组元素的值不变仍为“0”。最后,我们得到输出结果应为:204,因此选B。例4.7 定义一个3行4列的二维数组,并逐行输入二维数组元素值,再逐行输出二维数组的元素值。解 我们知道,一维数组元素值的输入输出都是通过一个for语句实现的;而二维数组的输入和输出则需要用两个for语句组成的两层循环来实现,即外层for语句控制行的变化,而内层for语句控制列的变化。实现的程序如下:#includevoid main()int a34,i,j;pr
20、intf(Input data:n);for(i=0;i3;i+)for(j=0;j4;j+)scanf(%d,&aij);printf(Output data:n);for(i=0;i3;i+)for(j=0;j4;j+)printf(%5d,aij);printf(n);运行结果:Input data:1 2 3 45 6 7 89 10 11 12Output data:1 2 3 4 5 6 7 8 9 10 11 12例4.8 输入年、月、日,求这一天是该年的第几天。解 为确定一年中的第几天,需要一张每月的天数表,该表给出每个月的天数。由于二月份的天数因闰年和平年相差一天。所以把月份
21、天数表设计成2行12列的二维数组;数组的第0行给出平年各月份的天数,数组的第1行给出闰年各月份的天数。为了计算某月某日是这年的第几天,则首先确定这一年是平年还是闰年,然后根据各月份的天数表将前几个月的天数与当月的日期累加,就得到了某年某月某日是该年的第几天。程序编制如下:#includevoid main()int days12=31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31;int year,month,day,leap=0,i;printf(Input year、month、day:n);sca
22、nf(%d%d%d,&year,&month,&day);if(year%4=0&year%100!=0)|year%400=0)leap=1;for(i=0;imonth-1;i+)day=day+daysleapi;printf(date=%dn,day);运行结果:Input year、month、day:2010 3 10date=694.3 字符数组和字符串字符数组和字符串 用来存放字符数据的数组被称为字符数组。在C语言中没有专门的字符串类型,而是采用字符数组来存放一串连续的字符。通常使用的字符数组是一维数组(当然也可是多维数组),其数组元素的类型为字符类型;也即,字符数组中的每一个
23、元素存放一个字符。4.3.1 字符数组的定义、引用及初始化字符数组的定义、引用及初始化1.字符数组的定义字符数组本质上与前面介绍的数组相同,只不过它的类型标识符是char类型。字符数组的定义方式如下:char 数组名常量表达式;/*定义一维字符数组*/或者char 数组名常量表达式1常量表达式2;/*定义二维字符数组*/例如:char c5;表示定义了一个一维字符数组,数组名为c,最多可以存放5个字符。如果给字符数组c赋值如下:c0=C;c1=h;c2=i;c3=n;c4=a;则字符数组c的存储如图4-4所示。图4-4 字符数组存放字符后的情况由图4-4可知,字符数组的存储也是占用内存一段连续
24、的空间,其存储及表示方法与前面介绍的数值型数组相同。2.字符数组的引用字符数组的引用不同于数值型数组仅能逐个元素的引用,字符数组既可以逐个元素的引用,又可以通过字符串形式来整体引用。(1)对字符数组元素的引用。对字符数组元素的引用与对数值型数组元素的引用完全相同。字符数组元素的引用方式为:数组名下标其中方括号中“”的下标只能是整型常量或整型表达式。例如:char a10;a0=a;(2)对字符数组的整体引用。例如:char c5=a,b,c;printf(%s,c);在printf语句中,字符数组c是以数组名整体引用的。3.字符数组的初始化如果在定义字符数组时不进行初始化,那么字符数组中各元素
25、的值是不确定的。可以通过下列方法对字符数组进行初始化:(1)逐个为字符数组中的元素赋初值。例如:char s10=P,r,o,g,r,a,m;或者:char c6;c0=C;c1=h;c2=i;c3=n;c4=a;或者:char x10;int i;for(i=0;i10;i+)scanf(%c,&xi);(2)将一个字符串整体赋给一个字符数组。例如:char a=Program;也可以去掉花括号写成:char a=Program;注意,字符串是以空字符0(ASCII码值为0)作为结束标志的。因此,这个空字符也放入了字符数组a,即字符数组a的元素个数是8而不是7。当然,我们也可如下定义字符数组
展开阅读全文