




免费预览已结束,剩余79页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 利用数组处理批量数据 本章要点 掌握一维 二维数组的定义和引用方法 存储结构和初始化方法掌握有关一维数组的有关算法掌握数组的运算 前面我们学习了C语言中的基本类型 整型 intlongunsignedint实型 floatdouble字符型 char这些都是简单的数据类型 对于有些数据 只用简单的数据类型是不够的 难以反映出数据的特点 也难以有效地进行处理 引言 如果有1000名学生 每个学生有一个成绩 需要求这1000名学生的平均成绩 用s1 s2 s3 s1000表示每个学生的成绩 能体现内在联系 C语言用方括号中的数字表示下标 如用s 15 表示 数组名 C语言还提供了构造类型的数据 数组类型 结构体类型 共用体类型 构造类型数据是由基本类型数据按一定规则组成的 因此也可以称之为 导出类型 数组 是有序数据的集合 数组中的每一个元素都属于同一个数据类型 一个数组用一个统一的名称 数组名表示 数组中的元素由数组名和下标来唯一地确定 数组有一维数组 二维数组等 6 1怎样定义和引用一维数组6 2怎样定义和引用二维数组6 3字符数组 主要内容 6 1怎样定义和引用一维数组 6 1 1怎样定义一维数组6 1 2怎样引用一维数组元素6 1 3一维数组的初始化6 1 4一维数组程序举例 6 1 1怎样定义一维数组 例 inta 10 表示数组名为a 含有10个整型元素的数组 10个元素即 a 0 a 1 a 2 a 9 定义数组后 程序运行时 系统自动为数组开辟10个连续的大小为4个字节的存储空间 每个空间可存放一个整数 类型说明符数组名 常量表达式 说明 1 数组名的命名方式和变量名相同 遵循标识符的命名规则 2 数组名后面是用 括起来的常量表达式 不能用 3 常量表达式表示元素的个数 即数组长度 定义了inta 10 数组的下标从0开始 就不存在数组元素a 10 4 常量表达式可以是常量或符号常量 但不能是变量 C不允许对数组的大小作动态定义 即数组的大小不依赖于程序运行过程中变量的值 intn scanf d 错误 6 1 2怎样引用一维数组元素 C语言规定 1 数组必须先定义后引用 2 只能逐个引用数组元素而不能一次引用整个数组 数组元素的表示形式为 数组名 下标 例如 a 0 a 5 a 7 a 2 3 可为整型常量或整型表达式 区别 inta 10 定义了一个长度为10的整型数组t a 6 引用数组中序号为6的数组元素 例6 1对10个数组元素依次赋值为0 1 2 3 4 5 6 7 8 9 要求按逆序输出 解题思路 定义一个长度为10的数组 数组定义为整型要赋的值是从0到9 可以用循环来赋值用循环按下标从大到小输出这10个元素 includeintmain inti a 10 for i 0 i 0 i printf d a i printf n return0 使a 0 a 9 的值为0 9 a 0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 先输出a 9 最后输出a 0 6 1 3一维数组的初始化 数组的初始化就是在定义数组时对全部或部分赋以初值 如果对数组不赋初值 则数组元素取随机值 auto 如 inta 3 printf d d d n a 0 a 1 a 2 若定义数组时前面加上static 说明为静态数组 关键词 则系统自动对所有元素赋初值0 否则数组元素取值不确定 如 staticinta 3 printf d d d n a 0 a 1 a 2 在定义数组的同时 给各数组元素赋值inta 10 0 1 2 3 4 5 6 7 8 9 inta 10 0 1 2 3 4 相当于inta 10 0 1 2 3 4 0 0 0 0 0 inta 10 0 0 0 0 0 0 0 0 0 0 相当于inta 10 0 inta 5 1 2 3 4 5 可写为inta 1 2 3 4 5 6 1 4一维数组程序举例 例6 2用数组处理Fibonacci数列问题 解题思路 例5 8中用简单变量处理的 缺点不能在内存中保存这些数 假如想直接输出数列中第25个数 是很困难的 如果用数组处理 每一个数组元素代表数列中的一个数 依次求出各数并存放在相应的数组元素中 方便读取 includeintmain 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 printf n return0 例6 3用冒泡法对10个数排序 由小到大 基本思想 将相邻两个数比较 小的调到前面 大的调到后面 就象气泡一样 小的往 上升 大的往 下沉 所以称为 冒泡排序 算法 以六个数9 8 5 4 2 0为例 985420 895420 859420 854920 854290 854209 a 0 a 1 a 2 a 3 a 4 a 5 for i 0 ia i 1 t a i a i a i 1 a i 1 t 第一趟 小数起泡 大数沉底 第一趟6个数进行了5次比较 即循环了5次 854209 584209 548209 542809 542089 a 0 a 1 a 2 a 3 a 4 a 5 第二趟 第二趟5个数进行了4次比较 即循环了4次 for i 0 ia i 1 t a i a i a i 1 a i 1 t 542089 452089 425089 420589 a 0 a 1 a 2 a 3 a 4 a 5 第三趟 第三趟4个数进行了3次比较 即循环了3次 for i 0 ia i 1 t a i a i a i 1 a i 1 t 420589 240589 204589 a 0 a 1 a 2 a 3 a 4 a 5 第四趟 for i 0 ia i 1 t a i a i a i 1 a i 1 t 204589 024589 a 0 a 1 a 2 a 3 a 4 a 5 第五趟 for i 0 ia i 1 t a i a i a i 1 a i 1 t 第1趟比较后 剩5个数未排好序 两两比较5次第2趟比较后 剩4个数未排好序 两两比较4次第3趟比较后 剩3个数未排好序 两两比较3次第4趟比较后 剩2个数未排好序 两两比较2次第5趟比较后 全部排好序 两两比较1次 对于n个数的排序 需进行n 1趟比较 第j趟比较需进行n j次两两比较 用两层嵌套循环实现 算法分析 for i 0 ia i 1 for i 0 ia i 1 for i 0 ia i 1 for i 0 ia i 1 for j 0 j 5 j 程序流程图 inta 10 inti j t printf input10numbers n for i 0 ia i 1 t a i a i a i 1 a i 1 t printf thesortednumbers n for i 0 i 10 i printf d a i printf n 6 2 1怎样定义二维数组6 2 2怎样引用二维数组的元素6 2 3二维数组的初始化6 2 4二维数组程序举例 6 2怎样定义和引用二维数组 一般形式 类型符数组名 常量表达式 常量表达式 6 2 1怎样定义二维数组 例如 inta 3 4 inta 3 4 不合法 定义了一个3 4 3行4列 的数组 包含 二维数组的理解 看作特殊的一维数组 其元素又是一个一维数组 例如 inta 3 4 将a看成一个一维数组 有3个元素 a 0 a 1 a 2 每个元素又是一个包含4个元素的一维数组 a 0 0 a 0 1 a 0 2 a 0 3 a 1 0 a 1 1 a 1 2 a 1 3 a 2 0 a 2 1 a 2 2 a 2 3 a 0 a a 1 a 2 右图表示对数组a 3 4 存放的顺序 存放顺序 二维数组元素的表示形式 数组名 下标 下标 1 下标可以是整型常量或整型表达式 a 1 2 a 2 1 2 2 1 2 数组元素可以出现在表达式中 也可以被赋值 a 2 4 3 b 1 2 a 2 3 2 数组的下标不得越界使用 inta 3 4 表示3行和4列 a 3 4 3 错误 元素a 3 4 不存在 6 2 2怎样引用二维数组的元素 6 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 inta 3 4 1 0 6 0 0 11 inta 3 4 1 5 6 inta 3 4 1 0 0 11 第一维长度可不指定 但第二维长度不能省 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 4 全部赋初值 例6 4将一个二维数组行和列的元素互换 存到另一个二维数组中 6 2 4二维数组程序举例 解题思路 可以定义两个数组 数组a为2行3列 存放指定的6个数数组b为3行2列 开始时未赋值将a数组中的元素a i j 存放到b数组中的b j i 元素中用嵌套的for循环完成 二维数组的遍历访问 扫描 一般都采用双重循环处理 行循环 列循环 includeintmain 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 处理a的一行中各元素 处理a中某一列元素 输出a的各元素 a元素值赋给b相应元素 printf arrayb n for i 0 i 2 i for j 0 j 1 j printf 5d b i j printf n return0 输出b的各元素 例6 5有一个3 4的矩阵 要求编程序求出其中值最大的那个元素的值 以及其所在的行号和列号 解题思路 采用 打擂台算法 先把a 0 0 的值赋给变量maxmax用来存放当前已知的最大值a 0 1 与max比较 如果a 0 1 max 则表示a 0 1 是已经比过的数据中值最大的 把它的值赋给max 取代了max的原值以后依此处理 最后max就是最大的值 记行号 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 nrow d ncolum d n max row colum 记最大值 记列号 6 3 1怎样定义字符数组6 3 2字符数组的初始化6 3 3怎样引用字符数组中的元素6 3 4字符串和字符串结束标志6 3 5字符数组的输入输出6 3 6善于使用字符串处理函数6 3 7字符数组应用举例 6 3字符数组 用来存放字符数据的数组是字符数组字符数组中的一个元素存放一个字符 6 3 1怎样定义字符数组 例如 charc 10 c 0 I c 1 c 2 a c 3 m c 4 c 5 h c 6 a c 7 p c 8 p c 9 y 字符型与整型可以通用 但有区别 charc 10 在内存中占10字节 intc 10 在内存中占40字节 charc 10 I a m h a p p y charc 10 c p r o g r a m 6 3 2字符数组的初始化 c 0 c 1 c 2 c 3 c 4 c 5 c 6 c 7 c 8 c 9 c 0 c 1 c 2 c 3 c 4 c 5 c 6 c 7 c 8 c 9 1 逐个初始化 2 初值个数小于数组长度时 则后面的元素自动置为空字符 0 chardiamond 5 5 3 可以定义一个初始化的二维字符数组 例6 6输出一个已知的字符串 解题思路 定义一个字符数组 并用 初始化列表 对其赋以初值用循环逐个输出此字符数组中的字符 6 3 3怎样引用字符数组中的元素 includeintmain charc 15 I a m a s t u d e n t inti for i 0 i 15 i printf c c i printf n return0 例6 7输出一个菱形图 解题思路 定义一个字符型的二维数组 用 初始化列表 进行初始化用嵌套的for循环输出字符数组中的所有元素 includeintmain chardiamond 5 inti j for i 0 i 5 i for j 0 j 5 j printf c diamond i j printf n return0 在C语言中 是将字符串作为字符数组来处理的关心的是字符串的有效长度而不是字符数组的长度为了测定字符串的实际长度 C语言规定了字符串结束标志 0 6 3 4字符串和字符串结束标志 0 代表ASCII码为0的字符 它不是一个可以显示的字符 而是一个 空操作符 即什么也不做 用它作为字符串结束标志不会产生附加的操作或增加有效字符 只起一个供辨别的标志 如 printf Howdoyoudo n 系统自动在 n后加 0 执行printf函数时 对输出字符逐个进行检查 遇 0 便停止输出 charc Iamhappy C语言允许用字符串常量方式对字符数组进行初始化 注意双引号 charc I a m h a p p y 0 c的长度是11 c的长度是10 同于 不同于 charc I a m h a p p y 可写成charc Iamhappy 又如 charc 10 China 可写成charc 10 China 从c 5 开始 元素值均为 0只显示printf s c 1 逐个字符输入输出 用格式符 c 例如 inti charc 5 for i 0 i 5 i 逐个输入scanf c 2 整个字符串 string 一次输入或输出 用格式符 s 输出时遇到结束符 0 就停止 例如 charc China printf s c 两种方法 6 3 5字符数组的输入输出 注意 输出字符不包括结束符 0 用 s 格式输出时 printf函数中的输出项是字符数组的数组名 而不是数组元素名 例如 charc China printf s c 下面写法不正确 printf s c 0 输出字符串China要用数组名c 数组元素 当数组长度大于字符串的实际长度时 也只输出到 0 结束 如 charc 10 China printf s c 只输出有效字符 China体现了 0 结束标志作用 如果一个字符数组中包含多个 0 则遇到第一个 0 时结束输出 可用scanf函数输入一个字符串 函数中的输入项c是已定义的数组名 输入的字符串长度应小于数组长度 用数组名 不要加地址符 因为数组名代表了该数组的首地址 输出时到此结束 只输出 Good 4个字符 charc 6 scanf s c China 系统自动在China后面加一个 0 如 分析图中所示的字符数组可用八进制形式输出数组c的起始地址 printf o c 用scanf函数输入多个字符串时 每个字符串之间用空格分隔 若改为 charstr 13 scanf s str 输入 How are you 如 charstr1 5 str2 5 str3 5 scanf s s s str1 str2 str3 若输入 How are you 则结果 由于系统默认将空格键或回车键作为一个字符串输入结束标志 故只将第一个空格前的字符How送到str中 并加上 0 1 puts函数 输出字符串的函数其一般形式为 puts 字符数组 作用是将一个字符串输出到终端charstr 20 China puts str 输出 6 3 6善于使用字符串处理函数 注 在输出时将字符串结束标志 0 转换成 n 即输完换行 2 gets函数 输入字符串的函数其一般形式为 gets 字符数组 作用是输入一个字符串到字符数组charstr 20 gets str Computer 6 3 6善于使用字符串处理函数 将 Computer 送给字符数组str 这里送给数组str共9个字符 不是8个 换行符 n 转换为结束符 0 3 strcat函数 字符串连接函数其一般形式为 strcat 字符数组1 字符数组2 作用是把字符串2接到字符串1的后面 结果放在字符数组1中 函数调用后返回字符数组1的地址 6 3 6善于使用字符串处理函数 使用字符串函数时 在程序开头用 include 3 strcat函数 字符串连接函数charstr1 30 People charstr2 China printf s strcat str1 str2 输出 6 3 6善于使用字符串处理函数 要足够大 4 strcpy和strncpy函数 字符串复制strcpy一般形式为 strcpy 字符数组1 字符串2 作用是将字符串2复制到字符数组1中去charstr1 10 str2 China strcpy str1 str2 6 3 6善于使用字符串处理函数 str1 要足够大 4 strcpy和strncpy函数 字符串复制strcpy一般形式为 strcpy 字符数组1 字符串2 作用是将字符串2复制到字符数组1中去charstr1 10 str2 China strcpy str1 str2 6 3 6善于使用字符串处理函数 必须数组名形式 数组名或字符串常量 4 strcpy和strncpy函数 字符串复制charstr1 10 str2 China strcpy str1 str2 相当于strcpy str1 China 6 3 6善于使用字符串处理函数 charstr1 10 str2 China str1 China 错误str1 str2 错误 str1为数组名 表示首地址 4 strcpy和strncpy函数 字符串复制可以用strncpy函数将字符串2中前面n个字符复制到字符数组1中去strncpy str1 str2 2 作用是将str2中最前面2个字符复制到str1中 取代str1中原有的最前面2个字符复制的字符个数n不应多于str1中原有的字符 6 3 6善于使用字符串处理函数 5 strcmp函数 字符串比较函数其一般形式为strcmp 字符串1 字符串2 作用是比较字符串1和字符串2例如strcmp str1 str2 strcmp China Korea strcmp str1 Beijing 6 3 6善于使用字符串处理函数 5 strcmp函数 字符串比较函数字符串比较规则 将两个字符串自左向右逐个字符相比 直到出现不同的字符或遇到 0 为止 1 若全部字符相同 则两个字符串相等 2 若出现不相同的字符 则以第一对不相同的字符的比较结果为准 6 3 6善于使用字符串处理函数 5 strcmp函数 字符串比较函数例如 A A computer compare CHINA CANADA DOG TSINGHUA 6 3 6善于使用字符串处理函数 5 strcmp函数 字符串比较函数比较的结果由函数值带回如果字符串1 字符串2 则函数值为0如果字符串1 字符串2 则函数值为一个正整数如果字符串1 字符串2 则函数值为一个负整数 6 3 6善于使用字符串处理函数 6 strlen函数 测字符串长度的函数其一般形式为 strlen 字符数组 测试字符串长度的函数 不包括 0 在内函数的值为字符串中的实际长度 6 3 6善于使用字符串处理函数 6 strlen函数 测字符串长度的函数例如charstr 10 China printf d strlen str 输出结果是5也可以直接测试字符串常量的长度strlen China 6 3 6善于使用字符串处理函数 7 strlwr函数 转换为小写的函数其一般形式为strlwr 字符串 作用是将字符串中大写字母换成小写字母 6 3 6善于使用字符串处理函数 例如charstr 10 China strlwr str 或strlwr China printf s str 输出china 8 strupr函数 转换为大写的函数其一般形式为strupr 字符串 作用是将字符串中小写字母换成大写字母 6 3 6善于使用字符串处理函数 例如charstr 10 China strupr str printf s str
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 考公务员面试题目及答案
- 公务员创新规范并重面试题及答案
- 喘病中医试题及答案
- 安徽农业公务员面试题及答案
- 八年级(下)期末物理真题汇编《力》及答案
- 三轴搅拌桩施工方案
- 2025年数字货币环境下货币政策传导机制的创新与金融监管报告
- 2025年老年教育课程改革与体验式教学模式创新研究分析
- 2025年土壤污染修复技术土壤修复药剂市场前景分析报告
- 女装品类培训课件
- 化学实验室试剂采购与管理考核试卷
- DB11T 334.5-2019 公共场所中文标识英文译写规范 第5部分:医疗卫生
- TB10104-2003 铁路工程水质分析规程
- 突发环境事件应急预案编制要点及风险隐患排查重点课件
- 14J936变形缝建筑构造
- 住院医师全科医师规范化培训24小时负责工作制实施细则
- 肿瘤放射治疗质量控制规范
- 保育员开学前培训内容
- 青少年药物滥用的影响因素与预防方法
- 机修工安全培训方案
- 纺织品染整技术培训课件
评论
0/150
提交评论