C语言课件08-Array.ppt_第1页
C语言课件08-Array.ppt_第2页
C语言课件08-Array.ppt_第3页
C语言课件08-Array.ppt_第4页
C语言课件08-Array.ppt_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

数组,提纲,数组概述 一维数组 二维数组 字符数组 字符数组的定义、引用和初始化 字符串处理函数 运算符小结,结束,数组概述,数组是一种构造类型。 所谓的构造类型是由基本数据类型按一定规则组成的,也称“导出类型”。 数组由一系列元素构成,这些元素均属同一数据类型。 数组是有序数据的集合,在内存中是连续存放的,数组元素之间的序由其在内存中的前后关系来表现。 可以用一个统一的数组名和下标来唯一地定位数组中的元素。其中,数组名代表了数组在内存中的首地址。,返回,根据数组的组成规则,可分为一维数组、二维数组和多维数组。 C语言中把字符串定义为字符数组,即数组元素为字符型的数组。,一维数组(1):定义,定义形式: 类型 数组名常量表达式; 说明 数组名是标识符,符合标识符命名规则和作用域规则。 常量表达式值表示元素个数,即数组长度。 常量表达式既不能缺省,其中也不能包含变量。C要求在定义数组的时候明确指定数组长度。 示例 int a20; #define MAXLEN 20 int bMAXLEN; int maxlen=20; int cmaxlen, d;,一维数组(2):引用,C语言规定只能逐个引用数组元素而不能一次引用整个数组(如,不能对数组进行整体赋值)。 数组元素引用形式:数组名下标 数组元素引用中的方括号是一个特殊的运算符号下标运算符。 下标运算符的优先级是最高的,所以 +ai 等价于 +(ai) 下标运算符的结合性是从左向右结合。 下标是整型表达式,表达式中可包含变量。原则上说,如果数组的长度为n则下标的范围应该界于0和n-1。但C编译系统没有对下标进行越界检查。 数组定义和数组元素引用的形式相似,但意义不同。 示例,一维数组(3):初始化,要点 定义数组时可对数组元素赋初值。如:int a3=0,1,2; 如果数组没有初始化,系统会用默认值对它初始化。即外部数组或静态数组赋0值,自动数组赋随机值。 初始化可以只针对数组中的前面一部分元素,未初始化的部分元素将自动被初始化为0。如: int a10=0,1,2,3,4;或int a10=0; 如果对全部数组元素赋初始值时,可以不指定数组长度。例如: int a5=0,1,2,3,4; 等价于 int a=0,1,2,3,4; 对数组进行初始化时,不允许初始化的元素个数较已定义的数组长度大,如: int a5=0,1,2,3,4,5;是错的。 问题 两个例子及教材8.1.4、8.1.5、8.1.6,返回,二维数组(1):定义与引用,二维数组的定义 类型 数组名常量表达式1常量表达式2; 例如:float a34;说明了一个3行4列的数组。 C的二维数组事实上是一种特殊的一维数组:每个元素都是一个一维数组的一维数组。 C的二维数组在内存中是按行存放。 引用:数组名下标1下标2 C还允许使用多维数组 类型 数组名常量表达式1常量表达式n; 其元素在内存中的排列顺序是:第一维的下标变化最慢,最后一维的下标变化最快。例如, 已知int a222;则数组a的元素在内存中的排列为:a000a001a010a011a100a101a110a111,二维数组(2):初始化和应用,初始化可以按分行赋初值的方式,也可以按不分行赋初值的方式,分行赋初值程序更清晰。例如: int a34=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; 也可只对部分元素赋初值。例子: int a34=1,5,9; int a34=1,0,6,0,0,11; int a34=1,5,6; int a34=1, ,9; int a34=1,0,9; 如果初始化提供了足够的信息(如,全部初始化或分行初始化),则定义数组时可以省略第一维的长度。 二维数组使用示例(求最值) 例8.2.1(距阵的转置) 例8.2.3(打印杨辉三角)也可以用一维数组实现。,返回,字符数组的定义、引用和初始化(1),字符数组的定义方法和普通数组的定义方式相同。例如:char c10;定义了包含10个元素的字符数组。 对字符数组也可以采用普通数组的初始化方式。例如:char c5=H,e,l,l,o; 也可以定义和初始化一个二维字符数组。 可以使用和与普通数组类似的方式引用字符数组中的元素,得到一个字符。 示例,字符数组的定义、引用和初始化(2),在C语言中,将字符串作为字符数组来处理。 有时,有效字符串的长度和字符数组的长度不相同。为测定字符串的实际长度,C规定了一个“字符串结束标志”,以字符0代表。例如,如果有一个字符串中第一次出现0的是其第10个字符(对应字符数组的第9个元素),则字符串的有效字符为9个。 系统对字符串常量自动加了一个0作为结束符。 可以用字符串常量来使字符数组初始化。例如, char c =“Hello”; 或 char c =“Hello”; 应该注意到,这样初始化,数组c的长度是6,等价于 char c6=H, e, l, l, o, 0; 字符数组并不要求最后一个字符为0。 输入输出可以使用%c逐个字符处理,也可以用%s整体处理。,返回,字符串处理函数(1):输出,使用printf 用“%s”格式符。 对应的输出项是字符数组名。 例如:char str=“Hello World!“; printf(“%s“, str); 输出过程会在遇到第一个0时停止。 例如:char str=“Hello0World!“; printf(“%s“, str); puts 原型:#include int puts (const char * s); 说明:将一个以0结束的字符序列输出到终端。 注意,puts输出时,将字符串结束标志0转换成n。,字符串处理函数(2):输入,使用scanf 用“%s”格式符 对应的输入项是字符数组名。不必加上 说明:从终端输入一个字符串到字符数组string中,输入的结束标志是回车,最后换行符将转化为0。 返回值:string的起始地址。 gets与scanf的区别是其能接受带空格的字符串。,字符串处理函数(3),原型:#include char * strcpy (char * dest, const char * src); 说明:将字符串src复制到字符数组dest中 注意:字符数组dest必须定义得足够大。 字符串复制绝对不能用简单赋值(=)的形式。 原型:#include int strcmp (const char * s1, const char * s2); 说明:比较字符串s1和s2,其比较规则就是,自左向右逐个比较对应字符,直到出现不同的字符或遇到0。全部相同则返回0,否则返回第一对不同字符之间的差值。 注意:比较字符串不能用简单比较(=)的形式。 原型:#include int strlen (const char * s); 说明:测试字符串s长度,不计字符串最后的0。,字符串处理函数(4),原型:#include char * strcat (char * dest, const char * src); 说明:连接两个字符数组中的字符串,将字符串src接到字符串dest之后,并将结果放在字符数组dest中。 注意:字符数组dest必须足够长。 字符串dest结束标志将被删除。 原型:#include char * strlwr (char * s); 说明:将字符串s中的大写字母转换成小写字母,其他字符不变。 原型:#include char * strupr (char * s); 说明:将字符串s中的小写字母转换成大写字母,其他字符不变。 例见8.3.1 、8.3.2、8.3.3,返回,运算符小结,返回,示例:一维数组的引用,void main () int i, a10; for (i=0; i=0; i-) printf (“%d “, ai); printf(“n“); ,返回,注意到,对数组元素的引用(如ai)即可以作为左值,也可以作为右值。,问题:一维数组的初始化,下面诸组程序片段是否等价?,返回,示例:Fibonacci数列问题,Fibonacci数列的定义如下: 1 n=1 Fn= 1 n=2 Fn-1+Fn-2 n3 打印Fibonacci数列前20项 void main() int f1,f2; int i; f1=1; f2=1; for (i=1;i=10;i+) printf (“%12d %12d “,f1,f2); if (i%2=0) printf (“n“); f1=f1+f2; f2=f1+f2; ,打印Fibonacci数列前20项 void main () int i,f20=1,1; for (i=2;i20;i+) fi=fi-1+fi-2; for (i=0;i20;i+) if (i%5=0) printf (“n”); printf (“%12d”,fi); ,示例:起泡法排序,void main() int a10; int i,j,t; printf(“intput 10 numbers:n“); for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; printf(“the sorted numbers:n“); for(i=0;i10;i+) printf(“%d “,ai); printf(“n“); ,返回,这个程序还可以改进:如果一轮两两比较下来没有发生元素交换,则停止下一轮的比较。,示例:二维数组的使用,求一个34的矩阵中最大的元素。 void main() int a34=1,2,3,4, 9,8,7,6, -10,10,-5,2; int i,j; int row=0,colum=0,max=a00; for(i=0;imax) max=aij; row=i; colum=j; printf(“max=%d, row=%d, colum=%dn“, max, row, colum); ,返回,请注意体会在若干个数中寻找最大(小)值的一般做法: (1) 假设第一个元素为所求,将其值记录为当前最大(小)值 (2) 从第二个(或第一个)元素起,逐个判断,如果发现它比当前最大(小)值大(小),则将其值记录为新的当前最大(小)值,示例:字符数组按逐个字符输出,void main() char c5=H,e

温馨提示

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

评论

0/150

提交评论