版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1,第 8 章(1) 数 组,2,我们已学习到的数据类型都属于基本类型: int , char , float. C语言还提供了一类“构造类型”的数据: 数组, 结构体, 共用体。,8.1 数组:,3,数组的概念: 数组是同一种数据类型的有序集合。 数组中的每个元素可用数组名和下标, 唯一地来标记它们。 数组元素又称为下标变量.,如: 数组元素array15 表示名为array1的数组中下标为5的那个元素.,4,使用数组的好处: 让一批类型相同的数据用同一个数组名,书写方 便,可读性高;便于使用循环语句处理。,数组中的一个一个的数据称为数组元素,它们在内存中是连续存放的. 数组元素其实可视为一
2、变量.,5,8.1.1 一维数组的定义和引用: 1定义: 类型说明符 数组名 数组长度 ;,说明: (1). C语言的数组下标是从开始计数。,定义时,数组长度必定是一常量,指明数组元素个数,从 0开始,例: int a110; /*定义一个含有10个整型元素的数组a1*/ char c320; /*定义一个含有20个字符元素的数组c3*/ float f45; /*定义一个含有5个单精度浮点型元素的数组f4*/,6,如定义了数组: int a110 ; 它有10个元素,分别是: a10, a11, a12, a18, a19 .,这里不存在a110 这个元素。,数组a110 :,这里的a110
3、是定义数组的表达形式.,这里的a1i是数组a110 中的第i号元素.,注: 注意定义时数组名的表示形式,与它的各元素的表示形式的区别。,7,2. 数组元素的引用: a. 数组必须先定义,然后才能使用. b. 只能逐个引用数组各个元素,不能引用整个数组。 数组元素的引用要指定下标, 表示形式: 数组名下标 ,例: int k, a10; 在可以使用整型变量的任何地方,都可以使用数组元素.如: k=3; a0=23; ak-2=a0+1; scanf(“%d”,8,例8.1 数组及数组元素的表示方法: #include int main() int i,a10=1,2,3,4,5,6; for(i
4、=0;i10;i+) printf(a%d=%-4d, i, ai); printf(n); return 0; ,ch8_8_1.c,在定义数组时可对数组元素赋初值.,9,说明: (1). 语言中对下标不作合法性检查,所以允许在使 用中下标越界。这种情况须程序员自我检查和控制。 合法的下标范围是: 0, 数组长度-1,(2). 定义数组时,数组长度可以包含常量和符号常量,不 可使用变量 。 也就是说, 数组长度在定义时必须指定, 运行时是不 可改变的.,(3). 使用时,只能逐个使用数组元素, 而不能一次使用 整个数组。 即:只能对数组元素进行操作.,10,物理意义:,数组一旦定义: 在编译
5、时在内存中开辟出一块连续的空间,空间的首地址对应于第一个元素,依次排列。,如果越界将出现什么问题?,数组首地址,11,例: 使用一个a10数组,依次送入0-9,然后逆序输出. main( ) int i, a10; for(i=0; i=0; i-) printf(“%d ”, ai ); ,输出: 9 8 72 1 0,这里的a10是定义数组的表达形式.,这里的ai是数组a10 中的第i号元素.,12,例 8.2 数组元素赋值,及输出 #include int main() int s10=1,2,3,4,5,6,7,8,9,10; int i=2, a3; a0=si; a1=s2+i;
6、a2=s2*i+3; printf(a0=%d a1=%d a2=%dn,a0,a1,a2); return 0; ,这里的定义了二个数组: s10, a3.,13,3. 一维数组的初始化: 在定义数组时可对数组元素赋初值,如: int a10= 1,2,3,4,5,6,7,8,9,10 ;,说明:(1). 虽然C语言规定,只有静态(static)存储的数组才能初 始化,但一般的C编译系统都允许对动态(auto)型数组 赋初值. 以下内容中,允许对静态数组, 动态型数组初始化.,可以将所有数据写在一对花括号内。,14,例如: static int b5=1,2,3,4,5; 静态(static
7、)存储的数组如果没有初始化,系统自动给所有的数组元素赋0.,(2). 可以只给部分元素赋初值: static int b5=1,2,3; 给前面3个元素赋初值,后面2个元素自动为0.,又如: int fib20=0,1; 给前面2个元素赋初值,后面其它元素的值不确定.,无 static!,为动态(auto)型数组.,15,如果提供的初始值个数与希望的数组长度不一致,如 提供5个初始值, 而希望数组长度为10,这时数组长度 不能省。,(3). 对全部数组元素赋初值时,可不指定数组元素长度. 如: int a5=1,2,3,4,5; 可写成: int a =1,2,3,4,5;,这时系统自动定义数
8、组 a 的长度为5。,16,例8.3 从键盘输入,给数组元素赋初值: #include int main() int i,a10; printf(请输入10个整型数,以空格隔开n); for(i=0;i10;i+) scanf(%d, ,ch8_8_3.c,17,8.1.2 字符数组 存放字符数据的数组是字符数组。数组中一个元素存放一个字符。 c语言中没有字符串变量,它用一维字符数组来表示. 即将字符串作为字符数组来处理.,18,1. 一维字符数组的定义 如:char str80;,2字符数组的初始化: 最容易理解的方式就是, 逐个字符赋给数组中各元素. 如: char c10= I, , a
9、, m, , h, a, p, p,y;,19,如果初始值个数少于数组长度,则只将这些字符赋予数组中前面的元素, 其余的元素自动定为空字符(0). char c10= c, , p, r, o, g, r, a,m;,共九个字符.,20,3. 字符数组的引用: 可以引用字符数组一个元素,得到一个字符. main( ) char c210= I,a,m, ,a, ,b,o,y; int i; for(i=0;i10;i+) printf(“%c”,c2i); ,运行输出: I am a boy,21,4. 字符串和字符串结束标志: 为了测定字符串的实际长度,C语言规定了一个字符串结束标志0.,如
10、果有一个字符串, 其第10字符为0,则此字符串的有效字符为9个. 也就是说,在遇到0时,表示字符串结束,由它前面的字符组成字符串.,22,系统对字符串常量也自动加一个0, 例如“C program”共有9个字符, 但在内存中占用10字节, 最后一个0是由系统自动加上去的. 字符串作为一维字符数组存放在内存中.,23,5. 字符串的存储: 我们对字符串数组初始化也可用如下方法: char c2 = “I am happy” ;,也可直接写成如下形式: char c2 = “I am happy” ; 字符数组c2 的长度不是10, 而是11, 这点务请注意.,这里共十个字符.,24,这是因为字符
11、串常量的最后由系统自动加上一个0. 因此,上面的初始化与下面的初始化等价: char c210=I,a,m,h,a,p,p,y,0;,25,6字符串的操作: 定义数组: char s1 =“China”; 输出:使用 “%s”格式输出: printf(“%s”,s1); 遇到0就停止输出。,输入: char s26; scanf(“%s”,s2); 输入: china ( 回车),不能加 printf(%sn,string); return 0; ,Ch8_8_4.c,27,例 : 利用数组,计算Fibonacii(斐波纳契)数列前20项的值,即 1,1,2,3,5,8,, 并按每行打印5个的
12、格式输出.,用数组计算并存放数列的前20个数,并有下列关系式成立: fib0=fib1=1 ; / n=0,1 fibn=fibn-1 + fibn-2 ; / 2n19,28,main( ) int i; int fib20=1,1; for(i=2;i20;i+) fibi=fibi-1+fibi-2; for(i=0;i20;i+) printf(%6d,fibi); if(i+1)%5=0) printf(n); ,初始化数组,生成前二个数: 1,1,计算该数列其余的18个数.,每输出5 个数就换行.,输出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377
13、 610 987 1597 2584 4181 6765,29,8.1.3 二维数组的定义与引用: 1二维数组的定义: 一般形式: 类型名 数组名行长度列长度,例: float a134 , b1510 ; 这里定义: a1数组为3行,4列。 b1数组为5行,10列。,第一维(行),第二维(列),30,二维数组实际上对应了一个二维表格,其中第一维表示二维表的行数,第二维表示二维表的列数. 二维数组按行列矩阵方式在内存中连续存放,第一下标(维)指示行,第二下标(维)指示列,下标都从0开始计数.,如数组a34的排列: a00 a01 a02 a03 a10 a11 a12 a13 a20 a21
14、a22 a23,数组的起始地址,31,2. 二维数组元素的引用: 二维数组元素的表示形式: 数组名行下标列下标 如数组元素 a13:,数组元素可以出现在表达式中,也可以赋值: b12 = a232 ;,a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23,代表第二行,第四列上的那个元素.,32,注意: a. 要区分定义数组时用的形式:int a34 ; 和使用数组元素时的形式:a23 两种形式的含义是不同的。,b. 引用数组元素时,要保证下标值在定义的范围之内. 如定义数组: int a34; 它的行下标值范围: 0, 它的列下标值范围: 03 .,3
15、3,3二维数组的初始化 可使用下列几种方法: a. 可以将所有数据写在一对花括号内。如: int a34= 1, 2 11,12 ; 数组按顺序给各元素赋初值.,b. 可分行给二维数组赋初值: int a34= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12 第一个花括号内赋给第一行,第二个花括号内的值赋给第二行, , 外加一个花括号.,34,c. 可以对部分元素赋初值。 如: static int a34= 1, 5, 9 ; 存放情况: 1 0 0 0 5 0 0 0 9 0 0 0,d. 如果提供全部初始数据,进行赋初值,则定义数组时, 第一维长度可省去,第二维不可
16、省. 如: int a 4=1,2, 11,12; 系统根据每行4列,从而可确定共3行。,即对各行第一列的元素赋初值,其它元素为0.,也可对各行中某一元素赋初值: int a34=1,0,6,0,0,11;,35,#include int main() int i,j,a44; printf(请输入16个整型数,以空格隔开n); for(i=0;i4;i+) for(j=0;j4;j+) scanf(%d, .,例 8.5二维数组的输入输出.,Ch8_8_5.c,36, printf(输入的数组为:n); for(i=0;i4;i+) for(j=0;j4;j+) printf(a%d%d=%
17、-4d, i, j, aij ); printf(n); return 0; ,37,例: 写一程序,求一矩阵的主对角线(左上到右下角)上的 元素之和.,main() int a33=1,3,5,7,9,11,13,15,17; int sum=0, i, j; for(i=0;i3;i+) /*行 for(j=0;j3;j+) /*列 if(j=i) sum=sum+aij; printf(”sum=%d”,sum); ,Ch8_8_5_1.c,38,例:输入一串字符 , 用反序输出: #include ”stdio.h” main( ) int i, j=0; char c1 , s100
18、; while( (sj+=getchar( ) ) != n) ; for( i=0, j -=2 ; ij ; i+, j-) c1=sj ; sj=si ; si=c1; for( i=0 ; si != n; i+) printf(“%c”, si); ,Ch8_8_5_2.c,39,从本质上来看,二维数组也可看作一种特殊的一维数组(数组的数组)。 例如: a34 数组可看作一个一维数组,这个一维数组有 3个元素,而每个元素又是有4个元素的一维数组。,a0 a00 a01 a02 a03 a a1 a10 a11 a12 a13 a2 a20 a21 a22 a23 在C语言中,二维数
19、组中元素的排列顺序先放第一 行元素,后放第二行的元素。,40,4. 数组基本算法语句的实现: (1). 求数组的最小元素及下标: int a710 ; int min , p ; min =a70; p=0; for( i=1; i10; i+) if ( a7imin ) min =a7i; p=i; ,假设第一个元素就是最小的元素,41,(2). 交换数组中各元素: 下列语句进行数组首尾元素的交换: for( i=0 ; i= n2; i+) t=ai; ai=an-i-1; an-i-1=t; ,(3). 在数组中查找某数x. 顺序查找. for ( i=0 ; i n; i+) if ( x=ai ) break ;,n假设为数组a 的长度。,42,补充题 1: 从键盘输入5个字符组成的单词, 判断此单词是不是hello,并显示结果 .,43,#include main() static char str =h,e,l,l,o;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026农业立体温室控制系统应用现状及智能化发展展望
- 2026农业科技行业基因编辑技术应用及投资价值深度研究
- 2026农业无人机作业效率提升与服务模式创新研究
- 2026农业农业产业-innovation行业市场供需分析及投资评估规划分析研究报告
- 2026中国跨境直播电商商业模式创新与消费者行为洞察报告
- 2026中国期货公司服务实体经济模式创新与案例报告
- 2025咨询工程师考试(项目决策分析与评价)全真冲刺试题及答案一
- 2025年AI情绪调节设备人工智能模型训练方法
- 江苏省高邮市三垛中学2026届中考一模历史试题含解析
- 2026届黑龙江省伊春市名校中考历史押题卷含解析
- 中国建设银行建行研修中心华东研修院2023年招聘12名人才笔试上岸历年典型考题与考点剖析附带答案详解
- 全国专利代理师资格考试专利法律知识专项考试试题
- 湖州南太湖热电有限公司节能减排技改项目环境影响报告
- 《农业推广学》第05章 农业推广沟通
- 妊娠期高血压疾病诊治指南2020完整版
- 【拓展阅读】整本书阅读系列《闪闪的红星》
- 三角形的认识(强震球)
- 骨与关节结核PPT
- 2018年-2022年山东历史高考真题五年合集
- GB/T 24211-2009蒽油
- 专利法教学大纲
评论
0/150
提交评论