




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第六章 数组,主要内容 6.1 数组概述 6.2 一维数组 6.3 二维数组 6.4 字符数组 6.5 综合应用举例 重点 熟练掌握一维数组和字符数组的定义和引用,掌握用数组方法实现排序算法、查找方法; 深刻理解一维的字符数组与字符串之间的关系,比较熟练地掌握使用一维字符数组来处理字符串。,2,6.1 数组概述,在许多数学问题中,经常遇到数列和矩阵的概念。 数列和矩阵是用来描述一批数据之间的关系的。 表示x数列时通常写成: x1,x2,x3,xn 表示一个23矩阵y可以写成:,位置号,行号,列号,3,分析数列和矩阵不难发现它们有三个特点: 有一批数据; 这些数据之间有一定的内在联系; 这些数据的类型相同。 C语言中用数组来表达数列和矩阵。,数组名,数列名 (如x数列),矩阵名 (如y矩阵),下标用一个数表示,下标用两个数表示,一维数组,二维数组,x2,y13,x2,y13,4,不用数组时,要处理下面的两个问题会感到相当困难: 将输入的50个数逆序输出。 把输入的30个成绩中高于平均分的成绩输出。 数组的定义: 所谓数组是指一组有序数据的集合,用一个统一数组名标识这一组数据,用下标来指示数组中元素的位置(序号)。 数组是最简单的一种构造类型,其数组元素为同一类型, 既可以为简单类型(如整型、实型、字符型等), 也可以是构造类型。,5,6.2 一维数组,一维数组的定义 语法格式为:类型符 数组名元素个数; 例如: int a5; 定义了一个数组a,每个元素的类型为int,可以称a为整型数组。它有5个元素: a0 a1 a2 a3 a4 又如: float x2*5; /* Ok */ char sn; /* Error */,常量或 常量表达式,第一个元素的下标为 0,最后一个元素的下标为 元素个数-1,6,一维数组的引用 一般的引用格式为:数组名下标 如:n=4; a0=3*a3-an-2; 数组元素实际上的一种带下标的变量(简称下标变量),它与简单变量(不带下标的变量)在使用上并无不同。 请比较: int m,n,p,a5; m=10; a2=5; n=2*m; a1=a2*3; scanf(“%d“,可以为常量、变量、表达式,7,引用数组元素更常用的形式:ai 若i=0,aia0 若i=1,ai a1 用这种方式可以访问数组中的所有元素,这称为数组的“遍历“。 遍历数组时是通过循环来改变下标的。 例6.1 将输入的5个数逆序输出。 读入:for(i=0;i=0;i-) printf(“%3d“,ai);,8,例6.1 将输入的5个数逆序输出。,main() int a5,i; for(i=0;i=0;i-) printf(“%3d“,ai); printf(“n“); ,注意:1、循环控制变量的初值、终值及控制条件。 2、不能整体输出数组,例:printf(“%d“,a);是错误的。,9,一维数组的初始化 在定义数组时给元素赋初值。一般语法为: 类型符 数组名元素个数=常量表; 如: int a5=1,2,3,4,5; 编译系统为数组的所有 元素顺序分配存储单元。 初始化时是把常量表中 的常量按内存分配顺序 依次存入相应的数组元 素。,1,2,3,4,5,10,说明:,若给所有元素赋初值,“元素个数“可以省略。如:int a =1,2,3,4,5; 可以只给一部分元素赋初值,但元素个数不能省略。未被赋初值的元素则为0。如: int a5=1,2,3; 若使全部元素都为0,可以将其定义为“全局变量“或“静态变量“ ,也可以写成:int a5=0; 若数组在定义时未进行初始化,则各元素的值是随机的。如: int a5;,5,0,0;,0,0,0,0;,=?,?,?,?,?;,例 数组b在定义时未进行初始化,#include main() int i,a5=3,4,5,b5; printf(“narray a is:“); for(i=0;i5;i+) printf(“%6d“,ai); printf(“narray b is:“); for(i=0;i5;i+) printf(“%d,“,bi); ,11,12,一维数组的程序举例 例6.2 求输入的10个数据之和。 main() int a10,sum=0,i; for(i=0;i10;i+) scanf(“%d“, 练习:把输入的30个成绩中高于平均分的输出,13,例6.3 找出输入的5个数据中的最大值及所在位置。 分析: 设a0的值最大; i=1; imax, 则aimax,i p i+;,5,2,7,9,6,0 1 2 3 4 5,a,max,i,p,5,7,9,max,p,14,例6.3 找出输入的5个数据中的最大值及所在位置。,main() int a5,max,p,i; for(i=0;i5;i+) scanf(“%d“, ,15,例6.4 输出Fibonacci数列的前20项,每行5个数据。 分析: fab0=fab1=1; 使n=219 fabn=fabn-1+fabn-2;,16,例6.4 输出Fibonacci数列的前20项,每行5个数据。,main() int fab20=1,1,n; for(n=2;n20;n+) fabn=fabn-1+fabn-2; for(n=0;n20;n+) if(n%5=0)printf(“n“); printf(“%12d“,fabn); ,17,6.3 二维数组,二维数组的定义 一般形式为:类型符 数组名行数列数; 例如:int b23; 定义了一个23的整型数组b,它有2行、 3列共6个元素。这6个元素为: b00 b01 b02 b10 b11 b12,18,多维数组的定义格式为: 类型符 数组名元素长度1元素长度2元素长度n; 如:int x234,y42310; x为三维数组,y为四维数组。,19,二维数组的引用 一般格式为:数组名行下标列下标 如:a12=a01+a2*2-38/5; 由于二维数组有两个下标,要遍历二维数组一般得用双重循环完成。通常外层的循环变量控制行下标,而内层的循环变量控制列下标。 例6.5 将下列矩阵存入二维数组中,并输出。 分析: for(i=0;i2;i+) for(j=0;j3;j+) scanf();,注意:行、列下标不要越界,控制行,控制列,20,例6.5 将下列矩阵存入二维数组中,并输出。,main() int i,j,a23; for(i=0;i2;i+) for(j=0;j3;j+) scanf(“%d“, ,21,例6.6 找出一个34矩阵中的最大元素及所在位置。 main() int a34,i,j,max,row,col; for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d“, ,存放最大值,最大值所在的行,最大值所在的列,假设第一个元素最大,row=0; col=0;,该程序有何问题?,22,二维数组的初始化,在定义二维数组时给元素赋初值。一般语法为: 类型符 数组名行数列数=常量表; 如:int a23=1,2,3,4,5,6; 即先存入第一行的数据, 再存第二行的数据。把这 种存储方式称为“按行存储“ 方式。,1,2,3,4,5,6,23,说明:,若给所有元素赋初值,“行数“可以省略,但“列数“不能省。 如:int a 3=1,2,3,4,5,6; 可以采用分行赋值,以增加程序的可读性。 如:int a 3=1,2,3,4,5,6; 可以只给一部分元素赋初值,未被赋初值的元素则为0。 如:int a 3=1,2,3; 若数组在定义时未进行初始化,则各元素的值是随机的。,2,0,3,0,0;,24,二维数组也可以当成一维数组看待,每一个元素的类型又是一维数组。 例如:int b23; b数组的元素为: b00 b01 b02 b10 b11 b12,a,b0,b1,25,二维数组的程序举例,例6.7 将32矩阵转置,如下由A矩阵转置后得B矩阵。 分析:,0,0,1,4,2,5,3,6,0,0,0,1,1,0,1,0,0,1,1,1,1,1,2,0,0,2,2,1,1,2,i,j,j,i,26,例6.7 将32矩阵转置,如下由A矩阵转置后得B矩阵。,main() int a32=1,4,2,5,3,6; int b23,i,j; for(i=0;i3;i+) for(j=0;j2;j+) bji=aij; for(i=0;i2;i+) for(j=0;j3;j+) printf(“%4d“,bij); printf(“n“); ,27,例6.8 求44矩阵的主对角线元素之和。 4 8 7 6 1 3 5 7 2 6 9 4 5 1 2 3 分析: 主对角线是指行号与列号相同的那些元素。 for(i=0;i4;i+) for(j=0;j4;j+) if(i=j)sum=sum+aij;,for(i=0;i4;i+) sum=sum+aii;,28,例6.8 求44矩阵的主对角线元素之和。,方法1:使用双重循环求和 main() int a44,i,j,sum=0; for(i=0;i4;i+) for(j=0;j4;j+) scanf(“%d“, ,29,6.4 字符数组,若有:char s5; 则称s为字符数组。 字符数组中每一个元素存放的是char型数据,所以可以象处理普通字符型变量一样,来处理字符数组元素。如: char s10; int i; for( i=0;i10;i+) si=getchar(); for( i=0;i10;i+) putchar(si); 字符数组还有它的特殊性。,30,一、字符数组与字符串的关系,字符串 “China“的存储方式: 若有:char s =C,h,i,n,a; 其存储方式为: 既然此时初始化是为了提供一个字符串,C允许写成下面更简单的形式:char c =“China“; 甚至:char c =“China“;,0;,字符数组s中存放的是一个字符串!,31,通常情况下,初始化时我们是把一个常量送给一个变量,并且它们的类型是一致的。如: int p=10; 对于: char s =“China“; 实际上,数组名是常量,表示数组的开始地址,与传统的字符串变量还是有区别的。,整型变量,整型常量,字符串变量,字符串常量,一维字符数组相当于字符串变量,32,二、字符数组的输入与输出,普通的数组处理方式 当字符数组中存储的字符不是以0结束时,只能像普通的数组那样,一个元素一个元素的处理。如: char c5; /* 输入*/ for(i=0;i5;i+) scanf(“%c“,33,当字符数组中存储的字符是以0结束的,也可以像普通的数组那样,一个元素一个元素的处理。如: char c = “China“; for(i=0;ci!=0;i+) printf(“%c“,ci); 由于循环的条件与数组中元素的个数无关,这已经比前面的处理灵活多了。,“I love China“;,34,字符数组的整体处理方式 当用字符数组处理字符串时,可以与“%s“格式字符配合,完成字符串的输入输出。 输出字符串 char c =“China“; printf(“%s“,c);,此写法与 for(i=0;ci!=0;i+) printf(“%c“,ci); 功能完全等价,输出项为数组名,不能是数组元素,如写成c0是错误的。,“abc0xyz“ ;,35,输入字符串 如有: char c80; scanf(“%s“,c); 当输入: China 当输入:How are you? ,输入项c是字符数组名,此时不能再加地址运算符“&“。,36,三、字符串处理函数,其它程序设计语言处理字符都比较方便,如: a=“China“ /* 字符串赋值 */ “abc“ABC“ /* 字符串比较 */ “abc“+“defg“ /* 字符串连接 */ 在C语言中这些操作都不能直接完成。 处理字符串通过库函数来完成。 在程序开头将字符串库文件包含到程序中: #include ,37,1、输出字符串函数,格式:puts(字符串表达式) 功能:将“字符串表达式“输出后并换行。 如:char str = “China“; puts(str); 输出:China _,与 printf(“%sn“,str); 完全等价,38,2、输入字符串函数,格式:gets(字符串变量) 功能:将键盘输入的一行字符串存入“字符串变量“中,当输入回车时才认为字符串输入结束,这就解决了scanf()函数不能接收带空格的字符串的问题。 如:char str80; gets(str); puts(str); 运行:How are you? How are you?,39,3、字符串复制函数,格式:strcpy(字符串变量,字符串) 功能:将“字符串“复制到“字符串变量“中,字符串变量的空间必须足够大。 如:char str80; strcpy(str, “China“); puts(str); 输出:China 注意:字符串不能直接送字符串变量,即: str= “China“; /* Error */,40,4、字符串连接函数,格式:strcat(字符串变量,字符串) 功能:将“字符串“连接到“字符串变量“的后面,字符串变量的空间应足够大。 如:char str80= “I love “; strcat(str, “China“); puts(str); 输出:I love China 注意:C语言中不能使用“+“完成字符串的连接,即: str=str+ “China“; /* Error */,41,5、字符串比较函数,格式:strcmp(字符串1,字符串2) 功能:完成“字符串1“与“字符串2“的关系比较,即对两个字符串自左至右逐个字符按其ASCII码值相比,直到出现不同的字符或遇到0为止。比较的结果由函数值获得: 如果“字符串1“=“字符串2“,函数值为0; 如果“字符串1“字符串2“,函数值为一正数; 如果“字符串1“0)x=y;,42,6、测字符串长度函数,格式:strlen(字符串) 功能:得到“字符串“的长度。 字符串长度: 是指双引号括起来的字符个数 或,0前面字符的个数 或,0所在的下标位置 如:char str80= “abcd“; printf(“%d“,strlen(str); 结果:4,43,7、小写字符转换为大写字符串函数,格式:strupr(字符串) 功能:将字符串中的小写字母换为大写字母。 如:printf(“%s“,strupr(“China“); 结果:CHINA,44,8、大写字符转换为小写字符串函数,格式:strlwr(字符串) 功能:将字符串中的小写字母换为大写字母。 如:printf(“%s“,strlwr(“China“); 结果:china,45,例6.9 将一个字符串复制到另一个字符串中,即完成strcpy函数的功能。 分析:把源字符串中的字符一个一个地传送(赋值)到目标字符数组中对应位置,直到遇到了字符串结束标志0:,四、字符数组的程序举例,46,思路1先判断后赋值。,A,B,C,不是0,是0,47,思路2先赋值后判断。,A,B,C,不是0,0,是0,48,例6.10 用冒泡法对10个数排序,第1次, a0和a1比较,9 8 5 4 2 0 6 1 3 7,8 9 5 4 2 0 6 1 3 7,8 5 9 4 2 0 6 1 3 7,8 5 4 9 2 0 6 1 3 7,8 5 4 2 9 0 6 1 3 7,8 5 4 2 0 9 6 1 3 7,8 5 4 2 0 6 9 1 3 7,8 5 4 2 0 6 1 9 3 7,8 5 4 2 0 6 1 3 9 7,8 5 4 2 0 6 1 3 7 9,第2次, a1和a2比较,第j次, aj和aj+1比较,9 8,9 5,9 4,9 2,9 7,for (j=0;jaj+1) temp=aj; aj=aj+1; aj+1=temp;,6.5 综合应用举例,49,从第一个元素开始,两两比较,较大的一个放在后面 for (j=0;jaj+1) temp=aj,aj=aj+1;aj+1=temp; 第一次循环后,最大的在最后. 8 5 4 2 0 6 1 3 7 9 第二次循环 for (j=0;jaj+1) temp=aj,aj=aj+1;aj+1=temp;,50,如果有n个元素,一共要比较n-1次(外循环次数) 在第j次比较时,需要从0比较到n-i #include “stdio.h” main() int a10=9,8,5,4,2,0,6,1,3,7,i,n=10; for (i=0;iaj+1) temp=aj,aj=aj+1;aj+1=temp; for
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论