C语言PPT谭浩强教材配套版第7章.ppt

上传人:max****ui 文档编号:6332719 上传时间:2020-02-23 格式:PPT 页数:80 大小:554KB
返回 下载 相关 举报
C语言PPT谭浩强教材配套版第7章.ppt_第1页
第1页 / 共80页
C语言PPT谭浩强教材配套版第7章.ppt_第2页
第2页 / 共80页
C语言PPT谭浩强教材配套版第7章.ppt_第3页
第3页 / 共80页
点击查看更多>>
资源描述
7 1一维数组的定义和引用7 2二维数组的定义和引用7 3字符数组习题 第7章数组 迄今为止 我们使用的都是属于基本类型 整型 字符型 实型 的数据 c语言还提供了构造类型的数据 它们有 数组类型 结构体类型 共用体类型 构造类型数据是由基本类型数据按一定规则组成的 因此有的书称它们为 导出类型 本章只介绍数组 数组是有序数据的集合 数组中的每一个元素都属于同一个数据类型 用一个统一的数组名和下标来唯一地确定数组中的元素 有关数组的概念和其他高级语言中介绍的是相同的 不再赘述 本章只介绍c语言中如何定义和使用数组 7 1一维数组的定义和引用 7 1 1一维数组的定义一维数组的定义方式为类型说明符数组名 常量表达式 例如 inta 10 它表示数组名为a 此数组有10个元素 说明 1 数组名定名规则和变量名相同 遵循标识符定名规则 2 数组名后是用方括弧括起来的常量表达式 不能用圆括弧 下面用法不对 inta 10 3 常量表达式表示元素的个数 即数组长度 例如 在a 10 中 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 4 常量表达式中可以包括常量和符号常量 不能包含变量 也就是说 c不允许对数组的大小作动态定义 即数组的大小不依赖于程序运行过程中变量的值 例如 下面这样定义数组是不行的 intn scanf d 7 1 2一维数组元素的引用数组必须先定义 然后使用 c语言规定只能逐个引用数组元素而不能一次引用整个数组 数组元素的表示形式为数组名 下标 下标可以是整型常量或整型表达式 例如 a 0 a 5 a 7 a 2 3 例7 1数组元素的引用 main inti a 10 for i 0 i 9 i a i i for i 9 i 0 i printf d a i 运行结果如下 9876543210程序使a 0 到a 9 的值为0 9 然后按逆序输出 7 1 3一维数组的初始化对数组元素的初始化可以用以下方法实现 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 2 可以只给一部分元素赋值 例如 inta 10 0 1 2 3 4 定义a数组有10个元素 但花括弧内只提供5个初值 这表示只给前面5个元素赋初值 后5个元素值为0 3 如果想使一个数组中全部元素值为0 可以写成inta 10 0 0 0 0 0 0 0 0 0 0 不能写成inta 10 0 10 这是与FORTRAN语言不同的 不能给数组整体赋初值 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 7 1 4一维数组程序举例例7 2用数组来处理求fibonacci数列问题 程序如下 main 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 运行结果如下 11235813213455891442333776109871597258441816765if语句用来控制换行 每行输出5个数据 例7 3用起泡法对10个数排序 由小到大 起泡法的思路是 将相邻两个数比较 将小的调到前头 见图7 1 图7 1 图7 2 若有6个数 第一次将8和9对调 第二次将第2和第3个数 9和5 对调 如此共进行5次 得到8 5 4 2 0 9的顺序 可以看到 最大的数9已 沉底 成为最下面一个数 而小的数 上升 最小的数0已向上 浮起 一个位置 经第一趟 共5次 后 已得到最大的数 然后进行第二趟比较 对余下的前面5个数按上法进行比较 见图7 2 经过4次比较 得到次大的数8 如此进行下去 可以推知 对6个数要比较5趟 才能使6个数按大小顺序排列 在第一趟中要进行两个数之间的比较共5次 在第二趟中比4次 第5趟比1次 如果有n个数 则要进行n 1趟比较 在第1趟比较中要进行n 1次两两比较 在第j趟比较中要进行n j次两两比较 据此画出流程图 见图7 3 根据流程图写出程序 今设n 10 定义数组长度为11 本例中对a 0 不用 只用a 1 到a 10 以符合人们的习惯 图7 3 main inta 11 inti j t printf input10numbers n for i 1 ia i 1 t a i a i a i 1 a i 1 t printf thesortednumbers n for i 1 i 11 i printf d a i 运行情况如下 input10numbers 10481265 76100 45123 thesortednumbers 76 4501481265100123 7 2 1二维数组的定义二维数组定义的一般形式为类型说明符数组名 常量表达式 常量表达式 例如 floata 3 4 b 5 10 定义a为3 4 3行4列 的数组 b为5 10 5行10列 的数组 注意不能写成floata 3 4 b 5 10 c语言对二维数组采用这样的定义方式 使我们可以把二维数组看作是一种特殊的一维数组 它的元素又是一个一维数组 例如 可以把a看作是一个一维数组 它有3个元素 a 0 a 1 7 2二维数组的定义和引用 a 2 每个元素又是一个包含4个元素的一维数组 见图7 4 可以把a 0 a 1 a 2 看作是3个一维数组的名字 上面定义的二维数组可以理解为定义了3个一维数组 即相当于floata 0 4 a 1 4 a 2 4 图7 5 图7 4 此处把a 0 a 1 a 2 看作一维数组名 c语言的这种处理方法在数组初始化和用指针表示时显得很方便 这在以后会体会到 c语言中 二维数组中元素排列的顺序是 按行存放 即在内存中先顺序存放第一行的元素 再存放第二行的元素 图7 5表示对a 3 4 数组存放的顺序 c允许使用多维数组 有了二维数组的基础 再掌握多维数组是不困难的 例如 定义三维数组的方法是floata 2 3 4 多维数组元素在内存中的排列顺序 第一维的下标变化最慢 最右边的下标变化最快 例如 上述三维数组的元素排列顺序为a 0 0 0 a 0 0 1 a 0 0 2 a 0 0 3 a 0 1 0 a 0 1 1 a 0 1 2 a 0 1 3 a 0 2 0 a 0 2 1 a 0 2 2 a 0 2 3 a 1 0 0 a 1 0 1 a 1 0 2 a 1 0 3 a 1 1 0 a 1 1 1 a 1 1 2 a 1 1 3 a 1 2 0 a 1 2 1 a 1 2 2 a 1 2 3 7 2 2二维数组的引用二维数组的元素的表示形式为数组名 下标 下标 如a 2 3 下标可以是整型表达式 如a 2 1 2 2 1 不要写成a 2 3 a 2 1 2 2 1 形式 数组元素可以出现在表达式中 也可以被赋值 例如 b 1 2 a 2 3 2在使用数组元素时 应该注意下标值应在已定义的数组大小的范围内 常出现的错误是 inta 3 4 a 3 4 3 定义a为3 4的数组 它可用的行下标值最大为2 列下标值最大为3 用a 3 4 超过了数组的范围 请读者严格区分在定义数组时用的a 3 4 和引用元素时的a 3 4 的区别 前者a 3 4 用来定义数组的维数和各维的大小 后者a 3 4 中的3和4是下标值 a 3 4 代表某一个元素 7 2 3二维数组的初始化可以用下面的方法对二维数组初始化 1 分行给二维数组赋初值 如inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 这种赋初值方法比较直观 把第1个花括弧内的数据给第1行的元素 第2个花括弧内的数据赋给第2行的元素 即按行赋初值 2 可以将所有数据写在一个花括弧内 按数组排列的顺序对各元素赋初值 如 inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 效果与前相同 但以第1种方法为好 一行对一行 界限清楚 用第2种方法如果数据多 写成一大片 容易遗漏 也不易检查 3 可以对部分元素赋初值 inta 3 4 1 5 9 它的作用是只对各行第1列的元素赋初值 其余元素值自动为0 赋初值后数组各元素为100050009000也可以对各行中的某一元素赋初值 inta 3 4 1 0 6 0 0 11 初始化后的数组元素如下 1000060000110这种方法对非0元素少时比较方便 不必将所有的0都写出来 只需输入少量数据 也可以只对某几行元素赋初值 inta 3 4 1 5 6 数组元素为100056000000 第3行不赋初值 也可以对第2行不赋初值 inta 3 4 1 9 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 系统会根据数据总个数分配存储空间 一共12个数据 每行4列 当然可确定为3行 在定义时也可以只对部分元素赋初值而省略第一维的长度 但应分行赋初值 如 inta 4 0 0 3 0 10 这样的写法 能通知编译系统 数组共有3行 数组各元素为0030000001000从本节的介绍中可以看到 c语言在定义数组和表示数组元素时采用a 这种两个方括弧的方式 对数组初始化时十分有用 它使概念清楚 使用方便 不易出错 7 2 4二维数组程序举例例7 4将一个二维数组行和列元素互换 存到另一个二维数组中 例如 a 123b 144562536程序如下 main 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 123456 arrayb 142536例7 5有一个3 4的矩阵 要求编程序求出其中值最大的那个元素的值 以及其所在的行号和列号 先用N S流程图表示算法 见图7 6 据此写出以下程序 图7 6 main 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 输出结果为 max 10 row 2 colum 1由于数值型数组的概念和应用与其他高级语言差不多 读者比较熟悉 因此不再赘述 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 定义c为字符数组 包含10个元素 在赋值以后数组的状态如图7 7所示 7 3字符数组用来存放字符数据的数组是字符数组 字符数组中的一个元素存放一个字符 图7 7也可以用整型数值来存放字符型数据 因此上面第一行也可以改用 intc 10 合法 但浪费存储空间 7 3 2字符数组的初始化对字符数组初始化 最容易理解的方式是逐个字符赋给数组中各元素 如 charc 10 I a m h a P P y 把10个字符分别赋给c 0 到c 9 10个元素 如果花括弧中提供的初值个数 即字符个数 大于数组长度 则按语法错误处理 如果初值个数小于数组长度 则只将这些字符赋给数组中前面那些元素 其余的元素自动定为空字符 即 0 如 charc 10 c P r o g r a m 数组状态如图7 8所示 图7 8如果提供的初值个数与预定的数组长度相同 在定义时可以省略数组长度 系统会自动根据初值个数确定数组长度 如 charc I a m h a p p y 数组c的长度自动定为10 用这种方式可以不必人工去数字符的个数 尤其在赋初值的字符个数较多时 比较方便 也可以定义和初始化一个二维字符数组 如 chardiamond 5 5 用它代表一个钻石形的平面图形 见图7 9 完整的程序见例7 7 图7 9 例7 6输出一个字符串 main 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输出一个钻石图形 main 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语言中 将字符串作为字符数组来存放 例7 6就是用一个一维的字符数组存放一个字符串 Iamaboy 中的字符 这个字符串的实际长度与数组长度相等 有时 人们关心的是有效字符串的长度而不是字符数组的长度 例如 定义一个字符数组长度为100 而实际有效字符只有40个 为了测定字符串的实际长度 c语言规定了一个 字符串结束标志 以字符 0 代表 如果有一个字符串 其中第10个字符为 0 则此字符串的有效字符为9个 也就是说 在遇到字符 0 时 表示字符串结束 由它前面的字符组成字符串 系统对字符串常量也自动加一个 0 作为结束符 例如 cProgram 共有9个字符 但在内存中占10个字节 最后一个字节 0 是由系统自动加上的 字符串作为一维数组存放在内存中 有了结束标志 0 后 字符数组的长度就显得不那么重要了 在程序中往往依靠检测 0 的位置来判定字符串是否结束 而不是根据数组的长度来决定字符串长度 当然 在定义字符数组时应估计实际字符串长度 保证数组长度始终大于字符串实际长度 如果在一个字符数组中先后存放多个不同长度的字符串 则应使数组长度大于最长的字符串的长度 说明 0 代表ASCII码为0的字符 从ASCII码表中可以查到 ASCII码为0的字符不是一个可以显示的字符 而是一个 空操作符 即它什么也不做 用它来作为字符串结束标志不会产生附加的操作或增加有效字符 只起一个供辨别的标志 我们以前曾用过以下的语句 printf Howdoyoudo n 即输出一个字符串 在执行此语句时系统怎么知道应该输出到哪里为止呢 实际上 在内存中存放时 系统自动在最后一个字符 n 的后面加了一个 0 作为字符串结束标志 在执行printf函数时 每输出一个字符检查一次 看下一个字符是否 0 遇 0 就停止输出 对c语言处理字符串的方法有以上的了解后 我们再对字符数组初始化的方法补充一种方法 可以用字符串常量来使字符数组初始化 例如charc Iamhappy 也可以省略花括弧 直接写成charc Iamhappy 不是用单个字符作为初值 而是用一个字符串 注意字符串的两端是用双引号而不是单引号括起来的 作为初值 显然 这种方法直观 方便 符合人们的习惯 数组c的长度不是10 而是11 这点务请注意 因为字符串常量的最后由系统加上一个 0 因此 上面的初始化与下面的初始化等价 charc I a m h a p p y 0 而不与下面的等价 charc I a m h a p p y 前者的长度为11 后者的长度为10 如果有charc 10 china 数组c的前5个元素为 c h i n a 第6个元素为 0 后4个元素为空字符 见图7 10 图7 10需要说明的是 字符数组并不要求它的最后一个字符为 0 甚至可以不包含 0 像以下这样写完全是合法的 charc 5 c h i n a 是否需要加 0 完全根据需要决定 但是由于系统对字符串常量自动加一个 0 因此 人们为了使处理方法一致 便于测定字符串的实际长度 以及在程序中作相应的处理 在字符数组也常常人为地加上一个 0 如 charc 6 c h i n a 0 7 3 5字符数组的输入输出字符数组的输入输出可以有两种方法 1 逐个字符输入输出 用格式符 c 输入或输出一个字符 如例7 6 2 将整个字符串一次输入或输出 用 S 格式符 意思是输出字符串 String 例如 charc china printf S c 在内存中数组c的状态如图7 11所示 输出时 遇结束符 0 就停止输出 输出结果为 chinachina 0 图7 11请注意 1 输出字符不包括结束符 0 2 用 S 格式符输出字符串时 printf函数中的输出项是字符数组名 而不是数组元素名 写成下面这样是不对的 printf S c 0 3 如果数组长度大于字符串实际长度 也只输出到遇 0 结束 如charc 10 china printf S c 也只输出 china 5个字符 而不是输出10个字符 这就是用字符串结束标志的好处 4 如果一个字符数组中包含一个以上 0 则遇第一个 0 时输出就结束 可以用scanf函数输入一个字符串 例如scanf S c scanf函数中的输入项c是字符数组名 它应该在先前已被定义 从键盘输入的字符串应短于已定义的字符数组的长度 例如 已定义charc 6 从键盘输入 china 系统自动在后面加一个 0 结束符 如果利用一个scanf函数输入多个字符串 则以空格分隔 例如 charstrl 5 Str2 5 Str3 5 scanf S S S Str1 Str2 Str3 输入数据 Howareyou 输入后Str1 Str2 Str3数组状态见图7 12 数组中未被赋值的元素的值是不可预料的 图7 12若改为charstr 13 scanf S Str 如果输入以下12个字符Howareyou 实际上并不是把这12个字符加上 0 送到数组 Str中 而只将空格前的字符 How 送到str中 由于把 How 作为一个字符串处理 因此在其后加 0 Str数组状态见图7 13 需要注意 scanf函数中的输入项是字符数组名 输入项为字符数组名时 不要再加地址符 因为在c语言中数组名代表该数组的起始地址 下面写法不对 scanf S Str 图7 14所示的数组 若其名字为c 占6个字节 程序中如果只写数组名c 它就代表地址2000 例如 图7 13 图7 14printf o c 可以输出数组c的起始地址2000 前面介绍的输出字符串的方法 printf S c 实际上是这样执行的 按字符数组名c找到其数组起始地址 然后逐个输出其中的字符 直到遇 0 为止 由于c语言用一维字符数组存放字符串 而且允许用数组名进行输入或输出一个字符串 因此 也可以把一维字符数组看作相当于其他语言 如BASIC 中的 字符串变量 7 3 6字符串处理函数在c的函数库中提供了一些用来处理字符串的函数 使用方便 几乎所有版本的c都提供这些函数 下面介绍几种常用的函数 1 puts 字符数组 其作用是 将一个字符串 以 0 结束的字符序列 输出到终端 假如已定义Str是一个字符数组名 且该数组已被初始化为 china 则执行PutS Str 其结果是在终端上输出china 由于可以用printf函数输出字符串 因此Puts函数用的不多 用Puts函数输出的字符串中可以包含转义字符 例如 charstr china nbeijing puts str 输出 chinabeijing在输出时将字符串结束标志 0 转换成 n 即输出完字符串后换行 2 gets 字符数组 其作用是 从终端输入一个字符串到字符数组 并且得到一个函数值 该函数值是字符数组的起始地址 如执行下面的函数 gets str 从键盘输入 computer 将输入的字符串 computer 送给字符数组Str 请注意送给数组的共有9个字符 而不是8个字符 函数值为字符数组Str的起始地址 一般利用gets函数的目的是向字符数组输入一个字符串 而不大关心其函数值 注意 用Puts和gets函数只能输入或输出一个字符串 不能写成puts str1 str2 或gets str1 str2 3 strcat 字符数组1 字符数组2 strcat是stringcatenate 字符串连接 的缩写 其作用是 连接两个字符数组中的字符串 把字符串2接到字符串1的后面 结果放在字符数组1中 函数调用后得到一个函数值 字符数组1的地址 例如 charstr1 30 people srepublicof charstr2 china printf s strcat str1 str2 输出 people srepublicofchina连接前后的状况见图7 15所示 图7 15说明 1 字符数组1必须足够大 以便容纳连接后的新字符串 本例中定义Str1的长度为30 是足够大的 如果在定义时改用Str1 PeoPle sRebuplicof 就会出问题 因长度不够 2 连接前两个字符串的后面都有一个 0 连接时将字符串1后面的 0 取消 只在新串最后保留一个 0 4 strcPy 字符数组1 字符串2 StrcPy是STRingcoPY 字符串复制 的缩写 它是 字符串复制函数 作用是将字符串2复制到字符数组1中去 例如 charstr1 10 Str2 china StrcPy Str1 Str2 执行后 Str1的状态如图7 16所示 图7 16 说明 1 字符数组1必须定义得足够大 以便容纳被复制的字符串 字符数组1的长度不应小于字符串2的长度 2 字符数组1 必须写成数组名形式 如Str1 字符串2 可以是字符数组名 也可以是一个字符串常量 如Strcpy Str1 china 作用与前相同 3 复制时连同字符串后面的 0 一起复制到字符数组1中 4 不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组 如下面两行都是不合法的 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 可以用Strncpy函数将字符串2中前面若干个字符复制到字符数组1中去 例如 Strncpy Str1 Str2 2 作用是将Str2中前面2个字符复制到Str1中去 取代Str1中最前面2个字符 5 strcmp 字符串1 字符串2 Strcmo是stringcompare 字符串比较 的缩写 作用是比较字符串1和字符串2 例如 Strcmp Str1 Str2 Strcmp china Korea Strcmp Str1 beijing 字符串比较的规则与其他语言中的规则相同 即对两个字符串自左至右逐个字符相比 按ASCII码值大小比较 直到出现不同的字符或遇到 0 为止 如全部字符相同 则认为相等 若出现不相同的字符 则以第一个不相同的字符的比较结果为准 例如 a a computer compare these that 36 54 china canada DOG 字符串2 函数值为一正整数 3 如果字符串1 字符串2 函数值为一负整数 注意 对两个字符串比较 不能用以下形式 if Str1 Str2 printf yes 而只能用if StrcmP Str1 Str2 0 printf yes 6 strlen 字符数组 Strlen是StringLenght 字符串长度 的缩写 它是测试字符串长度的函数 函数的值为字符串中的实际长度 不包括 0 在内 如 charstr 10 china printf d Strlen Str 输出结果不是10 也不是6 而是5 也可以直接测字符串常量的长度 如Strlen china 7 strlwr 字符串 Strlwr是StringLowercase 字符串小写 的缩写 函数的作用是将字符串中大写字母换成小写字母 8 struPr 字符串 Strupr是Stringuppercase 字符串大写 的缩写 函数的作用是将字符串中小写字母换成大写字母 以上介绍了常用的8种字符串处理函数 应当再次强调 库函数并非c语言本身的组成部分 而是人们为使用方便而编写 提供大家使用的公共函数 每个系统提供的函数数量和函数名 函数功能都不尽相同 使用时要小心 必要时查一下库函数手册 当然 有一些基本的函数 包括函数名和函数功能 不同的系统所提供的是相同的 这就为程序的通用性提供了基础 7 3 7字符数组应用举例例7 8输入一行字符 统计其中有多少个单词 单词之间用空格分隔开 程序如下 includemain 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 程序中变量i作为循环变量 num用来统计单词个数 word作为判别是否单词的标志 若word 0表示未出现单词 如出现单词word就置成1 算法见图7 17所示 图7 17 解题的思路是这样的 单词的数目可以由空格出现的次数决定 连续的若干个空格作为出现一次空格 一行开头的空格不统计在内 如果测出某一个字符为非空格 而它的前面的字符是空格 则表示 新的单词开始了 此时使num 单词数 累加1 如果当前字符为非空格而其前面的字符也是非空格 则意味着仍然是原来那个单词的继续 num不应再累加1 前面一个字符是否空格可以从word的值看出来 若word 0 则表示前一个字符是空格 如果word 1 意味着前一个字符为非空格 可以用图7 18表示 图7 18程序中for语句中的 循环条件 为 c String i 0 它的作用是先将字符数组的某一元素 一个字符 赋给字符变量c 此时赋值表达式的值就是该字符 然后再判定它是否结束符 这个 循环条件 包含了一个赋值操作和一个关系运算 可以看到用for循环可以使程序简练 例7 9有3个字符串 要求找出其中最大者 今设一个二维的字符数组Str 大小为3 20 即有3行20列 每一行可以容纳20个字符 图7 19表示此二维数组的情况 图7 19 如前所述 可以把str 0 str 1 str 2 看作3个一维字符数组 它们各有20个元素 可以把它们如同一维数组那样进行处理 可以用gets函数分别读入3个字符串 经过二次比较 就可得到值最大者 把它放在一维字符数组String中 程序如下 main 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当然 这个题目也可以不采用二维数组 而设3个一维字符数组来处理 读者可自己完成 7 习题7 1用筛法求100之内的素数 7 2用选择法对10个整数排序 7 3求一个3 3矩阵对角线元素之和 7 4已有一个已排好序的数组 今输入一个数 要求按原来排序的规律将它插入数组中 7 5将一个数组中的值按逆序重新存放 例如 原来顺序为8 6 5 4 1 要求改为1 4 5 6 8 7 6打印出以下的杨辉三角形 要求打印出10行 11112113311464115101051 7 7找出一个二维数组中的鞍点 即该位置上的元素在该行上最大 在该列上最小 也可能没有鞍点 7 8有一篇文章 共有3行文字 每行有80个字符 要求分别统计出其中英文大写字母 小写字母 数字 空格以及其他字符的个数 7 9有一行电文 已按下面规律译成密码 a Za zb Yb yc Xc x 即第1个字母变成第26个字母 第i个字母变成第 26 i 1 个字母 非字母字符不变 要求编程序将密码译回原文 并打印出密码和原文 7 10编一程序 将两个字符串连接起来 不要用Strcat函数 7 11编一个程序 将两个字符串S1和S2比较 如果S1 S2 输出一个正数 S1 S2 输出0 S1 S2 输出一个负数 不要用Strcmp函数 两个字符串用gets函数读入 输出的正数或负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值 例如 a 与 c 相比 由于 a c 应输出负数 由于 a 与 c 的ASCII码差值为2 因此应输出 2 同理 and 和 aid 比较 根据第2个字符比较结果 n 比 i 大5 因此应输出 5 7 12编写一个程序 将字符数组s2中的全部字符拷贝到字符数组s1中 不用strcpy函数 拷贝时 0 也要拷贝过去 0 后面的字符不拷贝
展开阅读全文
相关资源
相关搜索

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


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

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


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