c语言(数组与字符串).ppt_第1页
c语言(数组与字符串).ppt_第2页
c语言(数组与字符串).ppt_第3页
c语言(数组与字符串).ppt_第4页
c语言(数组与字符串).ppt_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章数组与字符串 数组概述一维数组二维数组多维数组字符串综合应用 杨辉三角跟我上机 第7章数组与字符串 数组概述一维数组二维数组多维数组字符串综合应用 杨辉三角跟我上机 第7章数组与字符串 数组概述一维数组二维数组多维数组字符串综合应用 杨辉三角跟我上机 第7章数组与字符串 数组概述一维数组二维数组多维数组字符串综合应用 杨辉三角跟我上机 第7章数组与字符串 数组概述一维数组二维数组多维数组字符串综合应用 杨辉三角跟我上机 第7章数组与字符串 数组概述一维数组二维数组多维数组字符串综合应用 杨辉三角跟我上机 第7章数组与字符串 数组概述一维数组二维数组多维数组字符串综合应用 杨辉三角跟我上机 第7章数组与字符串 数组概述一维数组二维数组多维数组字符串综合应用 杨辉三角跟我上机 7 1数组概述 到目前为止 所使用的变量都有一个共同的特点 就是每个变量只能存储一个数值 比如定义三个变量num money和cname 代码如下 intnum doulbemoney charcname 这三个变量属于不同的数据类型 所以只能一次定义一个变量 如果这三个量属于同一种数据类型 就可以使用数组一起定义多个变量 7 1数组概述 数组表示的是一组数据类型相同的数 这组数当中的每一个元素都是一个独立变量 数组就是用来存储和处理一组相同类型的数据的 7 2一维数组 7 2 1一维数组的定义7 2 2一维数组的初始化7 2 3一维数组元素的操作7 2 4数组作为参数传递7 2 5一维数组的应用举例 7 2 1一维数组的定义 一维数组定义的一般形式为 类型说明符数组名 常量表达式 例如 intcode 5 或者 defineNUM5intcode NUM 上述两种形式都正确的定义一个名称code的整型数组 该数组含有5个整型变量 这5个整型变量的下标 依次是 code 0 code 1 code 2 code 3 和code 4 在C语言当中 数组的下标总是从0开始记的 而不是从1开始 这一点大家需要格外注意 特别是最初接触到数组 7 2 1一维数组的定义 使用code数组存储上节中建立的数据表中的序号列中的数据 如下表所示 7 2 1一维数组的定义 表中数组code中元素code 0 是一个整型变量 它存储的是数据5 它在使用上一般的变量没有区别 比如intx 5 code 0 与x不同的地方只是code 0 采用了数组名和下标组合的形式 比如下面的代码 printf code 0 d code 4 d n code 0 code 4 输出结果是code 0 5 code 4 2又如下面的代码 for inti 0 i 5 i printf code d d n code i 输出的结果是code 0 5code 1 3code 2 1code 3 4code 4 2 7 2 1一维数组的定义 1 数组定义的说明 数组使用的是方括号 不要误写成小括号 intname 10 是错误的形式 数组命名必须按照命名规则 数组下标总是从0开始的 以上面定义的code数组为例 数组的元素下标的范围是从0到4 而不是从1到5 大于4的下标会产生数组溢出错误 下标更不能出现负数 code 0 是存在的 可以正确的访问 code 4 是存在的 可以正确的访问 code 5 是不存在的 无效的访问 code 1 是错误的形式 7 2 1一维数组的定义 定义数组时 code 5 中括号中的数字5 表示的是数组中元素的总数 使用数组时 code 2 1中括号中的数值是下标 表示的是使用的数组中哪一个元素 在定义数组元素总数时 如上例中的5或者NUM 在数组的定义时 要求括号中数据一定要是常量 而不能是变量 但是数组定义后 使用该数组的元素时 下标可以是常量 也可以是变量 或者表达式 7 2 1一维数组的定义 intnumber 5 intcode number 在编译这样代码时 编译器会报错 假如code数组已经正确定义 下面的使用是正确的intn 3 code n 100 等价于code 3 100 code n 1 80 等价于code 4 80 code n 2 65 等价于code 1 65 这个是需要注意的 下标只能是整数 如果是浮点数编译器会舍弃小数位取整数部分 code 2 code 1 n code 0 99 56 等价于code 0 99 因为code 0 本就是一个整型变量 赋值时数据类型转换 直接把浮点数舍弃小数位后赋值给了code 0 7 2 1一维数组的定义 2 其他类型数组的定义 整型数组的定义intarray 10 包含10个整型元素的数组名为array的数组 下标范围从0到9 浮点型数组的定义floatscore 3 包含3个float类型元素的数组名为score的数组 下标范围从0到2 字符型数组的定义charname 5 包含5个char类型元素的数组名为name的数组 下标范围从0到4 7 2 1一维数组的定义 3 数组的地址数组code的存储区域 在某一个地址中存储了code 0 元素值5 然后地址从低到高 每次增加4个字节 int类型占用4个字节 顺序存储了其他数组元素的值 假如现在已知code 0 在内存的地址 那么code 1 的地址是多少呢 code 1 的就是在code 0 的地址基础上加4个字节 同理 code 4 的地址就是在code 0 地址的基础上加4个 4字节 共16个字节 所以对于数组 只要知道数组的首地址 那么就可以根据偏移量计算出待求数组元素的地址 7 2 1一维数组的定义 数组的首地址又怎么得到呢 其实C语言在定义数组时就已经为预先设置好了这个地址 这个预设值就是数组名 比如要输出数组的首地址 就可以采用下面的方式 printf code的首地址是 d n code 输出结果就是code数组的首地址值 关于地址的更多的使用方法 大家可以参看后续指针章节详细讲解 7 2 2一维数组的初始化 1 先定义数组 再进行初始化如下代码 intcode 5 定义整型数组 数组有5个元素 下标从0到4 code 0 5 数组第0个元素赋值 code 1 3 数组第1个元素赋值 code 2 1 数组第2个元素赋值 code 3 4 数组第3个元素赋值 code 4 2 数组第4个元素赋值 7 2 2一维数组的初始化 2 在定义的同时对其初始化intcode 5 5 3 1 4 2 定义整型数组 同时初始化数组的5个元素 数学当中使用 表示的是集合的含义 这里也一样 这对括号就是圈定了这组数组的值 或者省略数组元素个数 如下面的语句 intcode 5 3 1 4 2 因为 中是每个数组元素的初值 初始化也相当告诉了数组中有多少个元素 所以可以省略 中的5 对于定义数组同时对其初始化 可以省略中括号中数组的个数 但是如果分开写就是错误的 如下面的代码所示 7 2 2一维数组的初始化 intcode 5 定义数组 code 5 5 3 1 4 2 错误的赋值 或者code 5 3 1 4 2 错误的赋值 上面都是错误的形式 intcode 错误的数组定义 code 0 5 错误的赋值 code 1 3 错误的赋值 定义数组时没有定义数组元素的个数 使用时就会发生异常 原因是内存中并没有为数组code开辟任何存储空间 数据自然无处存放 7 2 2一维数组的初始化 数组初始化时常见的其他情况如下所示 定义数组时省略 内元素总数intcode 10 1 2 3 4 5 表示code数组共有10个元素 仅对前5个进行了初始化 后面5个元素编译器自动初始化为0 intcode 1 2 3 4 5 表示code数组共有5个元素 初始化code 0 1 code 1 2 code 4 5 元素初始化为0intcode 5 0 0 0 0 0 或者intcode 5 0 二者含义相同 都是对5个元素初始化为0 显然第二种方式更为简洁 7 2 3一维数组元素的操作 inti intarray 5 1 2 3 4 5 定义数组 同时初始化 for i 0 i 5 i 循环访问数组元素 printf d array i 输出结果是1 2 3 4 5此代码中定义array为整型数组 包含5个整型元素 并同时初始元素值 分别是 array 0 1 array 1 2 array 2 1 array 3 2 array 4 5for语句中循环变量i初值是0 终值是4 步长是1 调用printf 函数就可以访问到数组array中的每一个元素了 注意 变量i的范围是0 4 否则程序会报数组溢出错误 7 2 3一维数组元素的操作 范例7 1 一维数组的输入输出 01 include02 defineMAXGRADES5 数组元素总数 03intmain void 04 05intcode MAXGRADES 定义数组 06inti 07 输入数据 08for i 0 i MAXGRADES i 循环遍历数组 09 10printf 输入一个数据 11scanf d 17 7 2 3一维数组元素的操作 范例7 2 使用一维数组计算元素的和以及平均值 01 include02 defineMAX5 数组元素总数 03intmain 04 05intcode MAX 定义数组 06inti total 0 07for i 0 i MAX i 输入数组元素 08 09printf 输入一个数据 10scanf d 19 7 2 4数组作为参数传递 如何把数组作为参数传递给函数 可以使用数组名作为参数进行传递 例如 主函数中有整型数组定义 intarray 5 调用函数的语句如下 findMax array 这里使用数组名作为参数传递给函数findMax 实参数据类型需要和形参数据类型一致才可以 所以可以这样定义findMax 函数的参数 voidfindMax inta 5 或者可以省去数组5 写成下面的形式voidfindMax inta 7 2 4数组作为参数传递 范例7 3 求数组最大值 01 include02 defineMAXELS503voidfindMax int MAXELS 定义函数 04intmain 05 06intnums MAXELS 2 18 1 27 16 数组初始化 07findMax nums 08return0 09 10voidfindMax intvals MAXELS 查找最大值函数 11 12inti max vals 0 13for i 1 i MAXELS i 14if max vals i 15max vals i 16printf Themaximumvalueis d n max 17 7 2 4数组作为参数传递 提示 调用函数时 变量是按照传值方式传递的 而数组是按照传地址方式传递的 这就是说 对于变量 实参可以改变形参 形参的改变不会影响到实参 对于数组 实参可以改变形参 形参的改变也会改变实参 7 2 4数组作为参数传递 范例7 4 传值和传地址 7 2 5一维数组的应用举例 范例7 5 将一个数组逆序输出01 include02 defineN503intmain void 04 05inta N 9 6 5 4 1 i temp 定义数组 06printf 原数组 n 07for i 0 i N i 输入元素 08printf 4d a i 09for i 0 i N 2 i 交换数组元素 10 11temp a i 12a i a N i 1 13a N i 1 temp 14 15printf n排序后数组 n 16for i 0 i N i 输出元素 17printf 4d a i 输出格式元素占4列 18printf n 19return0 20 7 2 5一维数组的应用举例 范例7 6 输出100内的素数 7 3二维数组 7 3 1二维数组的定义7 3 2二维数组的初始化7 3 3二维数组元素的操作7 3 4二维维数组的应用举例 7 3 1二维数组的定义 二维数组定义的一般形式为类型说明符数组名 常量表达式 常量表达式 例如 inta 3 4 定义a为3行4列的数组 intb 5 10 b为5 10 5行10列 的数组 不能写成下面的形式inta 3 4 错误数组定义 intb 5 10 错误数组定义 7 3 1二维数组的定义 7 3 1二维数组的定义 已知a 0 0 在内存中的地址 a 1 2 的地址是多少呢 计算方法是如下 a 1 2 的地址 a 0 0 地址 24字节24字节 1行 4 列 2列 4字节还需要注意到数组a 3 4 元素下标的变化范围 行号范围是从0到2 列号范围是0到3 7 3 2二维数组的初始化 1 先定义再初始化inta 3 4 a 0 0 1 a 2 3 9 2 定义同时初始化inta 3 4 1 2 3 4 5 6 7 8 9 0 1 2 或者inta 3 4 1 2 3 4 5 6 7 8 9 0 1 2 已经讲过了 二维数组在内存中是按线性顺序存储的 所以内存括号可以省去 不会产生影响 还可以这样 inta 4 1 2 3 4 5 6 7 8 9 0 1 2 或者inta 4 1 2 3 4 5 6 7 8 9 0 1 2 省去3也是可以的 但是4是不能省去的 编译器会根据所赋的数值的个数及数组的列数 自动计算出数组的行数 7 3 2二维数组的初始化 分析下面的二维数组的初始化后的值inta 3 4 1 5 9 可以认为二维数组是由3个一维数组构成的 每个一维数组有4个元素 那就可以和一维数组初始化衔接上了 经过上述初始化 数组a元素的值如下表所表示的形式 7 3 3二维数组元素的操作 二维数组元素的操作和一维数组元素的操作相似 一般使用双重循环遍历数组的元素 外层循环控制数组的行标 内层循环控制数组的列标 如下所示 inti j intarray 3 4 for i 0 i 3 i for j 0 j 4 j array i j 4 i j 经过上面双循环的初始化操作 数组array 3 4 的元素的值是 0 1 2 3 4 5 6 7 8 9 10 11 原因是4 i j i表示行号 j表示列号 首先赋值i 0的行的数组元素值是 0 1 2 3 然后内层循环结束 接下来外层循环变量i 1 继续对数组元素赋值 4 5 6 7 这样反复进行 就会得到上面的元素值 7 3 4二维维数组的应用举例 范例7 7 求一个3 3矩阵对角线元素之和 01 include02intmain 03 04floata 3 3 sum 0 05inti j 06printf 请输入3 3个元素 n 07for i 0 i 3 i 循环输入9个元素 08 09for j 0 j 3 j 10scanf f 16 7 3 4二维维数组的应用举例 范例7 8 将一个二维数组行和列元素互换 存到另一个二维数组中 01 include02intmain void 03 04inta 2 3 1 2 3 4 5 6 数组a 05intb 3 2 i j 06printf arraya n 07for i 0 i 1 i 08 09for j 0 j 2 j 10 11printf 5d a i j 输出数组a 12b j i a i j 行列互换存储到数组b 13 14printf n 15 16printf arrayb n 17for i 0 i 2 i 输出数组b 18 19for j 0 j 1 j 20printf 5d b i j 21printf n 22 23return0 24 7 4多维数组 例如定义一个三维数组 intpoint 2 3 4 三维数组point共有2 3 4 24个元素组成 其中多维数组靠左边维变化速度最慢 靠右边维变化速度最快 从左至右逐渐增加 point数组在内存中仍然是按照线性结构占据连续的存储单元 地址从低到高的顺序如下所示 7 4多维数组 point 0 0 0 point 0 0 1 point 0 0 2 point 0 0 3 point 0 1 0 point 0 1 1 point 0 1 2 point 0 1 3 point 0 2 0 point 0 2 1 point 0 2 2 point 0 2 3 point 1 0 0 point 1 0 1 point 1 0 2 point 1 0 3 point 1 1 0 point 1 1 1 point 1 1 2 point 1 1 3 point 1 2 0 point 1 2 1 point 1 2 2 point 1 2 3 遍历三维数组 通常使用三重循环实现 以point 2 3 4 数组为例说明 inti j k 定义循环变量 intpointf 2 3 4 定义数组 for i 0 i 2 i 循环遍历数组 for j 0 j 3 j for k 0 k 4 k printf d point i j k 7 5字符串 字符串是使用双引号包含的字符序列 也把字符串称为字符串常量 比如下面所示的内容就是字符串 helloworld 123abc 在C语言中 字符串存储成一个指定的以 0 作为结束标志的字符串 其中 0 是转义符 比如 helloworld 字符串 它并不是像看到的占用了11个存储字节 而是占用了内存中12个字节 0 是编译器自动加上的 是字符串的一部分 占用一个存储单元 7 5字符串 字符串 helloworld 在内存中的存储形式如下图所示 7 5 1字符串和字符数组 认识了字符串 它和字符数组有着什么的相同和不同点呢 字符数组是由字符构成的数组 它跟之前讲的数组使用方法一样 可以这样定义字符串 如下所示charc 11 h e l l o w o r l d 或者charc h e l l o w o r l d c 0 h c 11 d 或者先定义数组再进行初始化都是可以的 7 5 1字符串和字符数组 注意到上面提到两个图是不同的 字符所占的字节数是不同的 字符串的最后一位字符 是由编译器自动的加上了 0 而字符数组没有被添加 字符串的长度是12 而字符数组的长度是11 当然也可以设置字符数组的长度是12 如下所示 charc h e l l o w o r l d 0 正如上面提到的例子 字符串和字符数组在很多时候是可混用的 下面仍然是初始化字符串 换一种方式 不再按照数组赋值方法 对数组元素一个个赋值 而是使用一次性初始化的方法 charc helloworld 使用双引号 或者charc helloworld 等效方法 可以省去大括号 还是可以按照字符数组的方式对字符串进行操作 7 5 1字符串和字符数组 范例7 9 字符串和字符数组01 include02intmain 03 04charc abc 初始化字符串 05printf s n c 输出字符串 06printf c n c 0 输出c 0 字符 07c 1 w 修改c 1 字符为w 08printf s n c 09return0 10 7 5 2字符串的输入输出 在第6章中 已经学习了字符串输入输出函数 gets 和puts 此处比较一下它们与scanf 和printf 的异同 标准输出函数printf和puts函数功能上基本上是完全一样的 例如 charc message 定义字符数组 printf s c 输出结果是 message 没有换行 puts c 输出结果是 message 并换行 可以得出当puts 函数在遇到 0 时 就会被替换为 n 实现换行的作用 除此以外 二者没有什么区别 7 5 2字符串的输入输出 标准输出函数scanf和gets函数就有些不大相同了 比如scanf s c 输入 message 按 Enter 键 C中内容为 message sca

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论