C语言程序设计实用教程 教学课件 ppt 作者 杨旭 王爱赪 关昀 徐庆 第4章

上传人:E**** 文档编号:89347311 上传时间:2019-05-23 格式:PPT 页数:26 大小:433.50KB
返回 下载 相关 举报
C语言程序设计实用教程 教学课件 ppt 作者  杨旭 王爱赪 关昀 徐庆 第4章_第1页
第1页 / 共26页
C语言程序设计实用教程 教学课件 ppt 作者  杨旭 王爱赪 关昀 徐庆 第4章_第2页
第2页 / 共26页
C语言程序设计实用教程 教学课件 ppt 作者  杨旭 王爱赪 关昀 徐庆 第4章_第3页
第3页 / 共26页
C语言程序设计实用教程 教学课件 ppt 作者  杨旭 王爱赪 关昀 徐庆 第4章_第4页
第4页 / 共26页
C语言程序设计实用教程 教学课件 ppt 作者  杨旭 王爱赪 关昀 徐庆 第4章_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《C语言程序设计实用教程 教学课件 ppt 作者 杨旭 王爱赪 关昀 徐庆 第4章》由会员分享,可在线阅读,更多相关《C语言程序设计实用教程 教学课件 ppt 作者 杨旭 王爱赪 关昀 徐庆 第4章(26页珍藏版)》请在金锄头文库上搜索。

1、第4章数组与字符串,本章要点 4.1 数 据 排 序 4.2 矩 阵 转 置 4.3 字 符 分 析 习题 3,4.1 数 据 排 序,4.1.1 数组的概念 在前面的学习中,我们学过的数据类型都是简单数据类型,它们的特点是,一个该类型的变量只能对应一个数据,针对单一的变量进行操作,变量名与变量值是一一对应关系。 在程序设计中,有时需要对一组同样类型的数据进行操作。以字符串为例,C语言没有字符串型数据,一个字符串也就是若干个存储在连续空间中的字符,它们相互间有着一定的关系,在设计程序时并不一定能够确定具体要进行操作的数据的个数(字符串长度不确定),当然,也就不能事先定义出相应个数的变量与数据进

2、行一一对应,而且,就算是能定义相应个数的变量也会因为变量名太多而造成程序的混乱,且将这些数据间的关系割裂开来,这不是一种好方法。 C语言提供了这样的一种数据类型:它可以连续存放多个相同类型的数据,可以用同一个变量名对这些数据进行存取,并且可以用一种有效的方法在变量中对各个数据进行单独的操作使用具体的下标索引,第一个数据对应下标0,第二个数据对应下标2第n个数据对应下标n1,这就是数组,使用数组就能够有效地完成上述要求。,4.1 数 据 排 序,数组是一组具有相同数据结构的元素组成的有序的数据集合,一个数组中可以包含若干个相同类型的数据。 组成数组的数据统称为数组元素,数组用一个统一的名称来标识

3、这些元素,这个名称就是数组名。数组中,对数组元素的区分使用一个特定的序号数组下标来实现,可以用数组下标来方便地存取每一个数组元素。 在C语言中,数组的下标以0开始,如果有一个包含n个元素的数组,则第1个元素对应下标为0,第2个元素对应下标为1第n个元素对应的下标为n1。 数组是一种构造类型的数据,它是由其他数据类型构造成而得到。 与基本数据类型变量一样,数组变量也需要先定义、后使用。在定义数组变量时,系统会为数组在内存中分配一块连续的空间进行存储,空间的大小由数组的类型和大小而定。 例如,定义一个包含100个整型元素的数组,由于每个整型数据将占2个字节,则系统会为该数组分配2*100=200字

4、节的空间以供使用。,4.1 数 据 排 序,4.1.2 一维数组 1一维数组的定义 在C语言程序设计中,数组可以具有多个下标,数组下标的个数称为数组的维数。只有一个下标的数组称为一维数组。 一维数组的定义方式如下: 类型 数组名常量表达式; 下面是有效的数组定义: int a10; char str50; 语句“int a10”定义了数组名为a的整型数组,该数组共有10个元素。这些元素分配在连续的内存中,每个元素都可以存储一个整型值,则数组a所占的总内存大小为210=20字节。 同样,语句“char str50”定义了一个数组名为str的字符数组,该数组共有50个元素。这些元素分配在连续的内存

