




已阅读5页,还剩37页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第七章数组 数组的定义 是有序数据的集合 数组的特点 数组中的每个元素都属于同一数据类型 数组的访问 我们用一个统一的数组名和下标来唯一地确定数组中的元素 基本类型 charintfloatdoubleenum 构造类型 Arraystructunion 空类型void 指针类型 与以上各种类型相结合 概述 数据类型 7 1一维数组的定义和引用 7 1 1一维数组的定义定义方式 类型说明符数组名 常量表达式 例 inta 10 它表示数组名为a 此数组有10个整型元素 如右图 说明 1 数组名命名规则和用户标识符命名规则相同 2 数组名的常量表达式用方括弧括起来 而不是用圆括弧 3 常量表达式表示元素的个数 即数组长度 例如 inta 10 表示a数组共有10个元素 下标从0开始 分别为 a 0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 注意 没有a 10 4 常量表达式中可以包括常量和符号常量 不能包含变量 即数组的大小应在编译阶段确定 不允许在程序运行过程中才确定 例如 intn scanf d 是不合法的 7 1 2一维数组元素的引用 C语言规定 只能逐个引用数组元素而不能一次引用整个数组 一维数组元素的表示形式为 数组名 下标 其中下标可以是整型 常量 变量 或整型表达式 例如 a 0 a 5 a 7 a 2 3 例7 1数组元素的引用main inti a 10 for i 0 i 0 i printf d a i 本例使a 0 到a 9 的值为0 9 然后按逆序输出这10个元素的值 7 1 3一维数组的初始化 1 完全初始化 在定义一个数组时 对数组中所有元素都提供了初始化数据 例如 inta 10 0 1 2 3 4 5 6 7 8 9 其中 a 0 0 a 1 1 a 2 2 a 3 3 a 4 4 a 5 5 a 6 6 a 7 7 a 8 8 a 9 9 2 部分初始化 提供了初始化数据 但数据不够 不够的部分取0 例如 inta 10 0 1 2 3 4 其中 a 0 0 a 1 1 a 2 2 a 3 3 a 4 4 a 5 0 a 6 0 a 7 0 a 8 0 a 9 0 3 没有初始化 只是定义了一个数组 但没有提供任何初始化数据 这时数组中每个元素的值是不确定的 例如 inta 10 4 如果想把数组中所有元素初始化为0 可以写成 inta 10 0 0 0 0 0 0 0 0 0 0 但不能写成 inta 10 0 10 5 若对数组中所有元素进行了初始化 可不指定数组长度 例如 inta 5 0 1 2 3 4 可以写成 inta 0 1 2 3 4 对于后一种定义系统会默认a数组的长度为5 但是如果被定义的数组长度与提供初值的个数不相同时 则数组长度不能省略 例如 inta 10 0 1 2 3 4 只初始化了前5个元素 后5个元素不确定 例7 2用数组来处理求Fibonacci数列问题 P116 117和P124 main inti intf 20 1 1 for i 2 i 20 i f i f i 2 f i 1 一次循环只求一个数 for i 0 i 20 i if i 5 0 printf n printf 12d f i 7 1 4一维数组程序举例 这里只求了前20个数 与P117区别 例7 3用冒泡法对10个数排序 由小到大 冒泡法 在要排序的数中 依次将相邻的两个数进行比较 若满足排序要求 保持两者位置不变 否则交换位置 第一次比较 第二次比较 第三次比较 第四次比较 第五次比较 第一次冒泡排序结果 第一次冒泡排序 从最前面两个元素开始 两两比较 直到最后一个元素比较完 最大的元素就到了最后的位置 这叫作 一趟 冒泡法排序 从上述我们可以得出 如果有n个数参加冒泡排序 则要进行n 1趟比较 在第j趟比较中有n j 1个数参加排序 要进行n j次两两比较 比如 本例中第2趟有5个数参加排序 进行了4次比较 第一次比较 第二次比较 第三次比较 第四次比较 第二次冒泡排序结果 第二次冒泡排序 main inta 11 inti j t printf input10numbers n for i 1 ia i 1 t a i a i a i 1 a i 1 t printf thesortednumbers n for i 1 i 11 i printf d a i for循环的嵌套 7 2二维数组的定义和引用 7 2 1二维数组的定义一般形式 类型说明符数组名 常量表达式 常量表达式 例 floata 2 3 b 5 10 此句定义了一个名为a的2行3列的实数数组和一个名为b的5行10列的实数数组 注意 不能写成 floata 2 3 b 5 10 说明 1 在C语言中 可把二维数组看成一个特殊的一维数组 它的一个元素又是一个一维数组 即可看成是一维数组的嵌套 比如 我们可以把二维数组a 2 3 看成下图所示的嵌套关系 相应的内存空间 如右图 二维数组是多维数组的基础 其它多维数组的定义和元素存放形式与二维数组类似 2 二维数组的存放顺序 C语言中 二维数组的元素在内存中是按行依次连续存放的 即先顺序存放第一行的元素 再存放第二行的元素 以此类推 例如 a 2 3 的存放形式为 a 0 a 0 0 a 0 1 a 0 2 a 1 a 1 0 a 1 1 a 1 2 a 7 2 2二维数组的引用 二维数组元素的表示形式为 数组名 下标 下标 例如 a 2 3 表示的是a二维数组的第3行第4列的元素 注意 数组超界的问题 假如有程序段 inta 3 4 a 3 4 13 引用a 3 4 便超出了所定义的边界 此时系统不会报错 同样把13赋值到指定单元 但此单元却可能是我们的其它有用数据 这样 便很容易造成意想不到的错误 甚至死机 同学们一定要小心 这是大家经常感到莫名其妙的地方 7 2 3二维数组的初始化 1 按行对二维数组进行初始化 例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 2 也可将所有数据写在一个花扩弧内 系统会以按行存放的顺序依次对各数组元素进行初始化 例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 3 和一维数组一样 也可只对各行中前面部分元素初始化 例如 inta 3 4 1 5 9 它的作用是只对每行第一列元素进行初始化 其它元素自动为0 结果为 也可以只对前面各行中的元素初始化 其它元素自动为0 inta 3 4 1 2 3 结果为 4 若要对全部元素都初始化 则定义数组时对第一维的长度可以不指定 但第二维的长度不能省略 例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 可以写成 inta 4 1 2 3 4 5 6 7 8 9 10 11 12 注意 初始化只能从 前面 开始 即必须先初始化前面各行再初始化后面各行 也必须先初始化每行的前面部分再初始化后面部分 不能跳过前面部分去初始化后面部分 P128有错 如 inta 5 1 3 4 5 和intb 3 4 1 2 3 是错的 例7 4将二维数组行和列元素互换 存到另一个二维数组中 7 2 4二维数组程序举例 main inta 2 3 1 2 3 4 5 6 intb 3 2 i j printf arraya n for i 0 i 1 i 控制行 for j 0 j 2 j 控制列 printf 5d a i j b j i a i j printf n printf arrayb n for i 0 i 2 i for j 0 j 1 j printf 5d b i j printf n 例7 5有一个3X4的矩阵 要求编程求出其中最大的那个元素的值 以及其所在的行号和列号 main inti j row 0 colum 0 max 定义标记变量 inta 3 4 1 2 3 4 9 8 7 6 10 10 5 2 max a 0 0 for i 0 imax max a i j row i colum j printf max d row d colum d n max row colum 7 3字符数组 7 3 1字符数组的定义字符数组的定义与前面所述数组的定义类似 例如 charc 10 c 0 S c 1 I c 2 L c 3 I c 4 C c 5 T c 6 c 7 L c 8 A c 9 N 上句的作用为 定义C为字符数组 包含10个元素 赋值后的状态为 在C语言中 字符型和整型是互相通用的 因此上述定义语句可以写为 intc 10 但不推荐这样定义 原因是不便于作为字符串进行控制 7 3 3字符数组的初始化 一 对于字符数组的初始化 最容易理解的方式就是像我们前面所讲的数值型数组的初始化方式一样 将字符逐个赋给数组中的各元素 例如 Charc 10 M y C H I N A 说明 1 在初始化时 若花括弧中提供的初值个数大于数组的长度 则按语法错误处理 2 若小于数组长度 则将用户提供的初值先依次赋给前面的元素 对余下的元素系统自动赋0 对应空字符 3 若等于欲定义的数组长度时 可省略数组长度 这里存放的是空格的ASCII码 40 是八进制 040 的缩写 对应十进制数32 4 也可以定义和初始化一个二维字符数组 方法与前面二维数值型数组类似 如 存放一个由 组成的菱形 chardiamond 5 5 7 3 3字符数组的引用可以引用字符数组中的一个元素 得到一个字符 例7 6 输出一个字符串 main charc 10 I a m a b o y inti for i 0 i 10 i printf c c i printf n 例7 7 输出一个由 组成的菱形 main chardiamond 5 5 inti j for i 0 i 5 i for j 0 j 5 j printf c diamond i j printf n 运行结果为 7 3 4字符串和字符结束标志在C语言中 将字符串作为字符数组来处理 通常 我们关心的是有效字符的长度而不是字符数组的长度 例如 定义一个字符数组长度为100 而实际有效字符可能只有40个 为了测定有效字符的实际长度和便于对一个连续的字符序列进行处理 C语言规定 以空字符 0 作为一个连续字符序列的 结束标志 称该字符序列为字符串 也就是说 当处理一个字符串时 若遇到字符 0 则表示该字符串结束 在处理字符串常量时 系统也自动加一个 0 作为结束符 例如 CProgram 共有9个字符 但在内存中占10个字节 最后一个字节 0 是由系统自动加上的 字符数组初始化 二 用字符串常量来初始化字符数组 例如 charc Iamhappy 也可以省略花括弧 直接写成charc Iamhappy 不是用单个字符作为初值 而是用一个字符串 注意字符串的两端是用双引号而不是单引号括起来的 作为初值 显然 这种方法直观 方便 符合人们的习惯 注意 上述字符串的长度是11而不是10 因为字符串常量的最后由系统加上了一个 0 上述的初始化与下面的初始化等价 charc I a m h a p p y 0 而与下面的初始化不等价 charc I a m h a p p y 前者的长度为11 后者的长度为10 需要说明的是 字符数组并不要求它的最后一个字符必须是 0 用户可以自行另外指定结束标志 甚至可以不包含结束标志 像以下面这样定义完全是合法的 charc 5 C h i n a 但是 由于系统对字符串的处理默认是以 0 作为结束标志 因此 为了使处理方法统一 不致引起误会 我们在对字符数组赋值时 通常都会人为地加上结束标志 0 如 charc 6 C h i n a 0 7 3 5字符数组的输入输出 字符数组的输入输出可以有两种方法 1 逐个字符输入输出 用格式符 c 输入或输出一个字符 如 main charc 10 I a m a b o y inti for i 0 i 10 i printf c c i printf n 2 将整个字符串一次输入或输出 用 s 格式符 如 charc china printf s c 关于用 S输出字符串的说明 1 printf s c 中的c是一个已定义的字符数组名 它代表该数组的起始地址 注意不能写成 printf s c 0 2 此语句输出一字符串的执行过程是 先按字符数组名c找到该字符数组的起始地址 然后逐个输出其中的字符 系统在输出 n 时 会自动再加上一个 r 一旦遇上 0 便结束输出 但输出的字符中不包括结束符 0 那请问1 如果字符数组长度大于字符串实际长度 此时是否全部输出字符数组中的各元素 又请问2 如果一个字符数组中含有多个 0 则输出到哪里结束 关于用 S输入字符串的说明 1 可以用scanf s c 函数来输入一个字符串 其中c是已经定义的一个字符数组名 2 此语句的执行过程是 先等待用户从键盘输入字符串 用户从键盘输入的内容要先送至输入缓冲区 当用户按下回车时 系统停止接收该次输入的数据 从键盘按下一次Enter键 它代表 n 和 r 两个字符 但系统只保存一个 n 字符 然后从缓冲区中第一个不是分隔符 空格 Tab或回车 的字符开始读取数据 字符串 再从c的起始地址开始依次往后赋值 直到遇上分隔符为止 并在字符数组中自动添加一个 0 但缓冲区中的该分隔符依然存在 注意 用scanf函数输入字符串与数值型数据时 分隔符相同 因此 从键盘输入的字符串在赋给字符数组c时 系统不会识别c的定义长度 在调试程序时应注意所输入的字符长度不能超过所定义的字符数组长度 否则会数组超界 出现意想不到的错误 甚至死机 7 3 6字符串处理函数 在C的函数库中提供了一些用来处理字符串的函数 使用方便 几乎所有版本的C都提供这些函数 下面是几种常用的函数 1 puts 字符数组名 作用 将一个字符串 以 0 结束的字符序列 输出到终端 由于可以用printf函数输出字符串 因此puts函数用得不多 用puts输出的字符串中也可以像printf一样包含转义字符 例如 charstr1 China n str2 Beijing puts str1 puts str2 输出 China 注意 这里空了一行 Beijing 区别 用puts输出一个字符串时 它会将结束标志 0 转换成 n 来输出 而printf不会对 0 进行处理 2 gets 字符数组名 作用 从终端输入一个字符串到字符数组 并且得到一个函数值 该函数值是字符数组的起始地址 如执行下面的函数 gets str 从键盘输入 Comeon 将输入的字符串 Comeon 送给字符数组str 请注意送给数组的共有9个字符 而不是8个字符 函数值为字符数组str的起始地址 一般利用gets函数的目的是向字符数组输入一个字符串 而不大关心其函数值 区别 gets是从缓冲区的第一个字符开始读起 直到 n 为止 并把 n 读走 缓冲区中不再存在 转换成 0 再赋给字符数组作为结束标志 而scanf函数是从缓冲区中第一个不是空格 Tab和 n 的字符开始 直到空格 Tab或 n 为止 且不读走该空格 Tab或 n 缓冲区中的该空格 Tab或 n 依然存在 注意 用puts和gets函数只能输入或输出一个字符串 3 strcat 字符数组名1 字符数组名2 全称stringcatenate作用是 把字符串2追加到字符串1后面 结果放在字符数组1中 字符数组2不变 函数调用后得到一个函数值 字符数组1的地址 例如 charstr1 30 People sRepubnicof charstr2 China printf s strcat str1 str2 输出 People sRepublicofChina连接前后的状况见下图所示 说明 1 字符数组1必须足够大 以便能容纳追加后的新字符串 上例中定义str1的长度为30 是足够大的 2 追加前两个字符串的后面都有一个 0 追加时将字符串1后面的 0 覆盖掉 只在新串最后保留一个 0 4 strcpy 字符数组名1 字符串或字符数组名2 作用 将字符串2复制到字符数组1中 变相实现 字符串的赋值 例如 charstr1 10 str2 China strcpy strl str2 执行后 str1的状态右图所示 说明 1 字符数组1的长度不应小于字符串2的长度 以便容纳被复制的字符串 2 strcpy的第一个参数必须写成数组名形式 如str1 第二个参数可以是字符数组名 也可以是一个字符串常量 如 strcpy str1 China 3 复制时连同字符串2后面的 0 一起复制到字符数组1中 4 不能用赋值语句将一个字符串常量或字符数组直接赋值给另一个字符数组 下面两行都是不合法的 str1 China str1 str2 而只能用strcpy函数处理 赋值语句只能用来将一个字符赋给一个字符变量或字符数组的一个元素 注意 strncpy str1 str2 2 只将str2的前面2个字符拷过去 不拷贝空字符 0 5 strcmp 字符串或字符数组名1 字符串或字符数组名2 作用 比较两个字符串的大小 例如 includemain charstr1 computer charstr2 compare printf d n strcmp str1 str2 printf d n strcmp command str1 结果 20 3比较的结果由函数值带回 1 如果字符串1 字符串2 函数值为0 2 如果字符串1 字符串2 函数值为一正整数 3 如果字符串1 字符串2 函数值为一负整数 注意 对两个字符串比较 不能用 if str1 str2 printf yes 而只能用 if strcmp str1 str2 0 printf yes 6 strlen 字符数组 作用 测试字符串长度的函数 函数的值为字符串中的实际字符长度 不包括 0 在内 如 charstr 10 china printf d strlen str 输出结果不是10也不是6 而是5 也可以直接测字符串常量的长度 如 strlen china 结果也是5 7 strlwr 字符串 作用 是将字符串中的大写字母转换成小写字母 8 strupr 字符串 作用 是将字符串中的小写字母转换成大写字母 lowercase 小写字母 uppercase 大写字母 强调 库函数并非C语言本身的组成部分 而是人们为了使用方便 将一些常见问题编写成的公共函数 提供给大家使用 每个系统提供的函数数量 函数名和函数功能都不尽相同 使用时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-湖南-湖南房管员四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-湖南-湖南医技工三级(高级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-湖南-湖南保安员三级(高级工)历年参考题库典型考点含答案解析
- 数字化会员服务在2025年零售行业的应用与发展研究报告
- 2025-2030中国纺纱纸锥行业应用潜力与投资盈利预测报告
- 2025年事业单位工勤技能-海南-海南铸造工一级(高级技师)历年参考题库含答案解析
- 2025年储能电池在储能电站储能系统智能化监控中的应用研究报告
- 金融行业审计智能化路径探析:2025年人工智能算法应用报告
- 2025-2030中国笔制造行业发展前景与趋势预测分析报告
- 2025-2030中国立体蓝牙耳塞市场供需现状与销售渠道规划报告
- 2025年发展对象考试题库附含答案
- 2025年兵团基层两委正职定向考录公务员试题(附答案)
- 2025年新专长针灸考试题及答案
- 高三生物一轮复习课件微专题5电子传递链化学渗透假说及逆境胁迫
- DBJ50-T-306-2024 建设工程档案编制验收标准
- 2025四川雅安荥经县国润排水有限责任公司招聘5人笔试历年参考题库附带答案详解
- 2025中国银行新疆区分行社会招聘笔试备考试题及答案解析
- 污水采样培训课件
- 药品医疗器械试题及答案
- 子宫内膜类器官构建与临床转化专家共识解读 2
- 幼师培训:如何上好一节课
评论
0/150
提交评论