




已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数组 按序排列的相同类型数据元素的集合称为数组 数组类型是一种常用的构造型数据类型 它有若干分量 一般把这些分量称为数组元素 在C语言中 没有提供动态数组的类型 即 定义一个数组之后 就确定了它所容纳的同类元素的个数 即数组大小 这就构成了数组类型的两个特点 一方面 其大小必须是确定的 不允许随机变动 另一方面 其元素必须是同质的 即类型相同 不允许出现混合类型 数组中各个元素的相对位置 即下标 是确定的 分别 按号就坐 通过数组名和下标可以惟一的确定数组中的元素 不会发生混乱 5 1一维数组的定义和引用5 2字符数组5 3多维数组5 4应用举例 5 1一维数组的定义和引用 5 1 1一维数组的定义在使用一个数组之前 必须对它加以定义 它的任务是 标识数组的名称 确定数组的大小 即数组中元素的个数 表明数组的基类型 即其元素的类型 一维数组的一般定义形式为 数据类型数组名 整型常数表达式 例如 inta 10 doublevalue 5 longintarray 6 6 定义数组时应注意 数组名是标识符 它遵循标识符的命名规则 数组名之后是一对方括号 它是数组标志 不能用圆括号 方括号内是整型常量表达式 整型常量表达式是一种其值为正整数的表达式 它表示该数组元素的个数 即数组大小 表示数组大小的整型常量表达式中不能包含变量 例如 不能利用scanf 函数接收用户输入的数值来随意指定数组的大小 intn err n scanf d n 这是不行的 对定义好的数组 C编译在内存中为它分配一片连续的空间 基地址是指该数组在内存中的起始地址 5 1 2一维数组元素的引用在C语言中 引用一维数组元素的一般形式是 数组名 下标 下标可以是整型常量或整型表达式 例如 a 0 a 1 a 2 2 a 8 6 在引用数组元素时应注意 在C语言中 数组元素的下标是从0开始计算 而不是从1开始 数组元素是变量 一个数组元素可以像同类型的单一变量那样在表达式中执行相应的操作 例5 2 设有一头母牛 它每年年初生一头小母牛 每头小母牛从第四个年头开始 每年年初也生一头小母牛 问在第20年时 共有多少头牛 分别输出从第1年至第20年每年的牛数 由题意 可得到如下的数据 设Un表示第n年 n 4 时牛的头数 由表中数据间的关系可得出下式 Un Un Un 3 n 4 根据这个式子 建立一个数组ncow存放各年牛的头数 程序如下 includevoidmain inti ncow 20 1 ncow 1 2 ncow 2 3 ncow 3 4 for i 4 i 20 i ncow i ncow i 1 ncow i 3 for i 1 I 20 i printf 12d ncow i if i 5 0 printf n 5 1 3一维数组的初始化对数组提供初值的方式有两种 分别为各个元素提供初值和对整个数组初始化 对数组元素提供初值的方式可以像对待同类型的简单变量那样 利用赋值语句直接赋值 或者通过调用scanf 函数 由用户输入各元素的值 例如 inta 5 a 0 10 a 1 5 inti a 10 for i 0 i 10 i a i 0 利用数组初始化方式可以为整个数组提供初值 一维数组初始化的一般形式是 数据类型数组名 整型常量表达式 初始值 初值表是一些由逗号分隔开的初值符 它是表示初值的常量表达式 inta 10 0 1 2 3 4 5 6 7 8 9 各个初值括在一对花括号中 从左到右依次赋给数组的各个元素 例5 3 求下列数的总和及平均值 95 86 90 92 89 75 88 96 91 93 includevoidmain staticintarray 10 95 86 90 92 89 75 88 96 91 93 inti sum i 0 sum 0 while i 10 sum array i printf Thesum d n sum printf Theaverage 1f n double sum 10 对一维数组初始化时应注意以下几点 在经典C语言中规定 只有静态 static 数组和外部 extern 数组才能初始化 但在ANSIC和标准C中取消了这一限制 就是说 对自动数组也可以初始化 外部数组和静态数组的初始化工作是在编译时进行 因此 只进行一次 而自动数组的初始化工作是在程序执行时进行 从而可进行多次 对数组初始化时 初值符的个数不能多于数组元素的个数 但允许初值符的个数少于数组元素的个数 当初值符个数少于数组元素个数时 出现在初值表中的初值就对前面的若干个数组元素依次赋值 而其余的数组元素隐含用0赋初值 inta 10 1 2 3 4 5 若没有对静态和外部数组显式地进行初始化 则系统会对它们自动进行初始化 即所有数组元素都赋予0 staticintnum 10 例5 5 用数组处理例4 14的Fibonacci数列问题 为了简化程序 这里只求前30项 利用数组fib保存该数列各个项 Fibonacciarray includevoidmain inti longintfib 30 1 1 for i 2 i 30 i fib i fib i 1 fib i 2 for i 0 i 30 i if i 5 0 printf n printf 12ld fib i 如果一维数组在定义时带有初始化项 那么 数组的大小可以省略 在编译时系统会根据初值表中初值符的个数计算数组中元素的个数 inta 1 2 3 4 5 这种形式就等同于 inta 5 1 2 3 4 5 如果初值符的类型与数组元素的类型不一致 则把初值符类型转换为数组元素的类型 5 2字符数组 通常使用的字符数组是一维数组 当然 字符数组也可以是多维数组 其元素的类型是字符量 一个字符数组元素中存放一个字符 5 2 1字符数组的定义和引用字符数组的一般定义形式是 char数组名 整型常量表达式 由整型常量表达式的值决定数组的大小 charname 15 字符数组占用一片连续的空间 如图5 3所示 每一个元素占用的单元应足以存放一个字符量 通常是一个字节 5 2 2字符数组的初始化对字符数组赋初值的方式有以下几种 利用赋值语句对数组元素赋初值 例如 charname 15 name 0 M name 1 e name 2 n name 3 g name 4 0 利用库函数 如scanf 由用户为字符数组输入初值 例如 charcity 15 scanf s city 用字符常量作为初值符 对字符数组进行初始化 chars 11 p r o g r a m m i n g 用字符串直接对字符数组初始化 staticcharc 15 Beijing 但应注意 字符串是以空字符 0 作为结束标志 下述两种初始化方式就有差别 staticcharb1 C h i n a staticcharb2 China 如果指定的字符数组的大小恰好等于字符串直接量中显式出现的字符个数 那么字符串结束标志 0 就不被放入字符数组中 chart abc s 3 abc 它们等同于 chart a b c 0 s a b c 例5 9 对字符数组初始化 然后打印出各个元素的字符和相应的ASCII编码值 includevoidmain inti staticcharc 12 InChina for i 0 I 12 i printf c d c i c i printf n s n c 程序运行结果为 I 73 n 110 32 C 67 h 104 i 105 n 110 a 97 0 0 0 0 InChina 对字符数组初始化时 应该注意以下几点 在经典C中规定 只有外部数组和静态数组才能初始化 但在ANSIC和标准C中都取消了这一限制 即 自动类字符数组也可以初始化 对外部数组和静态数组的初始化是在编译时进行 只做一次 对自动数组的初始化是在执行时进行 因而 在程序运行过程中 可对自动数组多次进行初始化 对字符数组初始化时 初值表中提供的初值个数 即在一对花括号中的字符个数 不能大于给定数组的长度 初值符的个数可以小于数组的长度 在这种情况下 只将提供的字符依次赋给字符数组中前面的相应元素 而其余的元素自动补0 即空字符 0 的值 如果想用提供的初值符个数来确定数组大小 那么在定义时可以省略数组大小 5 3多维数组 在C语言中 数组的元素还可以是数组 这样就构成多维数组 所以 二维数组可以看成是 数组的数组 5 3 1二维数组的定义二维数组的一般定义形式是 数据类型数组名 整型常量表达式 整型常量表达式 inta 5 10 doublematrix 3 2 3 1 按照多维数组的定义 二维数组其实是一个 数组的数组 上面数组a的元素a 0 8 a 3 4 a 4 0 等是整型量 而a 0 a 1 a 4 的基本类型却是 数组 二维数组在书写形式上采用方括号成对并列出现 inta 5 10 下述形式是不正确的 inta 5 10 inta 5 10 inta 5 10 inta 5 10 两对方括号中间有空格 inta 5 10 应该使用方括号 5 3 2二维数组的内部表示C语言中 二维数组的元素是 先按行 再按列 排列的 intab 4 5 5 3 3多维数组的定义多维数组的一般定义形式为 数据类型数组名 整型常量表达式 整型常量表达式 整型常量表达式 例如 描述空间矩阵需用三维数组 doublespace 3 5 5 5 3 4二维数组引用二维数组元素的表达形式是 数组名 下标表达式 下标表达式 其中 下标表达式的值必须是整数 ab 0 0 是数组ab的第0行第0列元素 在引用数组元素时应注意 二维数组的行下标和列下标的值都是从0开始的 就一般情况而言 如果二维数组定义时行的长度为M 列的长度为N 那么 合法的数组行下标值是0 M 1 列下标值是0 N 1 二维数组元素可像同类型的简单变量那样在表达式中使用 但应注意 行下标 列下标都应齐备 例5 10 写一个程序 计算两个矩阵相乘得到的第三个矩阵 并打印计算结果 程序如下 includevoidmain inti j k inta 4 3 b 3 5 c 4 5 printf InputelementsofmatrixA n for i 0 i 4 i for j 0 j 3 j scanf d a i j printf InputelementsofmatrixB n for j 0 j 3 j for k 0 k 5 k scanf d b j k printf MatrixCisasbelow n for i 0 i 4 i for k 0 k 5 k c i k 0 for j 0 j 3 j c i k a i j b j k printf 6d c i k printf n 5 3 5二维数组的初始化对二维数组初始化的形式有两种 与一维数组初始化的形式相同 即 由一对花括号把所有初值都括起来 其中的初值依次赋予二维数组的各个元素 例如 intmatrix 5 5 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 可用花括号把同一行元素的初值括起来 得到如下常用的形式 intmatrix 5 5 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 对二维数组初始化时 还应注意以下几点 在ANSIC和标准C中规定 对外部 静态以及自动的二维数组都可以进行初始化 对外部和静态二维数组的初始化是在编译时进行的 只作一次 而自动二维数组的初始化是在程序运行时进行 因此能作多次 对外部和静态数组定义时 如没有显式进行初始化 则系统自动对它们初始化 所有元素都置为0 但是 在自动数组定义时若没有显式初始化 其元素的值是杂乱的 如果在定义二维数组时又对它的全部元素提供初值 那么 该数组的第一维的长度可以省去 但第二维的长度不能缺少 例如 staticintday tab 13 0 31 28 31 30 31 30 31 31 30 31 30 31 0 31 29 31 30 31 30 31 31 30 31 30 31 可以对部分元素赋初值 即 若初值个数比数组元素个数少 则后面无对应初值的元素都自动用零补充 例如 floaty 4 3 1 3 2 4 5 9 初始化的结果是 y 0 0 1 y 0 1 3 y 0 2 0 y 1 0 2 y 1 1 4 y 1 2 0 y 2 0 5 y 2 1 9 y 2 2 0 而第3行的3个元素都为0 数据类型都要转换成float型 用矩阵形式表示 即 在这种情况下 如果去掉内部的花括号 那么就会产生不同的初始化结果 floaty 4 3 1 3 2 4 5 9 其结果是 y 0 0 1 y 0 1 3 y 0 2 2 y 1 0 4 y 1 1 5 y 1 2 9 而第2行和第3行的全部元素 共6个 都为0 即 如果只对部分数组元素提供初值 又省略第一维的长度 行长 那么应分行赋初值 既使某行没有对应的初值 也必须保留对应该行的一对花括号 例如 inta 4 0 1 6 0 0 5 1 0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度环保产品摄影服务合同范本
- 二零二五年度户外野营专用电压力锅租赁合同
- 2025版班主任教师专业成长带教培训协议书
- 二零二五年度绿色有机蔬菜委托加工专项合同
- 2025农产品批发市场农产品交易合同模板
- 宣传文案类合同范本
- 农业种植实验合同范本
- 清场转让工程合同范本
- 企业销售纸质合同范本
- 安装监控服务合同范本
- 急救护理学高职PPT完整全套教学课件
- AutoCAD计算机辅助设计标准教程(中职)PPT完整全套教学课件
- 安全生产费用使用范围及计量办法
- 肾脏疾病常见症状和诊疗
- 安全环保职业卫生消防题库及答案
- 数据中心负荷计算方法
- 金X绅士无双攻略
- 第八章 立体几何初步(章末复习) 高一数学 课件(人教A版2019必修第二册)
- GB/T 27518-2011西尼罗病毒病检测方法
- GB/T 26255-2022燃气用聚乙烯(PE)管道系统的钢塑转换管件
- GB/T 14202-1993铁矿石(烧结矿、球团矿)容积密度测定方法
评论
0/150
提交评论