5、中,每个元素都可以存储一个字符,则数组str所占的总内存大小为150=50字节。,4.1 数 据 排 序,C语言中规定数组下标从0开始,如果定义了一个有n个元素的数组,则下标为0n1。因此,数组a和数组str各元素分别为: a0,a1,a2,a8,a9 str0,str1,str2,str48,str49 定义数组下标的常量表达式中只能是整型常量,可以是整型数值常量或符号常量,例如: #define n 100 int m100; char strn; 上面是正确的定义方法。 尤其要注意不能用变量来作为数组定义时的下标,例如,下面定义就是错误的定义: int n=100; char strn;

6、 /*错误的定义*/,4.1 数 据 排 序,2一维数组的初始化 数组在定义时,可以为其赋初始值。赋值方式如下: 类型 数组名常量表达式=数值1,数值2,; 赋值时,将数值以逗号分开,按顺序将值赋给数组元素。例如: int a5=5,12,13,27,32; 上面的语句定义了一个具有5个元素的整型数组a,其中a0=5,a1=12,a4=32。 如果在定义时为数组元素赋初值,且所赋值的元素个数少于下标定义的元素个数,对于整型(或实型)数组,系统会对未赋值元素自动赋值为0;对于字符型数组,系统会对未赋值元素自动赋值为空(0)。 如果所赋值的个数多于下标定义的元素个数,则系统会报错。 此外,如果赋值

7、元素的个数就是所需要的数组元素的个数,则定义时的数组下标可以省略,例如,下面的语句将定义一个包含一年中各月天数的数组。 int month=31,28,31,30,31,30,31,31,30,31,30,31; 由于一年中只有12个月,所需要的数组元素只有12个,且花括号中正好也包含了12个数据,因此可以省略数组的下标。上述定义中,将month定义为含有12个元素的数组,其数组元素分别为month0=31,month1=28,month11=31。,4.1 数 据 排 序,下面列出的,都是正确的定义数组时赋初值的方法: int a5=1,2,3,4; /* 数组元素a0=1,a1=2, a2

8、=3,a3=4, a4=0 */ char s5=a,b, c; /* 数组元素s0=a,s1=b, s2=c,s3=0,s4= 0 */ int m=1,2,3,4,5; /* 定义m为有5个元素的数组,m0=1,m1=2, m2=3,m3=4, m4=5 */ 数组在程序设计中是一种非重要的数据类型,它在内存中按元素的先后顺序进行存储,设有如下定义的数组: int a10=1,2,3,4,5,6,7,8,9,10; 假设该数组在内存中的首地址为1000,由于是整型数据,每个数据占两个字节,则各元素在内存中的位置如图4-1所示。,图4-1 一维数组在内存中的存储方式,4.1 数 据 排 序,

9、3一维数组的引用 对数组进行访问时,只能对数组的某一个元素进行单独的访问,而不能对整个数组的全部数据进行访问。数组元素的引用形式如下: 数组名下标 这里的下标可以是一个整型常量,也可以是一已赋值的整型变量、整型值表达式或整型符号常量。 例如: int a5,n; n=3; a0=1; a1=2; a2=3; an=an-1+an-2; 执行上述代码后,a3的值将为a2+a1=5。 需要注意的是,数组名a并不能代表整个数组的具体值,它只代表数组在内存中的首地址,即代表数组元素a0在内存中的地址。如果此时用“a=10”这样的语句引用数组,则会出现错误。,4.1 数 据 排 序,数组名在程序中不能改

10、变,即对于数组a,不能有a+或a=n之类的语句。 由于数组下标连续递增的特点,对数组的引用通常用for循环来实现。 例如: int a10,k; for(k=0;k10;k+) ak=0; 上面的循环执行后,将为数组a的所有元素赋值为0。 在这里有一点需要特别注意:C语言本身不会对数组做边界检查,即不会检查下标值是否在规定的范围内,如果程序运行中下标值超出范围,将对数组以外邻近的内存单元进行操作,这样会具有相当的危险性,甚至会引起整个系统的崩溃。因此,要求程序设计者在设计时对边界做必要的检查,以保证下标不会超出边界。,4.1 数 据 排 序,例如:对于上面的程序段,如果稍有疏忽,写成下面的形式

