C语言课件第07章数组.ppt

上传人:max****ui 文档编号:6335105 上传时间:2020-02-23 格式:PPT 页数:72 大小:677KB
返回 下载 相关 举报
C语言课件第07章数组.ppt_第1页
第1页 / 共72页
C语言课件第07章数组.ppt_第2页
第2页 / 共72页
C语言课件第07章数组.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一维数组的定义和引用 问题 有如下几组数据 它们分别该如何存储呢 一个班学生的学习成绩一行文字一个矩阵 这些数据的特点是 1 具有相同的数据类型2 使用过程中需要保留原始数据C语言为这些数据 提供了一种构造数据类型 数组 1 一维数组的定义格式为 类型说明符数组名 常量表达式 例如 inta 10 它表示定义了一个整型数组 数组名为a 此数组有10个元素 7 1 1一维数组的定义 2 说明 1 数组名定名规则和变量名相同 遵循标识符定名规则 2 在定义数组时 需要指定数组中元素的个数 方括弧中的常量表达式用来表示元素的个数 即数组长度 例如 指定a 10 表示a数组有10个元素 注意下标是从0开始的 这10个元素是 a 0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 请持别注意 按上面的定义 不存在数组元素a 10 3 常量表达式中可以包括常量和符号常量 但不能包含变量 也就是说 C语言不允许对数组的大小作动态定义 即数组的大小不依赖于程序运行过程中变量的值 例如 下面这样定义数组是不行的 举例 intn scanf d floata 0 数组大小为0没有意义 intb 2 3 不能使用圆括号 intk a k 不能用变量说明数组大小 数组说明中其他常见的错误 3 一维数组在内存中的存放 每个数据元素占用的字节数 就是基类型的字节数一个元素占4个字节 一维数组 floatmark 100 数组名 下标 下标可以是整型常量或整型表达式 例如 a 0 a 5 a 7 a 2 3 7 1 2一维数组元素的引用 1 数组元素的引用方式 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 对数组元素初始化的实现方法 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 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 在第二种写法中 花括弧中有5个数 系统就会据此自动定义a数组的长度为5 但若数组长度与提供初值的个数不相同 则数组长度不能省略 例如 想定义数组长度为10 就不能省略数组长度的定义 而必须写成inta 10 1 2 3 4 5 只初始化前5个元素 后5个元素为0 程序举例1 用数组来处理 求解Fibonacci数列 程序实例 includevoidmain inti intf 20 1 1 Fibonacci数列公式 已知 a1 a2 1 an 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个数排序 由小到大 起泡法的思路是 将相邻两个数比较 将小的调到前头 如果有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 一维数组的定义格式为 类型说明符数组名 常量表达式 例如 inta 10 7 2 1二维数组的定义 二维数组中的元素在内存中的排列顺序是 按行存放 即先顺序存放第一行的元素 再存放第二行的元素 一维数组在内存中的存放 下图表示对a 3 4 数组存放的顺序 问题 有了二维数组的基础 那么多维数组如何定义呢 定义三维数组 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 初始化数据 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 7 2 3二维数组的引用 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 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 在定义时也可以只对部分元素赋初值而省略第一维的长度 但应分行赋初值 如 inta 4 0 0 3 0 10 0030000001000 7 2 3二维数组的引用 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流程图表示算法 如下 7 2 4二维数组程序举例 程序如下 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 程序结束 课堂练习 计算两个m n矩阵的和C A B及D A B 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 3字符数组的引用 7 3 4字符串和字符串结束标志 为了测定字符串的实际长度 C语言规定了一个 字符串结束标志 以字符 0 作为标志 如果有一个字符串 前面9个字符都不是空字符 即 0 而第10个字符是 0 则此字符串的有效字符为9个 系统对字符串常量也自动加一个 0 作为结束符 0 代表ASCII码为0的字符 从ASCII码表中可以查到 ASCII码为0的字符不是一个可以显示的字符 而是一个 空操作符 即它什么也不干 用它来作为字符串结束标志不会产生附加的操作或增加有效字符 只起一个供辨别的标志 可以用字符串常量来使字符数组初始化 例如charc Iamhappy 也直接写成charc Iamhappy 它与下面的数组初始化等价charc I a m h a p p y 0 注意 再比如charc 10 China 数组c的前5个元素为 C h i n a 第6个元素为 0 后4个元素也设定为空字符 7 3 4字符串和字符串结束标志 需要说明的是 字符数组并不要求它的最后一个字符为 0 甚至可以不包含 0 例如 charc 5 C h i n a 这样写完全是合法的 但是由于系统对字符串常量自动加一个 0 因此 人们为了使处理方法一致 在字符数组中也常人为地加上一个 0 如 charc 6 C h i n a 0 这样做 这样做是为了便于引用字符数组中的字符串 7 3字符数组 7 3 5字符数组的输入输出 字符数组的输入输出可以有两种方法 逐个字符输入输出 用格式符 c 输入或输出一个字符 将整个字符串一次输入或输出 用 s 格式符 意思是对字符串的输入输出 在内存中数组c的状态 如果利用一个scanf函数输入多个字符串 则在输入时以空格分隔 例如 charstrl 5 str2 5 str3 5 scanf s s s str1 str2 str3 输入数据 Howareyou 数组中未被赋值的元素的值自动置 0 若改为charstr 13 scanf s str 如果输入以下12个字符Howareyou 大家思考一下str 13 数组中存放的结果会是什么呢 由于系统把空格字符作为输入的字符串之间的分隔符 因此只将空格前的字符 How 送到str中 由于把 How 作为一个字符串处理 故在其后加 0 分析图中所示的字符数组用8进制形式输出数组c的起始地址printf o c 输出数组c的起始地址2000 printf s c 按字符数组名c找到其数组起始地址 然后逐个输出其中的字符 直到遇 0 为止 需要注意 scanf函数中的输入项如果字符数组名 不要再加地址符 因为在C语言中数组名代表该数组的起始地址 下面写法不对 scanf s str 7 3 6字符串处理函数 在C的函数库中提供了一些用来处理字符串的函数 使用方便 几乎所有版本的C编译系统都提供这些函数 下面介绍几种常用的函数 1 puts函数其一般形式为 puts 字符数组 其作用是将一个字符串 以 0 结束的字符序列 输出到终端 假如已定义str是一个字符数组名 且该数组已被初始化为 China 则执行puts str 其结果是在终端上输出China 由于可以用printf函数输出字符串 因此puts函数用的不多 用puts函数输出的字符串中可以包含转义字符 例如 charstr China nBeijing puts str 输出结果 ChinaBeijing 在输出时 将字符串结束标志 0 转换成 n 即输出完字符串后换行 2 gets函数其一般形式为 gets 字符数组 其作用是从终端输入一个字符串到字符数组 并且得到一个函数值 该函数值是字符数组的起始地址 如执行下面的函数 gets str 从键盘输入 Computer 7 3 6字符串处理函数 将输入的字符串 Computer 送给字符数组str 请注意送给数组的共有9个字符 而不是8个字符 函数值为字符数组str的起始地址 一般利用gets函数的目的是向字符数组输入一个字符串 而不大关心其函数值 注意 用puts和gets函数只能输入或输出一个字符串 不能写成puts str1 str2 或gets str1 str2 3 strcat函数其一般形式为 strcat 字符数组1 字符数组2 Strcat的作用是连接两个字符数组中的字符串 把字符串2接到字符串1的后面 结果放在字符数组1中 函数调用后得到一个函数值 字符数组1的地址 7 3 6字符串处理函数 例如 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 7 3 6字符串处理函数 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 7 3 6字符串处理函数 A A computer compare 36 54 CHINA CANADA DOG cat 字符串比较的规则与其他语言中的规则相同 即对两个字符串自左至右逐个字符相比 按ASCII码值大小比较 直到出现不同的字符或遇到 0 为止 如全部字符相同 则认为相等 若出现不相同的字符 则以第一个不相同的字符的比较结果为准 例如 比较的结果由函数值带回 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 3 6字符串处理函数 例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 例2编一个程序计算字符串长度 例3编写strcat函数的程序上机题目 1编写一个程序将字符串按逆序存放 2编写strcpy的程序3计算4 4数组中次对角线元素的和全部元素的和 4用选择法排序
展开阅读全文
相关资源
相关搜索

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


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

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


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