免费预览已结束,剩余72页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数组和字符串 第四章 教学目的与要求 理解数组的定义和使用 掌握数组的常用操作和字符串的处理 教学重点与难点 数组的应用 字符串的处理方法 教学方法 讲授与上机相结合 数组的概念 数组的应用 数组的定义 字符串 本章授课内容 常见错误 4 1数组的概念 数组是一组有序数据的集合 数组中的每一个元素都属于同一个数据类型 用一个统一的数组名和下标来唯一的确定数组中的元素 在科学计算和数据处理中 要用到成批数据 这些数据类型相同 且彼此间存在一定的顺序关系 为了便于处理 引入了数组类型 假设现在要求保存每个学生的成绩 那就不能只使用一个变量score了 而需要40个变量 但这样一来输入 输出 计算都会变得繁琐 在这种情况下 我们可以使用数组类型 说明一个含有40个元素的数组 每个数组元素存放一个成绩 成绩的输入 输出 计算都可通过循环来实现 一 数组的引入 includevoidmain intj sum s 80 floatave sum 0 for j 0 j s j sum sum s j ave sum 80 0 cout ave ave 1 数组 由具有相同类型的固定数量的元素组成的结构 2 数组元素 每一个数组元素都是一个变量 为了与一般的变量相区别 我们称数组元素为下标变量 3 下标变量在数组中的位置序号称下标下标变量的数据类型称为下标类型 或元素类型 二 数组的概念 返回 4 2 1一维数组 一 一维数组的定义 二 一维数组的存储结构 三 数组元素的引用形式 四 一维数组的初始化 六 一维数组程序设计举例 算法 五 一维数组的输入和输出 下一节 数组 是一组具有相同数据类型的变量的有序集合 例如 inta 10 数组名 常量表达式 类型说明 一 一维数组的定义 格式 类型标识符数组名 常量表达式 inta 10 数组名 用户定义的标识符数组名表示了一个存储区的首地址 即第一个数组元素的地址 intn cin n inta n 常量表达式中不能有变量常量表达式的值不能是实数 下标从0开始 a 0 a 1 a 9 没有a 10 常量表达式的值为元素的个数 返回 二 一维数组的存储结构 a 一个数组的所有元素都是连续存储的 数组元素为 a 0 a 1 a 2 a 9 inta 10 所占空间为 类型长度 元素个数 返回 数组首地址 三 数组元素的引用形式 数组元素的引用 数组名 下标 a 0 a 2 a 4 2 2 4 0 inta 10 a 0 2 说明 1 下标可以是整型常量或整型表达式如 a 1 a 2 3 2 数组定义为inta 5 数组长度为5而下标在0 4之内 即a 0 a 4 注意 如果出现a 5 72 编译时不会指出错误 系统会将a 4 后下一个存储单元赋值为72 但这样可能会破坏数组以外其他变量的值 返回 四 一维数组的初始化 概念 在定义一维数组时对各元素指定初始值称为数组的初始化 如 inta 5 1 3 5 7 9 2 说明初值用 括起来 数据之间用逗号分开 对数组的全体元素指定初值 可以不指明数组的长度 系统会根据 内数据的个数确定数组的长度 如 inta 1 3 5 7 9 3 对数组中部分元素指定初值 这时不能省略数组长度 如 inta 5 1 3 5 4 使数组中的全部元素初始值都为0如 inta 5 0 0 0 0 0 更简单的写法 inta 5 0 例4 2 1 输入n个成绩 求平均分 includevoidmain ints n i floataver 0 0 cin n for i 0 i s aver s aver n cout aver ints 80 n i cin s i aver s i aver n for i 0 iaver cout s i 返回 输出高于平均分的成绩 五 一维数组的输入和输出 数组的输入和输出只能逐个对数组元素进行操作 字符数组例外 输入方法 定义 inta 10 i 输入第i个数组元素 cin a i 输入整个数组元素 for i 0 i a i 输出方法 输出第i个数组元素 cout a i 输出整个数组元素 for i 0 i 10 i cout a i 返回 例4 2 2 用一维数组求Fibonacci数列 includevoidmain 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 cout n cout t f i 六 一维数组程序设计举例 f 0 f 1 f 2 f 3 f 4 f 5 f 19 i 2f 2 f 0 f 1 i 3f 3 f 1 f 2 i 4f 4 f 2 f 3 2 3 5 8 6765 例4 2 3 输入一个数据 在已知数组中查找是否有该数据 9 a 0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 includevoidmain inti x inta 10 5 8 0 1 9 2 6 3 7 4 cin x for i 0 i 10 i if x a i cout find endl break if i 10 cout nofind endl 课堂练习 有一个数列 它的第一项为0 第二项为1 以后每一项都是它的前两项之和 试生成此数列的前20项 并按逆序显示出来 练习答案 includeVoidmain intf 20 0 1 j for j 2 j 0 j 逆序显示cout f j cout endl 返回 4 2 2二维数组 一 二维数组的定义 二 二维数组的存储结构 三 二维数组的初始化 四 二维数组元素的引用形式 五 二维数组的输入和输出 六 二维数组程序设计举例 返回 一 二维数组的定义 格式 类型标识符数组名 常量表达式 常量表达式 intb 2 3 b为2 3 2行3列 的数组 b 0 b 1 b b 0 0 b 0 1 b 0 2 b 1 0 b 1 1 b 1 2 b 0 b 1 b 0 0 b 0 1 b 0 2 返回 二 二维数组的存储结构 intb 2 3 b 1 0 b 1 1 b 1 2 b 0 0 b 0 1 b 0 2 存放顺序 按行存放 先顺序存放第一行的元素 再存放第二行的元素 b 0 b 1 可以作为数组名 a 1 0 a 1 1 a 1 2 a 2 0 a 2 1 a 2 2 a 0 0 a 0 1 a 0 2 a 0 0 a 0 1 a 0 2 a 1 0 a 1 1 a 1 2 a 2 0 a 2 1 a 2 2 101010141018102210261030103410381042 数组的元素在内存中是连续存放的inta 3 3 的存放形式如下 a 0 a 1 a 2 C 将二维数组看作一维数组 其每个数组元素又是一个一维数组 返回 三 二维数组的初始化 intb 2 3 1 2 3 4 5 6 intb 2 3 1 2 3 4 5 6 分行赋值 按数组排列的顺序赋值 注意 此方法数据没有明显的界限 当数据较多时容易出错 将数据依次赋给元素b 0 0 b 0 1 b 1 2 返回 intb 3 1 2 3 4 5 6 intb intb 1 2 3 4 5 6 intb n m 错 若全部都赋初值 第一维长度可省略 返回 四 二维数组元素的引用形式 数组名 下标1 下标2 b 0 2 b 1 0 b 0 0 b 0 2 数组元素可以出现在表达式中 也可以被赋值 引用形式 inta 3 4 a 3 4 4 错 注意 1 每个下标都要用 括起来如a 2 1 不能写成a 2 1 2 下标不要超过定义的范围 返回 五 二维数组的输入和输出 数组的输入和输出只能逐个对数组元素进行操 字符数组例外 定义 inta 2 3 i j 返回 六 二维数组程序设计举例 例4 2 4 有一个3 4的矩阵 编程求出其中的最大值及其所在的行号和列号 max row col 12 1 2 includevoidmain inti j row 0 col 0 max inta 3 4 5 2 0 9 3 7 12 6 10 4 1 8 max a 0 0 for i 0 imax max a i j row i col j cout max max cout max a row col 输出 max 12max a 1 2 例4 2 5 将一个矩阵进行转置 即原来的行变为列 includevoidmain inta 3 4 b 4 3 i j for i 0 i a i j for i 0 i 3 i for j 0 j 4 j b j i a i j for i 0 i 4 i for j 0 j 3 j cout b i j cout endl 输入数组a 进行矩阵转置 输出数组b a 0 2 b 2 0 a 2 1 b 1 2 返回 课堂练习 1 数组元素a i 是该数组中的第 个元素 2 元素类型为int的数组a 10 共占用 字节的存储空间 其中元素a 5 的字节地址为 3 元素类型为double的数组a 4 6 共占用 字节的存储空间 其中元素a 2 5 的字节地址为 4 元素类型为char的数组a 10 30 共占用 字节的存储空间 其中元素a 3 4 的字节地址为 答案 1 i 12 40a 203 192a 1364 300a 94 第一方面 利用数组进行数值计算 书中给出了三个例子 一个是计算个人所得税 二是进行矩阵求和 三是按月进行公司产值计算 都具有代表性P103 2 4 3数组的应用 第二方面 利用数组进行统计 书中给出了两个例子 一是统计每个候选人的选票 二是统计每个用电区间的居民户数 P105 1 第三方面 数据排序 数据结构 书中介绍了两种方法 选择排序和插入排序 见后 第四方面 查找数据 数据结构 书中介绍了两种方法 顺序查找 不要求数组元素有序排列 和二分查找 要求数组元素有序排列 P109 1 基本算法举例1 排序 1 冒泡法排序 例4 3 1 输入5个数 进行由小到大排序 98542 算法 两两比较 大数向后移 找到最大数放在最后 再在剩余的的4个数中进行两两比较 找到最大数 以此类推 最后 小数排在开始 相当于浮起 故称之为 冒泡法 85429 5428 425 24 比较4次第一轮 比较3次第二轮 比较2次第三轮 比较1次第四轮 98542 89542 85942 85492 8542 5842 5482 542 42 452 对n个数 则要进行n 1趟扫描 在第i趟扫描中要进行n i次比较 可以推知 排序 for i 0 ia j 1 t a j a j a j 1 a j 1 t include defineN10voidmain inti j a N t for i 0 i a i for i 0 i N i 输出cout a i 排序 for i 0 ia j 1 t a j a j a j 1 a j 1 t for i 0 i N i 输出cout a i 源程序 例4 3 1 2 选择法排序 特点 比较后不立即互换元素 而是记下其位置并在每一轮比较完毕后和 互换 首先 比较的元素不同 以降序为例 是当前元素与上次比较後的最大元素进行比较 因此 在进行比较之前 要有一个初始化最大元素的过程 其次 确定完毕的元素的互换是在每一轮完成后进行的 而不是在比较后进行的 再次 互换元素的不同 为 i 和 iMax 举例原始数据 3 5 7 9 4要求 降序 第一轮比较 初始化设最大元素下标为k 03579 k 03579 k 13579 k 23579 k 3k 3A 0 与A k 交换的结果 9573 includeconstintN 10 voidmain inta N i j k t for i 0 i a i for i 0 ia k k j if k i t a i a i a k a k t 源程序 例4 3 2 for i 0 i N i cout a i 2 在有序数组中插入一个数后使原数组仍然有序 例如 3571218 m 5 将b 10插入步骤 1 要找到b在数组中的位置 2 给b让位置 3 将b放到该位置上 4 数组元素的个数m加1 b 10 for i 0 ib break for j m 1 j i j a j 1 a j a i b 12 18 10 程序见例4 3 3 m m 1 4 357101218 m 6 将b 10删除步骤 1 要找到b在数组中的位置 2 后面的数组元素依次前移 覆盖该位置上的数组元素即可实现删除 3 数组元素的个数m减1 3 在有序数组中删除一个数 例如 for i 0 i m i if a i b break 10 12 18 for j i j m 1 j a j a j 1 3 m m 1 是对有序数列进行查找的一种高效查找办法 其基本思想是逐步缩小查找范围 采取半分作为分割范围可使比较次数最少 比较过程 设数列已做升序排序处理 设置三个变量 分别代表数组序列s的low high和mid位置 其中mid low high 2 进行下列判断 134681012151820 X 15 4 查找 1 顺序查找 2 折半查找法 对有序数组 返回 程序见例4 3 4 4 4字符串 二 字符串及字符串结束标志 四 字符数组的输入和输出 五 字符串处理函数 六 字符数组程序应用 一 字符数组的定义 三 字符数组的初始化 返回 一 字符数组 用来存放字符数据的数组为字符数组 charc 10 charc 10 I a m h a p p y 若初值个数小于数组长度 剩余元素自动定为空字符 charc 12 c p r o g r a m intc 10 定义 初始化 二者互相通用 但存储空间不同 返回 二 字符串和字符串结束标志 C 中没有专门的字符串变量 因此字符串存放在字符数组中 字符串以 0 作为结束标志 字符串 由若干个有效字符组成的序列有效字符包括字母 数字 专用字符 转义字符如 bfer a45 7 m tk n 例 charc 5 c 0 O c 1 K c 2 c 0 O c 1 K c 2 c 3 0 注意 字符数组与字符串并不相同 返回 三 字符数组的初始化 如果对数组全部元素指定初值 则可以省略数组的长度charc H e l l o 返回 1 为数组中的元素指定初值charc 8 H e l l o 2 对字符数组指定字符串初值 charc 8 Hello charc 8 Hello charc 8 H e l l o 0 charc Hello charc 6 Hello charc 5 Hello 错误的初始化 注意 初始化时数组的长度应足够大 确保可以容纳所有字符和结束标志 0 返回 1 输入单个字符charc 8 inti cin c 0 c 1 c 2 for i 0 i c i 2 整个数组的输入输出 即按数组名输入输出 仅用于字符数组 因数组名本身代表数组的首地址 四 字符数组的输入和输出 返回 注意 1 输入 输出字符串时不包括 2 cin输入时系统一直读取字符 直到遇到 空白符 为止 例如 输入数据helloworldC数组中内容为hello 返回 补充get 函数 包含在 iostream h 如想输入含空格的字符串 如 helloworld 只能使用get 函数 使用格式如下 cin get 字符数组名 字符串长度 规定的结束符 其中 规定的结束符省略时 默认为回车键 如 charstr 20 cin get str 20 五 字符串处理函数 字符串函数的原型保存在中字符串连接函数 strcat s1 s2 char strcat char s1 constchar s2 连接s1和s2两个字符串赋给s1 返回s1的值字符串拷贝函数 strcpy s1 s2 char strcpy char s1 constchar s2 将s2中的字符串赋给s1 返回s1的值字符串比较函数 strcmp s1 s2 求字符串长度函数 strlen s 函数值为整数 返回字符个数 参数为字符数组名 六 字符数组程序应用 字符串的长度 逆序 字符串函数 返回 例4 4 1 求字符串长度 扫描数组 只要不是 0 计数器就加1 源程序 includevoidmain inti chars 50 cin s for i 0 i 50 i for i 0 i 50 i i 0 字符串函数 例4 4 2 STRCAT includevoidmain inti j chars1 40 s2 20 cin s1 s2 for i 0 i 40 s1 s2 s1 i strlen s1 例4 4 3 STRCPY includevoidmain charp1 80 p2 80 inti cin p2 for i 0 p2 i 0 i p1 i p2 i p1 i 0 cout p1 p1 np2 p2 n 例4 4 4 综合举例 某班有50个学生 期终考试8门课程 求每个学生总成绩 平均成绩 并按总成绩高分到低分输出 上机作业 skip charname 51 12 采用外部数组实现数据传递 floatcj 51 9 floattacj 51 3 includevoidinput 函数声明 voidcount voidsort voidoutput voidmain input 调用输入函数 count 调用计算函数 sort 调用排序函数 output 调用输出函数 voidinput 输入函数 inti j for i 1 i name i for j 1 j cj i j voidcount 计算函数 inti j for i 1 i 50 i tacj i 1 0 for j 1 j 8 j tacj i 1 cj i j tacj i 2 tacj i 1 8 voidsort 排序函数 inti flag charts 12 floattc do flag 0 for i 1 itacj i 1 strcpy ts name i strcpy name i name i 1 strcpy name i 1 ts 交换姓名 for j 1 j 8 j 交换8门课程成绩 t cj i j cj i j cj i 1 j cj i 1 j t t tacj i 1 tacj i 1 tacj i 1 1 tacj i 1 1 t 交换总成绩 t tacj i 2 tacj i 2 tacj i 1 2 tacj i 1 2 t 交换平均成绩 flag 1 while flag 1 voidoutput 输出函数 inti cout 50个学生成绩处理结果如下 n cout 姓名课程1课程2课程3课程4课程5课程6课程7课程8总成绩平均成绩名次 n for i 1 i 50 i cout name i for j 1 j 8 j cout cj i j cout tacj i 1 tacj i 2 i cout n 常见错误 1 数组下标越界 如 inta 10 1 2 3 4 5 6 7 8 9 10 for i 1 i 10 i cout a i C 规定定义时用a 10 表示数组有10个元素 而不是可以用的最大下标值为10 数组只包括a 0 到a 9 10个元素 因此用a 10 超出范围 for i 0 i 9 i cout a i 2 数组整体赋值 inta 10 intb 10 1 2 3 4 5 6 a b 不允许对数组进行整体操作 如果把数组a赋值给数组b 需要用循环语句来实现 for i 0 i 10 i a i b i 3 误以为数组名代表数组中全部元素 main inta 4 1 2 3 4 cout a 企图用数组名代表全部元素 中 数组名代表数组首地址 不能通过数组名输出4个整数 cout a 0 a 1 a 2 a 3 或 for i 0 i 3 i cout a i 4 引用数组元素时使用圆括号 cout a 5 5 向一个字符数组赋字符串 charstr 20 str Iamaboy 这种错误和第二种错误为一种错误 即不支
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓库货物分类与库存管理工具
- 酒店升级改造项目可行性分析
- 魏县拆迁施工方案
- 河边应急预案方案
- 直播赛场活动策划方案
- 小学语文期中考试卷设计与命题技巧
- 垃圾外排施工方案
- 招聘流程自动化配置指南
- 初中英语日常口语教学设计案例
- 停车画线施工方案
- 学生成长评估
- 进出口关务培训
- 2024年中考生物真题分类汇编(全国):专题18 实验(第01期)(教师版)
- 《运动康复技术》课件-Bobath技术
- 国家储备林树种目录(2025年版)
- 2025届高考语文二轮备考复习策略讲座
- 数据通信网络配置与管理手册
- GB/T 45202-2025牛体外胚胎生产和移植技术规程
- 心理辅导 互帮互助团结协作教学设计 高中一年级体育与健康教育教学设计
- 木偶戏演员演出合同补充协议
- 青果软件教务系统建设方案
评论
0/150
提交评论