C语言程序设计教程第7章北京邮电大学出版社.ppt

上传人:xin****828 文档编号:6287195 上传时间:2020-02-21 格式:PPT 页数:74 大小:349.50KB
返回 下载 相关 举报
C语言程序设计教程第7章北京邮电大学出版社.ppt_第1页
第1页 / 共74页
C语言程序设计教程第7章北京邮电大学出版社.ppt_第2页
第2页 / 共74页
C语言程序设计教程第7章北京邮电大学出版社.ppt_第3页
第3页 / 共74页
点击查看更多>>
资源描述
7 1一维数组7 2二维数组7 3数组的应用7 4字符数组与字符串7 5数组作为函数的参数7 6程序举例 第7章数组 C语言程序设计教程 2020 2 21 C语言程序设计教程 2 1 数组的引入在前面的程序设计中 所涉及和处理的数据都非常简单 对这些数据采用C语言的基本类型 整型 实型 字符型 来描述就行 但在实际应用中 需要处理的数据往往是复杂多样的 问题 输入100名学生某门课程的成绩 要求将高于平均分的那些成绩打印出来 1 可以用读入一个数就累加一个的办法来求出学生的平均分 2 但只有读入全部学生的分数后才能求得平均分 3 所以必须将100个学生的成绩全部都保留下来 然后逐个和平均分比较 把高于平均分的成绩打印出来 所以保留学生的成绩必须用100个变量s1 s2 s100 average用来存放平均分 需要100条语句来判断学生的成绩是否高于平均分 2020 2 21 C语言程序设计教程 3 如何编程呢 语言提供了用户自定义数据的描述方法 即构造类型 由若干基本类型数据按一定的规则构成复杂数据对象 如数组类型 构造数据类型的引入 使我们能较方便地解决上面的问题 2 数组的概念数组 具有相同类型的数据组成的序列 是有序集合 数组中的每一个数据称数组元素由其所在的位置序号 称数组元素的下标 来区分 注意 数组元素有序不是指元素大小顺序 2020 2 21 C语言程序设计教程 4 C语言数组类型有三个特点 数组元素的个数必须是确定的 数组元素类型必须相同各元素可作为基本变量使用 上例中若采用数组来解决 程序将十分简单 floats 100 for i 0 i average printf s d f i s i 用数组名与下标可以用统一的方式来处理数组中的所有元素 从而方便的实现处理一批具有相同性质数据的问题 2020 2 21 C语言程序设计教程 5 7 1一维数组 7 1 1一维数组的定义一维数组 只有一个下标的数组 定义格式 存储类别类型标识符数组名 元素个数 说明 1 存储类别 说明数组的存储属性 即数组的作用域与生成期 可以是静态型 static 自动型 auto 及外部型 extern 当使用auto型时可以省略 2 类型标识符 数组元素的类型 3 数组名的命名规则 与标识符的命名规则相同 4 数组 元素个数 即数组长度 只能是一个整型常量表达式 可以是符号常量 2020 2 21 C语言程序设计教程 6 例 inta 5 定义了一个自动型整型数组 数组的元素为整型 数组名为a 元素个数为5 下面是合法的数组定义 charstr 20 定义一个有20个元素的字符型数组str floatscore 8 定义一个有8个元素的浮点型数组score defineN5longdata N 定义一个有5个元素的长整型数组data shortz 4 N 定义了一个有20个元素的短整型数组z 其中 的数组长度使用的是符号常量下面的定义是非法的 intn 10 charc n 数组长度不能使用变量 2020 2 21 C语言程序设计教程 7 例 试判断下列数组定义是否合法 floatscore 35 definestudent35floatn student student intscore student student 3 intperson 10 intn 10 a n 定义规则 1 数组的下标应用方括号括起来 而非 2 常量表达中可包含常量和符号常量 但不能包含变量 即数组的大小不能动态定义 2020 2 21 C语言程序设计教程 8 7 1 2数组元素的引用 不能利用数组名来整体引用一个数组 只能单个的使用数组元素数组元素的描述 由数组名加方括号中的下标组成 即 数组名 下标 下标 数组元素在数组中的顺序号 使用整序型表达式 取值范围 从0到元素个数 1 C语言不对下标越界作语法检查 若有定义 inta 5 则数组a的元素分别为 a 0 a 1 a 2 a 3 a 4 但a 5 不是 每个元素都可作为一个整型变量来使用 如 a 0 5 a 3 a 1 4 a D B 3 scanf d a 4 2020 2 21 C语言程序设计教程 9 includemain intn a 15 for n 0 n 0 n printf 4d a n 输入 123456789101112131415 输出 151413121110987654321 根据数组的有序性 往往使用循环语句来对数组进行处理 用循环控制变量作为数组下标 从而可以以统一的方式来访问数组元素 例7 1从键盘输入15个整数 再反序输出 问 不用数组能否完成 如何实现 假设是1000个数据呢 注意 1 循环控制变量的初值 终值及控制条件 2 不能整体输入 出数组如 printf d a 学会如何对数组进行输入输出 2020 2 21 C语言程序设计教程 10 7 1 3一维数组的存储结构与初始化1 一维数组的存储结构数组变量在内存中分配一片连续的存储单元 数组元素按数组下标从小到大连续存放 a代表首地址 数组起始地址 每个元素字节数相同 因此 根据数组元素序号可以求得数组各元素在内存的地址 并可对数组元素进行随机存取 数组元素地址 数组首地址 元素下标 sizeof 数组类型 例floata 5 设a的首地址为1000 数组a存储示意图如右图所示 1012 a 3 的地址 1000 3 4 1012 2020 2 21 C语言程序设计教程 11 2 一维数组的初始化含义 在定义数组的同时 对数组各元素指定初值 初始化是编译阶段完成 注意 用赋值语句或输入语句也可给数组素指定初值 是在运行时完成 初始化数组格式 说明 是用逗号分隔的数组元素的初始值 常量 中数值的类型必须与一致 2020 2 21 C语言程序设计教程 12 若不对auto数组进行初始化 则其初值是不可知的 若一个static或外部数组未进行初始化 则对数值型数组元素 初值为0 而对字符型数组元素 初值为空字符 0 对数组初始化的几种方法 在定义数组时 对全部数组元素赋予初值 例 inta 5 0 1 2 3 4 在定义数组时 对部分数组元素赋予初值 例 inta 5 1 2 等价a 0 1 a 1 2 其它赋0 对全部数组元素赋初值时 可省数组长度 系统自动确定 例 inta 0 1 2 3 4 等价于inta 5 0 1 2 3 4 2020 2 21 C语言程序设计教程 13 例7 2数组初始化与未初始化比较 includemain inti a 5 3 4 5 b 5 printf narrayais for i 0 i 5 i printf 6d a i printf narraybis for i 0 i 5 i printf 6d b i 运行结果 arrayais 34500arraybis 321398401170454 2020 2 21 C语言程序设计教程 14 defineN5 includemain inti j k max min staticinta 5 for i 0 ia i min a i k i printf max a d d min a d d j max k min 例7 3从键盘上输入5个数 输出最大 最小的元素以及它们的下标 若输入 823120 10 输出为 max a 2 312 min a 4 10 2020 2 21 C语言程序设计教程 15 若一个一维数组 它的每一个元素亦是类型相同的一维数组时 便构成二维数组 数组的维数 是指数组的下标个数 一维数组元素只有一个下标 二维数组元素有两个下标 7 2 1二维数组的定义1 定义形式 存储类别类型标识符数组名 行数 列数 例 floatb 5 3 定义了一个5 3的数组b 即数组为5行3列 可存放15个实型数据 7 2二维数组 2020 2 21 C语言程序设计教程 16 2 定义时注意 1 同一维数组一样 表达式中可包含常量和字符常量 但不能包含变量 2 二维数组也可以理解为定义了多个一维数组 如 inta 4 3 相当于定义了四个一维数组 也可将a看作一个特殊的一维数组 其中每个元素又为一维数组 3 二维数组的存放顺序二维数组中的元素在存储时实行按行存放 即在内存中先顺序存放第一行的元素 再存放第二行的元素 对于a 4 3 a00 a01 a02 a10 a11 a12 a20 a21 a22 a30 a31 a32 2020 2 21 C语言程序设计教程 17 3 多维数组的定义 根据二维数组的定义 我们可以类推出多维数组的定义 staticintb 2 2 3 定义了一个3维的静态整型数组 floatc 2 3 2 2 定义了一个4维浮点型数组 在数组定义时 多维数组的维从左到右第一个 称第一维 第二个 称第二维 依此类推 多维数组元素的顺序仍由下标决定 下标的变化是先变最右边的 再依次变化左边的下标 三维数组b的12个元素是 b 0 0 0 b 0 0 1 b 0 0 2 b 0 1 0 b 0 1 1 b 0 1 2 b 1 0 0 b 1 0 1 b 1 0 2 b 1 1 0 b 1 1 1 b 1 1 2 2020 2 21 C语言程序设计教程 18 二维数组的每一个元素都可以作一个变量来使用 1 表示形式为 数组名 下标 下标 同样 数组的下标下限为0 上限为常量表达式的值减1 2 下标也可用整型表达式来表示 但下标值应在已定义的数组大小的范围内 即编译系统对下标不作检查 如 inta 4 3 下列引用是否正确 a 1 2 6 3 4 a 4 2 10 a 4 2 2 a 3 2 a 1 2 3 注意定义时的a 4 3 与引用时的a 4 3 的区别 定义的a 4 3 数组中有无a 4 3 元素 7 2 2二维数组元素的引用 2020 2 21 C语言程序设计教程 19 例7 4二维数组输入输出 main inta 2 3 printf nInputarraya for j 0 j 2 j for k 0 k 3 k scanf d 输出一行后换行 再输出下一行 输入 Inputarraya 123456 输出 Outputarraya 123456 对二维数组的输入输出多使用二层循环结构来实现 2020 2 21 C语言程序设计教程 20 7 2 3二维数组的存储结构设有定义inta 2 3 floatb 3 2 系统为数组在内存中分配一片连续的内存空间 将二维数组元素按行的顺序存储在所分配的内存区域 数组a与b的各元素的存储顺序如右图所示 元素a i j 的地为 a i n j 元素字节数 2020 2 21 C语言程序设计教程 21 7 2 4 二维数组的初始化 按行赋初值 例 inta 2 3 1 2 3 2 3 4 每个花括号内的数据对应一行元素 按顺序赋值 例 inta 2 3 1 2 3 2 3 4 将所有初值写在一个花括号内 只对部分元素赋值 例 inta 2 3 1 2 4 按行用括号括起来 没有初值对应的元素赋0值或空字符 字符数组 给全部元素赋初值或分行初始化时 可不指定第一维大小 其大小系统自动确定 但必须指定第二维的大小 例 inta 3 1 2 3 4 5 6 inta 3 0 0 5 第一维的大小为多少 2020 2 21 C语言程序设计教程 22 例7 5从键盘上输入9个整数 保存在二维数组中 按数组原来位置输出第一行和第一列的所有元素 2020 2 21 C语言程序设计教程 23 includemain inti j a 3 3 for i 0 i 3 i 输入数组 for j 0 j 3 j printf a d d i j scanf d for i 0 i 3 i 输出数组 for j 0 j 3 j if i 1 j 1 printf 6d a i j elseprintf 6c printf n 2020 2 21 C语言程序设计教程 24 例7 6用如下的3 3矩阵初始化数组a 3 3 求矩阵的转置矩阵 123147456258789369转置矩阵 是将原矩阵元素按行列互换形成的矩阵方法 沿主对角线将对称位置元素互换即可 123147456258789369 2020 2 21 C语言程序设计教程 25 程序如下 includemain intj k inta 3 3 1 2 3 4 5 6 7 8 9 b 3 3 for j 0 j 3 j for k 0 k 3 k b j k a k j for j 0 j 3 j for k 0 k 3 k printf 6d b j k printf n 2020 2 21 C语言程序设计教程 26 7 3数组的应用 1 利用数组求fiboncaci数列的前n项例7 7求fiboncaci数列的前20项 f0 1f1 1 fi fi 1 fi 2 i 2 3 n 将前20项输出到屏幕上 每行五项 分析 根据这个数列的组成规律 从第三项开始 每个数据项的值为前两个数据项的和 采用递推方法来实现 可以用一个一维整型数组fib 20 来保存这个数列的前20项 2020 2 21 C语言程序设计教程 27 include includemain inti fib 20 fib 0 1 fib 1 1 for i 2 i 19 i fib i fib i 1 fib i 2 printf FibonaciNumbersare n for i 0 i 20 i if i 5 0 printf n printf 7d fib i FibonaciNumbersare 11235813213455891442333776109871597258441816765 2020 2 21 C语言程序设计教程 28 2 利用数组处理批量数据例7 8从键盘上输入若干学生 不超过100人 的成绩 计算平均成绩 并输出高于平均分的人数及成绩 输入成绩为负时结束 分析 根据题意 可以定义一个有100个元素的一维数组score 先将成绩输入到数组中 并计算平均成绩 然后 将数组中的成绩值一个个与平均值比较 输出高于平均分的成绩 2020 2 21 C语言程序设计教程 29 程序如下 includemain floatscore 100 ave sum 0 x inti n 0 count printf Inputscore scanf f 输出平均分 2020 2 21 C语言程序设计教程 30 接上页 for count 0 i 0 iave printf f n score i 输出高于平均分的成绩 count 统计高于平均分成绩的人数 if count 5 0 printf n 每行输出成绩达5个时换行 printf count d n count 输出高于平均分的人数 2020 2 21 C语言程序设计教程 31 3 利用数组排序例7 9从键盘上输入10个整数 用选择法其按由小到大的顺序排列并输出 基本思想 1 从第 个位置到第 个位置中选择出最小的一个与第 个位置的数交换 2 从第 个位置到第 个位置中选择出最小的一个与第 个位置的数交换 9 从第 个位置到第 个位置中选择出最小的一个与第 个位置的数交换 2020 2 21 C语言程序设计教程 32 513393222812321 1135 3 9322283 1 2321 131393222852321 135133222982321 135832221392321 135893222132321 135891332222321 135891321322322 135891321223223 135891321222332 输入数据 513393222812321排序过程如下 2020 2 21 C语言程序设计教程 33 includemain intI j t a 10 for I 0 I 10 I scanf d 输入数据到数组 内循环 在 I 9 内选择最小数 外循环 控制选择的次数 for I 0 Ia j t a I a I a j a j t printf n for I 0 I 10 I printf 6d a I 输出排序后的数据 2020 2 21 C语言程序设计教程 34 分析 从程序可知 1 程序使用两重循环来实现排序 2 外循环控制排序趟数 若数组有N个元素 则共进行N 1趟排序 第一趟 I 第二趟 I 3 内循环完成在 I 的区间内选择最小数 比较次数随趟数增大而减少 4 在每一趟选择中 当后面元素较小时 马上进行交换 而这种交换是不必要的 事实上 只要记住较小元素的位置 即下标 在内循结束后做一次交换即可 这样可大大节省程序运行时间 2020 2 21 C语言程序设计教程 35 改进排序过程如下 513393222812321 113393222852321 131393222852321 135932228132321 135832229132321 135892232132321 135891332222321 135891321222332 135891321222332 135891321222332改进后的程序见下页 注意与前一程序比较 2020 2 21 C语言程序设计教程 36 includemain intI j k a 10 t for I 0 Ia j k j if k I t a I a I a k a k t printf n for I 0 I 10 I printf 6d a I 内循环 外循环 K是最小元素之下标 2020 2 21 C语言程序设计教程 37 4 利用数组进行数据查找 折半查找法介绍 适应情况 在一批有序数据中查找某数基本思想 选定这批数中居中间位置的一个数与所查数比较 看是否为所找之数 若不是 利用数据的有序性 可以决定所找的数是在选定数之前还是在之后 从而很快可以将查找范围缩小一半 以同样的方法在选定的区域中进行查找 每次都会将查找范围缩小一半 从而较快地找到目的数例7 10假设在数组a中的数据是按由小到大顺序排列的 120616235680100110115 从键盘上输入一个数 判定该数是否在数组中 若在 输出所在序号 若不在 输出相应信息 2020 2 21 C语言程序设计教程 38 查找过程如下 第一步 设low mid和high三个变量 分别指示数列中的起始元素 中间元素与最后一个元素位置 其初始值为low 0 high 9 mid 4 判断mid指示的数是否为所求 mid指示的数是23 不是要找的80 须继续进行查找 120616235680100110115 low mid high第二步 确定新的查找区间 因为80大于23 所以查找范围可以缩小为23后面的数 新的查找区间为 5680100110115 low mid high分别指向新区间的开始 中间与最后一个数 实际上high不变 将low low mid 1 指向56 mid mid low high 2 指向100 还不是要找的80 仍须继续查找 12061623 5680100110115 low mid high 2020 2 21 C语言程序设计教程 39 第三步 上一步中 所找数80比mid指示的100小 可知新的查找区间为 5680 low不变 mid与high的值作相应修改 mid指示的数为56 还要继续查找 12061623 5680 100110115 low high mid第四步 根据上一步的结果 80大于mid指示的数56 可确定新的查找区间为 80 此时 low与high都指向80 mid亦指向80 即找到了80 到此为止 查找过程完成 1206162356 80 100110115 low mid high若在查找过程中 出现low high的情况 则说明 序列中没有该数 亦结束查找过程 2020 2 21 C语言程序设计教程 40 defineM10 includemain staticinta M 12 0 6 16 23 56 80 100 110 115 intn low mid high found low 0 high M 1 found 0 printf Inputanumbertobesearched scanf d 输入 80 输出 Theindexof80is6 2020 2 21 C语言程序设计教程 41 7 4字符数组与字符串 7 4 1字符数组的定义与初始化一 字符数组的定义字符数组 其元素类型为字符类型的数组 其定义与前面介绍的数组定义相同 例如 charstr 40 定义一个有40个元素的字符数组 每个元素相当于一个字符变量 2020 2 21 C语言程序设计教程 42 二 字符数组的初始化1 定义时进行初始化 同一般数组一样逐个进行赋值 赋字符序 在定义字符数组时进行初始化charch 7 s t u d e n t 在对全部元素指定初值时 可省写数组长度 charch s t u d e n t 2 用字符串赋初值 charc 4 cat 或者charc 4 cat charch 6 China Japan Korea 当将一个字符串存入一个数组时 系统在有效字符末尾多加 0 作为结束标志 因而用字符串赋值比用字符逐个赋值要多占一个字节 2020 2 21 C语言程序设计教程 43 三 字符数组的引用可引用字符数组中的一个元素 得到一个字符 引用方法与一般数值型数组相同 main inti j chara 6 China Japan Korea for i 0 i 2 i for j 0 j 5 j printf c a i j printf n ChinaJapanKorea 2020 2 21 C语言程序设计教程 44 7 4 2字符串的概念及存储 1 字符串的概念字符串 若干有效字符的序列 可包含转义字符 ASC 码表中的字符 形式为 用双引号括起来的字符序列 例 Iamastudent Hello a 5 f n 字符串的结束标志 0 注 C语言无字符串类型 字符串是存放在字符数组中的 2020 2 21 C语言程序设计教程 45 2 用字符串来直接初始化字符数组如 charch student 几点说明 字符串结束标志 0 仅用于判断字符串是否结束 输出字符串时不会输出 在对有确定大小的字符数组用字符串初始化时 数组长度应大于字符串长度 如 chars 7 student 是错误的 在初始化一个一维字符数组时 可以省略花括号 如 chars 8 student 4 不能直接将字符串赋值给字符数组 下面的操作是错误的 s student 2020 2 21 C语言程序设计教程 46 7 4 3字符串的输入输出 1 字符串的输出方法 1 用printf函数有两种方法 1 逐个字符输出 用格式符 c 按字符序列输出 2 整个字符串一次输入或输出 用 s 格式符 输出时从数组的第一个字符开始逐个字符输出 直到遇到第一个 0 为止 例 charst 15 Iamaboy printf st s c c st st 3 st 7 输出结果 Iamaboy mb 2020 2 21 C语言程序设计教程 47 例7 11字符串输出示例 includemain charstr 8 Beijing inti for i 0 str i 0 i printf c str i printf n printf s str 输出结果为 BeijingBeijing 注意 输出字符不包括 0 用 c输出 printf中的输出项是数组元素名 用 s输出 在printf的输出表列中 只需给出字符串首地址 用字符数组名表示 若数组长度大于字符串实际长度 则以 0 为结束标志 只输出实际的字符串 若字符数组中包括多个 0 以第一个为结束标志 2020 2 21 C语言程序设计教程 48 2 用puts函数输出字符串 函数原型 intput char str 调用格式 puts str 函数功能 将字符数组str中包含的字符串或str所指示的字符串输出 同时将 0 转换成换行符 例 charch student puts ch puts Hello 将字符数组中包含的字符串输出 然后再输出一个换行符 因此 用puts 输出一行 不必另加换行符 n 函数puts每次只能输出一个字符串 而printf可以输出几个 printf s s str1 str2 2020 2 21 C语言程序设计教程 49 2 字符串的输入 1 使用scanf函数输入字符串逐个字符输入 用 c按字符序列输入整个字符串输入 用 s输入字符串如 voidmain charc1 10 c2 10 for i 0 i 10 i scanf c 说明 1 从键盘输入的字符串应短于已定义的字符数组的长度 系统自动加 0 2 用 s输入时 输入项中是字符数组名 不加地址符 2020 2 21 C语言程序设计教程 50 3 输入时 以回车或空格作为结束标志 即 用scanf输入的字符串中不能含有空格 若按如下方法输入 Howdoyoudo 执行语句 scanf s st 则s的内容为 How 0使用格式字符串 s 时会自动加上结束标志 0 第一个空格后的字符没有输入st中 2 使用函数gets 输入字符函数原型 char gets char str 调用格式 gets str str是一个字符数组或指针 函数功能 从键盘读入一个字符串到str中 并自动在末尾加字符串结束标志符 0 输入字符串时以回车结束输入 这种方式可以读入含空格符的字符串 2020 2 21 C语言程序设计教程 51 如 chars 14 gets s 若输入的字符串为 Howdoyoudo 则s的内容为 Howdoyoudo 0l注意 puts gets只对一个字符串操作 而不对多个字符串 gets函数在回车为结束标志 puts gets函数使用时要包含stdio h头文件 2020 2 21 C语言程序设计教程 52 例7 14字符串输入输出示例 includemain chars 20 s1 20 scanf s s printf s n s scanf s s s s1 printf s s s1 s s s1 puts n gets s puts s 程序运行过程 Howdoyoudo HowHowdoyoudo s How s1 doHowdoyoudo Howdoyoudo 2020 2 21 C语言程序设计教程 53 7 4 4字符处理函数 C语言提供了一些常用的库函数 其函数原型说明在string h中1 字符串拷贝函数 strcpy 调用格式 strcpy d str s str 功能 将源字符串s str复制到目标字符数组d str中 charstr1 10 str2 Beijing strcpy str1 str2 说明 1 字符数组1的长度应不小于字符串2的长度 2 字符数组1必须写成数组名形式 字符串2用字符数组名或字符串常量 3 0 一起复制 2020 2 21 C语言程序设计教程 54 4 不能用赋值语句给字符数组赋以字符串常量或字符数组 如 str1 Beijing str1 str2 用赋值语句只能将一个字符赋给一个字符变量或字符数组元素 改错 charstr1 10 Beijing str2 10 str2 Olympic str1 str2 strcpy str2 str1 strcpy 2008 str2 2020 2 21 C语言程序设计教程 55 2 字符串连接函数strcat 调用格式 strcat d str s str 功能 将s str连同 0 连接到d str的最后一个字符 非 0 字符 后面 结果放在d str中 例 chars1 14 Iama chars2 5 boy strcat s1 s2 连接前 s1 s2 连接后 s1l说明 1 字符数组1必须足够大 以容纳新字符串 2 连接前每个串后有 0 连接后只有一个 0 2020 2 21 C语言程序设计教程 56 3 字符串比较函数strcmp 调用格式 strcmp str1 str2 功能 若str1 str2 则函数返回值为0 若str1 str2 则函数返回值为正整数 若str1 str2 则函数值返回为负整数 比较规则 两个字符串自左至右逐个字符比较 直到出现不同字符或遇到 0 为止 如字符全部相同 则两个字符串相等 若出现不同字符 则遇到的第一对不同字符的ASC 大者为大 Program 大于 People English 小于 Language 比较两字符串是否相等一般用以下形式 if strcmp str1 str2 0 而if str1 str2 是错误的 2020 2 21 C语言程序设计教程 57 4 字符长度函数strlen 调用格式 strlen 字符串 功能 求字符串的实际长度即所含字符个数 不包括 0 例 charstr 10 student intlength strl length strlen str strl strlen verygood 9 结果 length 7strl 9 2020 2 21 C语言程序设计教程 58 例7 17从键盘上输入两个字符串 若不相等 将短的字符串连接到长的字符串的末尾并输出 include includemain intlen1 len2chars1 80 s2 80 gets s1 gets s2 if strcmp s1 s2 0 if strlen s1 strlen s2 strcat s1 s2 puts s1 else strcat s2 s1 puts s2 输入 you Thank 输出 Thankyou 2020 2 21 C语言程序设计教程 59 7 5数组作为函数的参数 数组作为函数参数主要有两种情况 数组元素作为函数的实参 这种情况与普通变量作实参一样 是将数组元素的值传给形参 形参的变化不会影响实参数组元素 我们称这种参数传递方式为 值传递 数组名作实参 要求函数形参是相同类型的数组或指针 这种方式是把实参数组的起始地址传给形参数组 形参数组的改变也是对实参数组的改变 称这种参数传递方式为 地址传递 2020 2 21 C语言程序设计教程 60 1 数组元素做函数实参数组元素作为函数实参与简单变量相同 是将元素的值传给函数形参 是单向值传递 函数形参使用简单变量 例7 18从键盘上输入两个字符串 不用字符串函数strcmp 比较两者的大小分析 1 输入两个字符串 分别存放在str1与str2中 2 设计函数compstr 比较两字符 返回ASCII码之差 赋给主函数的变量flag 3 用do while循环依次比较两个字符串的对应字符 结束的条件是两字符串至少有一个结束 或者比较字符不相等 4 当循环结束时flag的值为0或为第一个不相等的字符的ASCII码值之差 由此可以判断出字符串的大小 2020 2 21 C语言程序设计教程 61 程序如下 includemain inti flag intcompstr char char charstr1 80 str2 80 gets str1 gets str2 i 1 do i flag compstr str1 i str2 i 数组元素作实参 while str1 i 0 只要有一个字符串到了末尾比较结束 2020 2 21 C语言程序设计教程 62 if flag 0 printf s s str1 str2 elseif flag 0 printf s s str1 str2 elseprintf s s str1 str2 intcompstr charc1 charc2 intt t c1 c2 returnt 输入 verywell verygood 输出 verywell verygood 2020 2 21 C语言程序设计教程 63 2 数组名作函数参数将数组名作函数参数 实参 形参都用数组名 属于赋地址调用 例不使用库函数strcat 写一个函数连接两个字符串 includevoidconnection charstr1 50 charstr2 50 charstr 100 inti j for i 0 str1 i 0 i str i str1 i for j 0 str2 j 0 j str i str2 j str i 0 2020 2 21 C语言程序设计教程 64 voidmain chars1 50 s2 50 s 100 printf Inputstring1 gets s1 printf nInputstring2 gets s2 connection s1 s2 s printf Thenewstringis s n s Inputstring1 Beijing2008Inputstring2 OlympicThenewstringis Beijing2008Olympic 2020 2 21 C语言程序设计教程 65 由此看出 数组名作函数参数时形参与实参都应使用数组名 且分别在被调用函数与主调函数中的说明 实参与形参类型要一致 实参数组与形参数组大小可以不一致 形参数组可不指定大小 C编译程序不检查形参数组的大小 1 在一维形参数组名后面可只跟一对空方括号 为在被调用函数中处理数组元素的需要 可另设一参数来传递数组元素个数 如 intlenstr charstr1 intk k为要处理的字符数 2 对多维数组而言 形参的第一维可不指定 但其它维必须指定 如 chargrade floatscore 4 intk k为数组行数 2020 2 21 C语言程序设计教程 66 数组名做函数参数时是把实参数组的起始地址传给了形参数组 即 形参数组与实参数组对应同一段内存单元 利用这个特点 可用数组返回多个值 例7 19用冒泡法将10个数按由小到大排序冒泡法的基本思想 相邻两数比较 若前面数大 则两数交换位置 直至最后一个元素被处理 最大的元素就 沉 到最下面 即在最后一个元素位置 这样 如有n个元素 共进行n 1轮 每轮让剩余元素中最大的元素 沉 到下面 从而完成排序 事实上 n 1轮是最多的排序轮数 只要在某一轮排序中没有进行元素交换 说明已排好序 可以提前退出外循环 结束排序 2020 2 21 C语言程序设计教程 67 程序如下 include defineN80main inta N inti m voidsort intb intk voidprint intb intk printf nInputm 80 scanf d 2020 2 21 C语言程序设计教程 68 voidsort intb intk inti j t flag for j 0 jb i 1 t b i 相邻元素交换位置 b i b i 1 b i 1 t flag 1 有元素交换 标志置1 if flag 0 break 没有交换元素 结束循环 2020 2 21 C语言程序设计教程 69 voidprint intb intk inti for i 0 i k i if i 4 0 putchar n printf 6d b i 输入 Inputm 80 8 120 40815344 24 输出 24 40120445381 2020 2 21 C语言程序设计教程 70 用多维数组名作函数参数例7 14求数组元素的最大值与最小值 并把它们分别放在第一 第二个元素中 includemaxmin intb 4 intI j max min max min b 0 0 for I 0 Imax max b I j elseif b I j min min b I j b 0 0 max b 0 1 min return max main inta 3 4 1 0 32 21 10 4 4 4 345 2 12 0 printf max d n maxmin a printf max d a 0 0 printf min d a 0 1 2020 2 21 C语言程序设计教程 71 7 6程序举例 例7 15从键盘上输入一个正整数 判断其是否为回文数 所谓回文数是顺读与反读都一样的数 如 12321 23455432都是回文数 解题的基本思想 将数n按位对10求模 求出每一位数字并按顺序保存在数组digit中 根据回文数的特点 将分解出的数字序列的左 右两端数字两两比较 并向中间靠拢 用i k两个变量记录两端数字序号 若直到位置重叠时各位数字都相等 则为回文数 否则 不是 2020 2 21 C语言程序设计教程 72 程序如下 include stdio h include string h main inti k digit 10 longn m puts 输入一个正整数 scanf ld 2020 2 21 C语言程序设计教程 73 接上页 for i 0 i k i k if digit i digit k break 不相等 则不是回文数 退出循环 if i k printf ld不是一个回文数 n elseprintf ld是一个回文数 n 输入 134431输出 134431是一个回文数 2020 2 21 C语言程序设计教程 74 includemain charc string 81 intI num 0 word 0 gets string for I 0 c sting I 0 I if c word 0 elseif word 0 word 1 num printf Thereare dwordsintheline n num 运行情况 输入 Iamaboy 输出 Thereare4wordsintheline 例7 16输入一行字符 统计其中有多少个单词 单词之间用空格隔开
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


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


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

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


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