谭浩强C程序设计(第三版)课件-第7章-数组.ppt

上传人:xt****7 文档编号:6045353 上传时间:2020-02-15 格式:PPT 页数:72 大小:961.50KB
返回 下载 相关 举报
谭浩强C程序设计(第三版)课件-第7章-数组.ppt_第1页
第1页 / 共72页
谭浩强C程序设计(第三版)课件-第7章-数组.ppt_第2页
第2页 / 共72页
谭浩强C程序设计(第三版)课件-第7章-数组.ppt_第3页
第3页 / 共72页
点击查看更多>>
资源描述
第七章 数组 谭浩强 问题 给一组数排序 这组数该如何存放呢 这些数据如何存放才便于排序 1 8 8 8 8 8 8 8 8 8 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 8 8 8 8 8 8 8 8 8 8 本章要点 掌握一维 二维数组的定义和引用方法 存储结构和初始化方法 掌握有关一维数组的有关算法掌握数组的运算 主要内容 7 1一维数组的定义和引用7 2二维数组的定义和引用7 3字符数组 7 1一维数组的定义和引用 C语言为这些数据 提供了一种构造数据类型 数组 所谓数组就是一组具有相同数据类型的数据的有序集合 一个班学生的学习成绩一行文字一个矩阵这些数据的特点是 1 具有相同的数据类型2 使用过程中需要保留原始数据 1 一维数组的定义格式为 类型说明符数组名 常量表达式 例如 inta 10 它表示定义了一个整形数组 数组名为a 此数组有10个元素 7 1 1一维数组的定义 说明 1 数组名定名规则和变量名相同 遵循标识符定名规则 2 在定义数组时 需要指定数组中元素的个数 方括弧中的常量表达式用来表示元素的个数 即数组长度 3 常量表达式中可以包括常量和符号常量 但不能包含变量 也就是说 C语言不允许对数组的大小作动态定义 即数组的大小不依赖于程序运行过程中变量的值 例如 intn scanf d 数组说明中其他常见的错误 floata 0 数组大小为0没有意义 intb 2 3 不能使用圆括号 intk a k 不能用变量说明数组大小 2 一维数组在内存中的存放 每个数据元素占用的字节数 就是基类型的字节数一个元素占4个字节 一维数组 floatmark 100 注意 定义数组时用到的 数组名 常量表达式 和引用数组元素时用到的 数组名 下标 是有区别的 例如 inta 10 t a 6 7 1 2一维数组元素的引用 1 数组元素的引用方式数组名 下标 下标可以是整型常量或整型表达式 例如 a 0 a 5 a 7 a 2 3 2 一维数组元素引用的程序实例 includevoidmain inti a 10 for i 0 i 0 i printf d a i printf n 运行结果如下 9876543210程序使a 0 到a 9 的值为0 9 然后按逆序输出 对数组元素初始化的实现方法 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 7 1 3一维数组的初始化 3 如果想使一个数组中全部元素值为0 可以写成 inta 10 0 0 0 0 0 0 0 0 0 0 或inta 10 0 不能写成 inta 10 0 10 2 可以只给一部分元素赋值 例如 inta 10 0 1 2 3 4 定义a数组有10个元素 但花括弧内只提供5个初值 这表示只给前面5个元素赋初值 后5个元素值为0 4 在对全部数组元素赋初值时 由于数据的个数已经确定 因此可以不指定数组长度 例如 inta 5 1 2 3 4 5 也可以写成inta 1 2 3 4 5 inta 10 1 2 3 4 5 只初始化前5个元素 后5个元素为0 例7 1 用数组来处理 求解Fibonacci数列 程序实例 includevoidmain inti intf 20 1 1 Fibonacci数列公式 已知 a1 a2 1an an 1 an 2即 1 1 2 3 5 8 13 7 1 4一维数组程序举例 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 For循环结束 程序结束 运行结果如下 11235813213455891442333776109871597258441816765 if语句用来控制换行 每行输出5个数据 程序举例2 用起泡法对10个数排序 由小到大 经过第一趟 共5次比较与交换 后 最大的数9已 沉底 然后进行对余下的前面5个数第二趟比较 如果有n个数 则要进行n 1趟比较 在第1趟比较中要进行n 1次两两比较 在第j趟比较中要进行n j次两两比较 程序流程图如下 程序实例7 3 includevoidmain inta 10 inti j t printf input10numbers n for i 0 i 10 i scanf d for j 0 ja 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 程序结束 程序运行结果如下 input10numbers 10481265 76100 45123 thesortednumbers 76 4501481265100123 7 2二维数组的定义和引用 7 2 1二维数组的定义 二维数组定义的一般形式为类型说明符数组名 常量表达式 常量表达式 例如 定义a为3 4 3行4列 的数组 b为5 10 5行10列 的数组 如下 floata 3 4 b 5 10 不能写成floata 3 4 b 5 10 注意 我们可以把二维数组看作是一种特殊的一维数组 它的元素又是一个一维数组 例如 可以把a看作是一个一维数组 它有3个元素 a 0 a 1 a 2 每个元素又是一个包含4个元素的一维数组 7 2 1二维数组的定义 二维数组中的元素在内存中的排列顺序是 按行存放 即先顺序存放第一行的元素 再存放第二行的元素 一维数组在内存中的存放 下图表示对a 3 4 数组存放的顺序 地址值数组元素 b 0 0 b 0 1 b 0 2 b 1 0 b 1 1 b 1 2 b 2 0 b 2 1 b 2 2 3000H3002H3004H3006H3008H300AH300CH300EH3010H 例如 整型数组b 3 3 1 2 3 4 5 6 7 8 9 123 456 789 问题 有了二维数组的基础 那么多维数组如何定义呢 定义三维数组 floata 2 3 4 注意 多维数组元素在内存中的排列顺序 第一维的下标变化最慢 最右边的下标变化最快 7 2 1二维数组的定义 三维数组的元素排列顺序 二维数组元素的表示形式为 数组名 下标 下标 例如 a 2 3 下标可以是整型表达式 如a 2 1 2 2 1 数组元素可以出现在表达式中 也可以被赋值例如 b 1 2 a 2 3 2 7 2 2二维数组的引用 常出现的错误有 inta 3 4 定义a为3 4的数组 a 3 4 3 在使用数组元素时 应该注意下标值应在已定义的数组大小的范围内 可以用下面4种方法对二维数组初始化 数据类型数组名 常量表达式1 常量表达式2 初始化数据 分行给二维数组赋初值 例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 可以将所有数据写在一个花括号内 按数组排列的顺序对各元素赋初值 例如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 7 2 3二维数组的引用 可以对部分元素赋初值 例如 inta 3 4 1 5 9 100050009000 也可以对各行中的某一元素赋初值 如inta 3 4 1 0 6 0 0 11 1000060000011 100056000000 也可以只对某几行元素赋初值 如 inta 3 4 1 5 6 如果对全部元素都赋初值 则定义数组时对第一维的长度可以不指定 但第二维的长度不能省 例如 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 在定义时也可以只对部分元素赋初值而省略第一维的长度 但应分行赋初值 例如 inta 4 0 0 3 0 10 0030000001000 7 2 4二维数组程序举例 例7 4将一个二维数组行和列元素互换 存到另一个二维数组中 includevoidmain 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 程序结束 运行结果如下 arraya 123456arrayb 142536 例7 5 有一个3 4的矩阵 要求编程序求出其中值最大的那个元素的值 以及其所在的行号和列号 N S流程图表示算法如下 程序 includevoidmain 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 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 I a m h a p p y 7 3 2字符数组的初始化 如果初值个数小于数组长度 则只将这些字符赋给数组中前面那些元素 其余的元素自动定为空字符 如果提供的初值个数与预定的数组长度相同 在定义时可以省略数组长度 系统会自动根据初值个数确定数组长度 charc I a m h a p p y 数组c的长度自动定为10 chardiamond 5 5 定义和初始化一个二维字符数组 7 3 3字符数组的引用 例7 6输出一个字符串 程序如下 includevoidmain charc 10 I a m a b o y inti for i 0 i 10 i printf c c i printf n 运行结果 Iamaboy 例7 7输出一个钻石图形 includevoidmain chardiamond 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语言规定了一个 字符串结束标志 0 字符数组并不要求它的最后一个字符为 0 甚至可以不包含 0 例如 charc 5 C h i n a 但是由于系统对字符串常量自动加一个 0 因此 为了使处理方法一致 在字符数组中也常人为地加上一个 0 例如 charc 6 C h i n a 0 例如 定义字符数组 charc Pascalprogram 要用一个新的字符串代替原有的字符串 Pascalprogram 从键盘向字符数组输入 Hello如果不加 0 的话 字符数组中的字符如下 Hellolprogram 7 3 5字符数组的输入输出 字符数组的输入输出可以有两种方法 逐个字符输入输出 用格式符 c 输入或输出一个字符 将整个字符串一次输入或输出 用 s 格式符 意思是对字符串的输入输出 在内存中数组c的状态 说明 1 用 s 格式符输出字符串时 printf函数中的输出项是字符数组名 而不是数组元素名 2 如果数组长度大于字符串实际长度 也只输出到遇 0 结束 3 输出字符不包括结束符 0 4 如果一个字符数组中包含一个以上 0 则遇第一个 0 时输出就结束 5 可以用scanf函数输入一个字符串 如果利用一个scanf函数输入多个字符串 则在输入时以空格分隔 例如 charstrl 5 str2 5 str3 5 scanf s s s str1 str2 str3 输入数据 Howareyou 数组中未被赋值的元素的值自动置 0 分析图中所示的字符数组用8进制形式输出数组c的起始地址printf o c printf s c 注意 scanf函数中的输入项如果字符数组名 不要再加地址符 因为在C语言中数组名代表该数组的起始地址 下面写法不对 scanf s str 1 puts函数其一般形式为 puts 字符数组 其作用是将一个字符串 以 0 结束的字符序列 输出到终端 假如已定义str是一个字符数组名 且该数组已被初始化为 China 则执行puts str 其结果是在终端上输出China 7 3 6字符串处理函数 用puts函数输出的字符串中可以包含转义字符 例如 charstr China nBeijing puts str 输出结果 ChinaBeijing 在输出时 将字符串结束标志 0 转换成 n 即输出完字符串后换行 2 gets函数其一般形式为 gets 字符数组 其作用是从终端输入一个字符串到字符数组 并且得到一个函数值 该函数值是字符数组的起始地址 如执行下面的函数 gets str 从键盘输入 Computer 将输入的字符串 Computer 送给字符数组str 说明 函数值为字符数组str的起始地址 一般利用gets函数的目的是向字符数组输入一个字符串 而不大关心其函数值 注意 用puts和gets函数只能输入或输出一个字符串 不能写成puts str1 str2 或gets str1 str2 3 strcat函数其一般形式为 strcat 字符数组1 字符数组2 Strcat的作用是连接两个字符数组中的字符串 把字符串2接到字符串1的后面 结果放在字符数组1中 函数调用后得到一个函数值 字符数组1的地址 例如 charstr1 30 People sRepublicof charstr2 China print s strcat str1 str2 输出 People sRepublicofChina 4 strcpy函数其一般形式为 strcpy 字符数组1 字符串2 strcpy是 字符串复制函数 作用是将字符串2复制到字符数组1中去 例如 charstr1 10 str2 China strcpy str1 str2 关于strcpy函数的几点说明 1 字符数组1必须定义得足够大 以便容纳被复制的字符串 字符数组1的长度不应小于字符串2的长度 2 字符数组1 必须写成数组名形式 如str1 字符串2 可以是字符数组名 也可以是一个字符串常量 如strcpy str1 China 3 复制时连同字符串后面的 0 一起复制到字符数组1中 4 可以用strcpy函数将字符串2中前面若干个字符复制到字符数组1中去 例如 strcpy str1 str2 2 作用是将str2中前面2个字符复制到str1中去 然后再加一个 0 5 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组 如 str1 China 不合法str1 str2 不合法用strcpy函数只能将一个字符串复制到另一个字符数组中去 用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素 下面是合法的使用 chara 5 c1 c2 c1 A c2 B a 0 C a 1 h a 2 i a 3 n a 4 a 5 strcmp函数其一般形式为 strcmp 字符串1 字符串2 strcmp的作用是比较字符串1和字符串2 例如 strcmp str1 str2 strcmp China Korea strcmp str1 Beijing 比较的结果由函数值带回 1 如果字符串1 字符串2 函数值为0 2 如果字符串1 字符串2 函数值为一正整数 3 如果字符串1str2 printf yes 而只能用if strcmp str1 str2 0 printf yes 6 strlen函数其一般形式为 strlen 字符数组 strlen是测试字符串长度的函数 函数的值为字符串中的实际长度 不包括 0 在内 例如 charstr 10 China printf d strlen str 输出结果不是10 也不是6 而是5 也可以直接测试字符串常量的长度 如strlen China 7 strlwr函数其一般形式为 strlwr 字符串 strlwr函数的作用是将字符串中大写字母换成小写字母 8 strupr函数其一般形式为 strupr 字符串 strupr函数的作用是将字符串中小写字母换成大写字母 例7 8输入一行字符 统计其中有多少个单词 单词之间用空格分隔开 7 3 7字符数组应用举例 程序如下 includevoidmain charstring 81 inti num 0 word 0 charc gets string for i 0 c string i 0 i if c word 0 elseif word 0 word 1 num printf Thereare dwordsintheline n num 运行情况如下 Iamaboy Thereare4wordsintheline 例7 9有3个字符串 要求找出其中最大者 程序如下 include includevoidmain charstring 20 charstr 3 20 inti for i 0 i 3 i gets str i if strcmp str 0 str 1 0 strcpy string str 0 elsestrcpy string str 1 if strcmp str 2 string 0 strcpy string str 2 printf nthelargeststringis n s n string 运行结果如下 CHINA HOLLAND AMERICA thelargeststringis HOLLAND
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!