




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 数组,C语言程序设计,第六章 数组,本章主要内容: 6.1 数组概述 6.2 一维数组 6.3 二维数组 6.4 用字符数组处理字符串 6.5 综合应用举例 本章作业 本章重点: 熟练掌握一组数组和字符数组的定义和引用,掌握用数组方法实现排序算法、查找方法; 深刻理解一维的字符数组与字符串之间的关系,并比较熟练地掌握使用一维字符数组来处理字符串。,C语言程序设计,6.1 数组概述,在许多数学问题中,经常遇到数列和矩阵的概念。数列和矩阵是用来描述一批数据之间的关系的。如: 表示x数列时通常写成: x1,x2,x3,xn 表示一个23矩阵y可以写成:,数组,位置号,行号,列号,C语言程序设
2、计,分析数列和矩阵不难发现它们有三个特点: 有一批数据; 这些数据之间有一定的内在联系; 这些数据的类型相同。 C语言中用数组来表达数列和矩阵。,数组名,数列名 (如x数列),矩阵名 (如y矩阵),下标用一个数表示,下标用两个数表示,一维数组,二维数组,x2,y13,x2,y13,数组,C语言程序设计,不用数组时,要处理下面的两个问题你会感到相当困难: 将输入的50个数逆序输出。 把输入的30个成绩中高于平均分的成绩输出。 所谓数组是指一组有序数据的集合,用一个统一数组名标识这一组数据,用下标来指示数组中元素的位置(序号)。 数组是最简单的一种构造类型,其数组元素为同一类型,既可以为简单类型(
3、如整型、实型、字符型等),也可以是构造类型。,数组,C语言程序设计,6.2 一维数组,一维数组的定义 语法格式为:类型符 数组名元素个数; 例如:int a5; 定义了一个数组a,每个元素的类型为int,可以称a为整型数组。它有5个元素: a0 a1 a2 a3 a4 又如: float x2*5;/* Ok */ char sn;/* Error */,数组,常量或 常量表达式,第一个元素的下标为 0,第后一个元素的下标为 元素个数-1,C语言程序设计,一维数组的引用 一般的引用格式为:数组名下标 如:n=4; a0=3*a3-an-2; 数组元素实际上的一种带下标的变量(简称下标变量),它
4、与简单变量(不带下标的变量)在使用上并无不同。 请比较: int m,n,p,a5; m=10;a2=5; n=2*m;a1=a2*3; scanf(“%d”,数组,可以为常量、变量、表达式,C语言程序设计,引用数组元素更常用的形式:ai 若i=0,aia0 若i=1,ai a1 用这种方式可以访问数组中的所有元素,这称为数组的“遍历”。 遍历数组时是通过循环来改变下标的。 例6.1 将输入的5个数逆序输出。 读入:for(i=0;i=0;i-)printf(“%3d”,ai);,数组,C语言程序设计,一维数组的初始化 在定义数组时给元素赋初值。一般语法为: 类型符 数组名元素个数=常量表;
5、如: int a5=1,2,3,4,5; 编译系统为数组的所有 元素顺序分配存储单元。 初始化时是把常量表中 的常量按内存分配顺序 依次存入相应的数组元 素。,数组,1,2,3,4,5,C语言程序设计,说明:,若给所有元素赋初值,“元素个数”可以省略。如: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;
6、,=?,?,?,?,?;,C语言程序设计,一维数组的程序举例 例6.2 求输入的10个数据之和。 main() int a10,sum=0,i; for(i=0;i10;i+) scanf(“%d”, 练习:把输入的30个成绩中高于平均分的输出,数组,C语言程序设计,例6.3 找出输入的5个数据中的最大值及所在位置。 分析: 设a0的值最大; i=1; imax, 则aimax,i p i+; 思考: 1、不使用max变量而使程序完成同样的功能。 2、把找到的最大值与第一个数据互换位置。,数组,5,2,7,9,6,0 1 2 3 4 5,a,max,i,p,5,7,9,max,p,Back,C
7、语言程序设计,例6.4 输出Fibonacci数列的前20项,每行5个数据。 分析: fab0=fab1=1; 使n=219 fabn=fabn-1+fabn-2;,数组,C语言程序设计,6.3 二维数组,二维数组的定义 一般形式为:类型符 数组名行数列数; 例如:int b23; 定义了一个23的整型数组b,它有2行、3列共6个元素。这6个元素为: b00 b01 b02 b10 b11 b12,数组,C语言程序设计,多维数组的定义格式为: 类型符 数组名元素长度1元素长度2元素长度n; 如:int x234,y42310; x为三维数组,y为四维数组。,数组,C语言程序设计,二维数组的引用
8、 一般格式为:数组名行下标列下标 如:a12=a01+a2*2-38/5; 由于二维数组有两个下标,要遍历二维数组一般得用双重循环完成。通常外层的循环变量控制行下标,而内层的循环变量控制列下标。 例6.5 将下列矩阵存入二维数组中,并输出。 分析: for(i=0;i2;i+) for(j=0;j3;j+) scanf();,注意:行、列下标不要越界,控制行,控制列,数组,C语言程序设计,例6.6 找出一个34矩阵中的最大元素及所在位置。 main() int a34,i,j,max,row,col; for(i=0;i3;i+) for(j=0;j4;j+)scanf(“%d”, 该程序有何
9、问题吗?,数组,存放最大值,最大值所在的行,最大值所在的列,假设第一个元素最大,row=0;col=0;,C语言程序设计,三、二维数组的初始化,在定义二维数组时给元素赋初值。一般语法为: 类型符 数组名行数列数=常量表; 如:int a23=1,2,3,4,5,6; 即先存入第一行的数据, 再存第二行的数据。把这 种存储方式称为“按行存储” 方式。,1,2,3,4,5,6,数组,C语言程序设计,说明:,若给所有元素赋初值,“行数”可以省略,但“列数”不能省。如:int a 3=1,2,3,4,5,6; 可以采用分行赋值,以增加程序的可读性。 如:int a 3=1,2,3,4,5,6; 可以只
10、给一部分元素赋初值,未被赋初值的元素则为0。 如:int a 3=1,2,3; 若数组在定义时未进行初始化,则各元素的值是随机的。,数组,2,0,3,0,0;,C语言程序设计,二维数组也可以当成一维数组看待,每一个元素的类型又是一维数组。 例如:int b23; b数组的元素为: b00 b01 b02 b10 b11 b12,a,b0,b1,数组,C语言程序设计,四、二维数组的程序举例,例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,数组,C
11、语言程序设计,例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;,数组,C语言程序设计,6.4 用字符数组处理字符串,若有:char s5; 则称s为字符数组。 字符数组中每一个元素存放的是char型数据,所以可以象处理普通字符型变量一样,来处理字符数组元素。如: char s10; int i; for( i=0;i10;i+) si=g
12、etchar(); for( i=0;i10;i+) putchar(si); 字符数组还有它的特殊性。,数组,C语言程序设计,一、字符数组与字符串的关系,字符串 “China”的存储方式: 若有:char s =C,h,i,n,a; 其存储方式为: 既然此时初始化是为了提供一个字符串,C允许写成下面更简单的形式:char c =“China”; 甚至:char c =“China”;,0;,字符数组s中存放的是一个字符串!,数组,C语言程序设计,通常情况下,初始化时我们是把一个常量送给一个变量,并且它们的类型是一致的。如: int p=10; 对于: char s =“China”; 实际上
13、,数组名是常量,表示数组的开始地址,与传统的字符串变量还是有区别的。,整型变量,整型常量,字符串变量,字符串常量,一维字符数组相当于字符串变量,数组,C语言程序设计,二、字符数组的输入与输出,普通的数组处理方式 当字符数组中存储的字符不是以0结束时,只能像普通的数组那样,一个元素一个元素的处理。如: char c5; /* 输入*/ for(i=0;i5;i+) scanf(“%c”,数组,C语言程序设计,当字符数组中存储的字符是以0结束的,也可以像普通的数组那样,一个元素一个元素的处理。如: char c = “China”; for(i=0;ci!=0;i+) printf(“%c”,ci
14、); 由于循环的条件与数组中元素的个数无关,这已经比前面的处理灵活多了。,“I love China”;,数组,C语言程序设计,字符数组的整体处理方式 当用字符数组处理字符串时,可以与“%s”格式字符配合,完成字符串的输入输出。 输出字符串 char c =”China”; printf(“%s”,c);,此写法与 for(i=0;ci!=0;i+) printf(“%c”,ci); 功能完全等价,输出项为数组名,不能是数组元素,如写成c0是错误的。,“abc0 xyz” ;,数组,C语言程序设计,输入字符串 如有:char c80; scanf(“%s”,c); 当输入: China 当输入
15、:How are you? ,输入项c是字符数组名,此时不能再加地址运算符“ puts(str); 输出:China _,与 printf(“%sn”,str); 完全等价,数组,C语言程序设计,2、输入字符串函数,格式:gets(字符串变量) 功能:将键盘输入的一行字符串存入“字符串变量”中,当输入回车时才认为字符串输入结束,这就解决了scanf()函数不能接收带空格的字符串的问题。 如:char str80; gets(str); puts(str); 运行:How are you? How are you?,数组,C语言程序设计,3、字符串复制函数,格式:strcpy(字符串变量,字符串
16、) 功能:将“字符串”复制到“字符串变量”中,字符串变量的空间必须足够大。 如:char str80; strcpy(str, “China”); puts(str); 输出:China 注意:字符串不能直接送字符串变量,即: str= “China”; /* Error */,数组,C语言程序设计,4、字符串连接函数,格式:strcat(字符串变量,字符串) 功能:将“字符串”连接到“字符串变量”的后面,字符串变量的空间应足够大。 如:char str80= “I love ”; strcat(str, “China”); puts(str); 输出:I love China 注意:C语言中
17、不能使用“+”完成字符串的连接,即: str=str+ “China”; /* Error */,数组,C语言程序设计,5、字符串比较函数,格式:strcmp(字符串1,字符串2) 功能:完成“字符串1”与“字符串2”的关系比较,即对两个字符串自左至右逐个字符按其ASCII码值相比,直到出现不同的字符或遇到0为止。比较的结果由函数值获得: 如果“字符串1”=“字符串2”,函数值为0; 如果“字符串1”“字符串2”,函数值为一正数; 如果“字符串1”0)x=y;,数组,C语言程序设计,6、测字符串长度函数,格式:strlen(字符串) 功能:得到“字符串”的长度。 字符串长度: 是指双引号括起来
18、的字符个数 或,0前面字符的个数 或,0所在的下标位置 如:char str80= “abcd”; printf(“%d”,strlen(str); 结果:4,数组,C语言程序设计,7、小写字符转换为大写字符串函数,格式:strupr(字符串) 功能:将字符串中的小写字母换为大写字母。 如:printf(“%s”,strupr(“China”); 结果:CHINA,数组,C语言程序设计,8、大写字符转换为小写字符串函数,格式:strlwr(字符串) 功能:将字符串中的小写字母换为大写字母。 如:printf(“%s”,strlwr(“China”); 结果:china,数组,C语言程序设计,四
19、、字符数组的程序举例,例6.9 下述程序是把键盘输入的两个整数按从大到小的顺序输出,请修改成对字符串的处理。 main() int a,b,t; scanf(“%d%d”, ,数组,C语言程序设计,例6.10 将一个字符串复制到另一个字符串中,即完成strcpy函数的功能。 分析:把源字符串中的字符一个一个地传送(赋值)到目标字符数组中对应位置,直到遇到了字符串结束标志0:,数组,C语言程序设计,思路1先判断后赋值。,A,B,C,不是0,是0,数组,C语言程序设计,思路2先赋值后判断。,A,B,C,不是0,0,是0,数组,C语言程序设计,6.5 综合应用举例,例6.11 选择法排序 将键盘输入
20、的10个数据从大到小排序。 分析: 参考例6.3思考2。 按照同样的方法,再在剩余的数据中找最大并放在这些数的前面,这实际上是第二大的数。若有N个数据,这个过程需要N-1次。,数组,C语言程序设计,例6.12 气泡法排序 将给定的数据按从小到大排序。 分析: 6个数据,需要比较5次。 如果有N个数据,要比较N-1次。 每次比较时的红色指针变化: 若ajaj+1则将其交换。,4,3,5,1,2,6,第1次,04,第2次,03,第3次,02,第4次,01,第5次,00,N=6,N-2,N-3,N-4,N-5,N-6,i,j:0N-i -1,数组,C语言程序设计,例6.13 顺序查找: 从键盘上输入
21、学生姓名,显示他的分数。 分析: 结论: 顺序查找是从前向后的顺序查找。 如果不存在要查找的数据,要遍历整个数组。 顺序查找是速度最慢的查找方法,但原始数据可以为任意顺序。,待查姓名,Wangwu,Chenjiu,“查无此人”,数组,C语言程序设计,例6.14 折半查找: 从键盘上输入一个数据,在一有序数据(如从小到大排列)中进行查找。 分析:,left,right,46,x,Go,Go,15,x,mid,0 1 2 3 4 5 6 7,amidx,left=mid+1,mid=(left+right)/2,amidx,right=mid-1,amid=x 找到!,amidx,left=mid
22、+1,mid=(left+right)/2,amidx,right=mid-1,leftright 没找到!,amidx,right=mid-1,left=0;right=N-1; while(leftx)right=mid-1; else if(amidx)left=mid+1; else break; if(left=right) printf(“%d”,mid); else printf(“未找到”);,Program,数组,C语言程序设计,第六章作业,6.1 指出下列程序中的错误,并将其修改正确。 main() int m=2,n=3; int am,bm,n=11,2,8,4,25,6; int i,j,s=0; for(i=0;im;i+)scanf(“%d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业培训课件分享
- 营销活动成效评估与优化
- 油罐区安全防护制度
- 茶山承包与茶叶种植病虫害防治合同
- 厂房物业服务及智慧园区建设合作协议
- 智能家居系统采购合同终止及供应商更换
- 企业团体意外险课件
- 体育拉伤考试题及答案
- 常年法律顾问报价单制作与执行规范合同
- 电子设备搬运工技能培训劳动合同
- 配置管理与漏洞修复
- 新版中国复发难治性急性髓系白血病诊疗指南
- 汽车维修轮胎服务方案范本
- 保洁巡查记录表
- 成事的时间管理
- 风险分级管控责任清单(路基工程)
- 国开大学2023年01月22503《学前儿童健康教育活动指导》期末考试答案
- 建筑工地九牌一图内容仅供参考模板
- 2023年江西九江市湖口县司法局招聘司法行政辅助人员笔试备考试题及答案解析
- 仪器校准报告
- 四川电大媒体辅助英语教学媒体形考任务02标准答案
评论
0/150
提交评论