11、: int a10,k; for(k=0;k=10;k+) ak=0; 由于数组a的下标最大只能为9,这里的k最大可以是10,因此在为ak(k=10)赋值时已超出了数组边界,将会破坏数组所占内存空间邻近存储单元的数据,产生无法预料的后果。,4.2 矩 阵 转 置,4.2.1 多维数组 在程序设计中,除了使用上一节所讲的线性结构数据外,还常常用到矩阵形式的数据,例如,二维表格,数学矩阵等。为了解决这样的问题,C语言为之提供了二维数组和多维数组。 C语言中,由两个下标来确定元素的数组称为二维数组,由三个以上下标来确定元素的数组称为多维数组。 二维数组定义方式如下: 类型 数组名常量表达式1常量表达

12、式2; 从定义上看,二维数组相对于一维数组多了一个下标,即多了一维。 二维数组可以看成一个矩阵,如: int a34; 可以看作如图4-6所示的3行4列矩阵。 从图中可以看到,二维数组的第一维决定矩阵的行数,第二维决定矩阵的列数。 从结构上来说,二维数组a34可以视为有3个元素(a0、a1、a2)的一维数组,这个一维数组的每个元素又是一个有4个元素的一维数组。,4.2 矩 阵 转 置,图4-6 二维数组的矩阵排列方式,4.2 矩 阵 转 置,可以在定义时以二维数组赋初值,对二维数组元素赋初值方法与一维数组类似。 例如: int a34=1,2,3,4,5,6,7,8,9,10,11,12; 使

13、用上面的语句对数组赋值后,各数组元素如图4-7所示。,图4-7 二维数组的赋值,4.2 矩 阵 转 置,此外,也可以按行赋值,例如: int a34=1,2,3,4, 5,6,7,8, 9,10,11,12; 上面的语句执行后数组元素的内容同前一种定义方法完全相同。 如果在为数组赋初值时,没有足够的数据赋给数组元素,则未赋值的数组元素值为0(对于整型/实型数组)或0(对于字符数组),例如: int a34=1,2,3,4, 5,6,7,8; char s23= a, b, c, d, e, f;,4.2 矩 阵 转 置,以上定义等价于下面的数组定义: int a34=1,2,3,4, 5,6,

14、7,8; 0,0,0,0; char s23= a, b, 0, c , 0, 0, d, e, f; 当定义二维数组时,可以省略第一位下标,以赋值时的实际数据个数来决定第一位下标值,例如: int a4=1,2,3,4, 5,6,7,8, 9,10,11,12; 该语句与前面的“int a34=1,2,3,4,5,6,7,8,9,10,11,12”具有同样的结果。,4.2 矩 阵 转 置,值得注意的是,定义二维数组(或多维数组)时,可以且只能省略第一位下标,下面的定义是错误的定义: int a=1,2,3,4, 5,6,7,8, 9,10,11,12; int b3=1,2,3,4, 5,6

15、,7,8, 9,10,11,12; 从本质上来说,二维数组可以理解为一维数组的一维数组,即二维数组也是一个特殊的一维数组,这个数组的每一个元素都是一个一维数组。从这个概念推广开来,N维数组就是每个元素为N1维数组的一维数组。理解了二维数组,多维数组也就好理解了。 多维数组定义的方法如下: 类型 数组名常量表达式1常量表达式2常量表达式n; 如果要定义一个三维数组,可按下面方法定义: int a101010; 上面的语句定义了一个有1 000个元素的三维数组,可以看到,数组元素的个数是按维数呈级数增长的,因此,在程序中,使用得最多的通常都是一维数组和二维数组,定义的数组最好不要超过三维,以免占用太多的内存空间。,4.2 矩 阵 转 置,4.2.2 多维数组的引用 对二维数组的引用也和一维数组相似,只能对单个元素

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号