




已阅读5页,还剩74页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
请用PowerPoint2003播放 第5章数组与字符串 本章导读 学习完本章以后 你将能够 掌握一维数组 二维数组的定义和引用 掌握与数组有关的常用算法 如排序算法等 了解数组在数值计算 数据统计 排序和数据检索方面的应用 掌握字符数组的定义及应用 掌握利用字符串函数对字符数据进行简单处理 内容介绍 本章主要讨论各种不同类型的一维和二维数组及其应用 要求学生理解数组的概念 掌握数组的形式化定义 数组的初始化方法 数组元素的访问规则 在此基础上学习数组的使用方法 如数组中元素的查找 排序 插入 计算等 字符数组作为一种特殊的数组 用来存储字符串 要求学生掌握字符串的操作函数 通过数组的学习提高学生的数据管理能力和编程能力 教学目的 掌握一 二维数组的输入输出和使用方法 掌握多维数组程序的设计与应用 字符数组与字符串 掌握多维数组及相关程序的设计 调试与运行 理解数组的概念掌握数组的形式化定义 数组的初始化方法掌握数组元素的访问规则掌握与数组有关的常用算法 如排序算法等 了解数组在数值计算 数据统计 排序和数据检索方面的应用掌握字符数组的定义及应用掌握字符串的操作函数 教学重点 教学难点 数据的组织和定义 数组名的理解 字符串的相关操作 关键词 一维数组 二维数组 数组元素 下标 字符数组 字符串函数 数值计算 数据统计 排序 数据检索 授课时量 理论学时 4 5 1数组的概念5 2数组的定义5 3数组作为函数的参数5 4数组应用举例5 5字符串5 6本章小结 本章主要内容如下 5 1数组的概念 数组是一组具有相同名字的变量 它是将一系列具有相同属性的若干数据组织在一起而形成的集合 在C语言中 数组有两个要素 数组名和下标 数组用统一的数组名和下标来标示数组中的元素 用下标标示数组中元素的位置 数组中元素的下标从零开始 以数组中元素个数减1结束 如描述全班50个同学的成绩 就可以定义一个一维数组c 50 则下标范围是0 49 如果50个学生 每个同学选修了5门功课 那么学生的成绩用一维数组描述就很困难 需要用二维数组来描述 我们可以用行来描述每个学生的成绩 用列来描述每个功课的成绩 那么这个二维数组可以定义如下 inta 50 5 注 数学中矩阵都可以用二维数组来描述 5 2 1一维数组一维数组的定义定义方式 数据类型数组名 常量表达式 合法标识符 表示元素个数下标从0开始 数组运算符单目运算符优先级 1 左结合不能用 例inta 6 编译时分配连续内存内存字节数 数组维数 sizeof 元素数据类型 数组名表示内存首地址 是地址常量 5 2数组的定义 一维数组的引用数组必须先定义 后使用只能逐个引用数组元素 不能一次引用整个数组数组元素表示形式 数组名 下标 其中 下标可以是常量或整型表达式 例inti 15 intdata i 不能用变量定义数组维数 例inta 10 printf d a 必须for j 0 j 10 j printf d t a j 例intdata 5 data 5 10 C语言对数组不作越界检查 使用时要注意 一维数组的初始化初始化方式 在定义数组时 为数组元素赋初值 在编译阶段使之得到初值 inta 5 1 2 3 4 5 等价于 a 0 1 a 1 2 a 2 3 a 3 4 a 4 5 说明 数组不初始化 其元素值为随机数对static数组元素不赋初值 系统会自动赋以0值 当全部数组元素赋初值时 可不指定数组长度 如inta 5 6 2 3 等价于 a 0 6 a 1 2 a 2 3 a 3 0 a 4 0 如inta 3 6 2 3 5 1 staticinta 5 等价于 a 0 0 a 1 0 a 2 0 a 3 0 a 4 0 只给部分数组元素赋初值 inta 1 2 3 4 5 6 编译系统根据初值个数确定数组维数 例5 1 数组元素的访问 对数组元素进行操作 includemain inta 5 0 1 2 3 8 定义数组a并进行初始化a 0 4 把4赋给a 0 a 1 a 0 把a 0 的值4累加到a 1 使的值变为5a 3 3 a 2 1 把赋值号右边的值7赋给a 3 printf d a a 0 因a 0 4 所以a a 0 对应的元素为 a 4 该语句输出的值8return0 例5 2 定义一个一维数组 通过键盘输入各元素的值 然后逆序输出数组元素的值 includevoidmain inti a 6 定义一个数组a 长度为6for i 0 i 0 i 逆序输出数组元素的值printf d a i 每输出一个值 就输出一个空格 使数据分开 printf n 例5 3 对一个给定的数组 求数组元素中的最大值 includevoidmain inta 8 25 64 38 40 75 66 38 54 定义一个数组a 并赋初值 intmax a 0 定义变量max存储最大值 并假定a 0 最大 for inti 1 imax max a i 将最大者赋给maxprintf max d n max 输出最大值max 例5 4 从若干个数据元素中找出大于某一个数的所有数据 include defineN7 定义符号常量Nvoidmain doublew N 2 6 7 3 4 2 5 4 6 2 3 8 1 4 定义一个数组a并赋初值doublere N x inti count 0 printf s 输入一个实数 scanf lf 记录数组w中大于x的数组元素于数组re中 count 记录数组w中大于x的元素个数 for i 0 i count i 输出所有大于x的数组元素printf w d 5 2lf n i re i printf n 例5 5 斐波那契数列 1 1 2 3 5 8 其规律是从第三个数开始 每一项等于前两项的和 即a i a i 1 a i 2 i 2 3 求该数列的前M M 10 项 include defineM10voidmain inta M 1 1 i 定义含有M个元素的数组a a 0 1 a 1 1 其余元素的值赋为0for i 2 i M i 计算第i个元素a i a i 1 a i 2 求第i 1项for i 0 i M i 按每行五个数据输出数列元素 printf 8d a i 输出a i if i 1 5 0 若一行输出的数据个数已有5个 则换行 printf n 换行 5 2 2二维数组及多维数组二维数组的定义定义方式 数据类型数组名 常量表达式 常量表达式 数组元素的存放顺序原因 内存是一维的二维数组 按行序优先多维数组 最右下标变化最快 例inta 3 4 floatb 2 5 intc 2 3 4 inta 3 4 行数 列数 元素个数 行数 列数 二维数组理解 每个元素a i 由包含4个元素的一维数组组成 二维数组a是由3个元素组成 二维数组元素的引用形式 数组名 下标 下标 二维数组元素的初始化分行初始化 按元素排列顺序初始化 例5 6 对二维数组元素进行操作 给二维数组元素赋值 并按行输出 includemain inti j inta 4 5 0 定义数组 并给所有元素赋初值0a 1 2 6 向a 1 2 元素赋值6a 2 2 3 a 1 2 1 取出a 1 2 的值6参与运算 把赋值号右边表达式的值19赋给a 2 2 元素中for i 0 i 4 i for j 0 j 5 j a i j i 1 j 1 把a i j 的值赋给a i j 1 元素中printf 5d a i j 按十进制整数输出数组元素 各元素占5个字节printf n return0 例5 7 求二组数组元素中最大值 各行元素的平均值 includevoidmain intb 2 5 7 15 2 8 20 12 25 37 16 28 c 2 inti j k b 0 0 for i 0 ik k b i j c i sum 5 求第i行元素的平均值 pirntf d n k 例5 8 求一个二维数组各行元素之和 将结果存储在一个一维数组中 最后求出二维数组的所有元素之和 include defineM4 voidmain intc M 0 定义一个一维数组c 保存二维数组中各行元素之和intd M 3 1 5 7 3 2 10 6 7 9 4 3 7 定义一个二维数组dinti j sum 0 sum存储二维数组d中所有元素之和for i 0 i m i for j 0 j 3 j 求第i 1行元素之和c i d i j sum c i 将各行元素之和累加 用以求所有元素之和for i 0 i M i printf d t c i printf n printf d n sum 数组元素作函数实参 值传递 例两个数组大小比较 n 0m 0k 0 a和b为有10个元素的整型数组比较两数组对应元素变量n m k记录a i b i a i b i a i k 认为数组a b若n k 认为数组a b若n k 认为数组a b 5 3数组作为函数参数 数组名作函数参数地址传递在主调函数与被调函数分别定义数组 且类型应一致形参数组大小 多维数组第一维 可不指定形参数组名是地址变量 例求学生的平均成绩 includefloataverage intstu 10 intn voidmain intscore 10 i floatav printf Input10scores n for i 0 i 10 i scanf d floataverage intstu 10 intn inti floatav total 0 for i 0 i n i total stu i av total n returnav 实参用数组名 形参用数组定义 intstu 例数组元素与数组名作函数参数比较 a 0 a 1 includevoidswap2 intx inty intz z x x y y z main inta 2 1 2 swap2 a 0 a 1 printf a 0 d na 1 d n a 0 a 1 值传递 includevoidswap2 intx intz z x 0 x 0 x 1 x 1 z main inta 2 1 2 swap2 a printf a 0 d na 1 d n a 0 a 1 地址传递 例数组元素与数组名作函数参数比较 例数组排序 简单选择排序 9 49 i 0 例数组排序 简单选择排序 13 68 i 1 i 8 例数组排序 简单选择排序 例求二维数组中最大元素值 intmax value intarray 3 4 inti j k max max array 0 0 for i 0 imax max array i j return max main inta 3 4 1 3 5 7 2 4 6 8 15 17 34 12 printf maxvalueis d n max value a 例求二维数组中各行元素之和 get sum row intx 3 intresult introw intcol inti j for i 0 i row i result i 0 for j 0 j col j result i x i j main inta 2 3 3 6 9 1 4 7 intsum row 2 row 2 col 3 i get sum row a sum row row col for i 0 i row i printf Thesumofrow d d n i 1 sum row i 18 12 5 4数组应用举例 数组是表示和存储数据的一种重要方法 是一种典型的数据组织形式 在实际中应用非常广泛 如计算 统计 排序 查找各种运算 例5 12 已知两个矩阵A和B如下 7 5 33 6 9A 2 8 6B 2 8 31 4 25 2 7编一程序计算出矩阵A B的和 差 include defineN3voidmain inta N N 7 5 3 2 8 6 1 4 2 intb N N 3 6 9 2 8 3 5 2 7 inti j c N N d N N for i 0 i N i for j 0 j N j c i j a i j b i j 计算矩阵a b对应元素的和d i j a i j b i j 计算矩阵a b对应元素的差 for i 0 i N i 输出矩阵c for j 0 j N j printf 5d c i j printf n for i 0 i N i 输出矩阵d for j 0 j N j printf 5d d i j printf n 例5 13 有一家公司 生产一种型号的产品 上半年各月的产量如表所示 每种型号的产品的单价如右表所示 编一个程序计算上半年的总产值 includevoidmain intb 6 5 438 269 738 624 513 340 420 572 726 612 455 286 615 530 728 385 324 713 594 544 402 382 550 633 654 424 400 625 578 615 c 5 500 950 1340 2270 2985 d 6 0 sum 0 i j for i 0 i 6 i for j 0 j 5 j d i b i j c j printf d d i 输出第i 1月份的产值sum d i 把第i 1月份的产值累加到sum中 printf nsum d n sum 输出上半年总产值 例5 14 某社区对所属N户居民进行月用电量统计 每隔50度用电量为一个统计区间 但当大于等于500度时为一个统计区间 编一程序 分析统计每个用电区间的居民户数 include defineN100 定义符号常量N的值为100voidmain intc 11 0 i x printf 输入每个用户的用电量 用电量必须大于或等于零 n for i 1 i N i scanf d 例5 15 已知10个常数42 65 80 74 36 44 28 65 94 72 编一个程序 采用插入排序法对其进行排序 并输出结果 include definen10main voidInsertSort inta intm inta n 42 65 80 74 36 44 28 65 94 72 定义一个数组InsertSort a n 调用函数进行插入排序for inti 0 i n i 输出排序后的结果printf d a i printf n return0 voidInsertSort inta intm inti j x for i 1 i 0 j 寻找插入位置 if x a j a j 1 a j 后移一个位置elsebreak a j 1 x 将x插入到已找到的插入位置 例5 16 假定在一维数组a 10 中保存着10个整数42 55 73 28 48 66 30 65 94 72 编译程序从中顺序查找出具有给定值x的元素 若查找成功则返回该元素的下标位置 否则表明查找失败返回 1 include defineN10 假定把数组中保存的证书个数用常量N表示inta N 42 55 73 28 48 66 30 65 94 72 intSequentialSearch intx 顺序查找算法 for inti 0 i N i if x a i returni 查找成功返回元素a i 的下标值return 1 查找失败返回 1 voidmain intx1 48 x2 60 f f SequentialSearch x1 从数组a N 中查找值为x1的元素 if f 1 printf 查找 d失败 n x1 elseprintf 查找 d成功 下标为 d n x1 f 查找成功或失败分别显示出相应的信息f SequentialSearch x2 查找值为x2的元素 返回值赋给fif f 1 printf 查找 d失败 n x2 elseprintf 查找 d成功 下标为 d n x2 f 例5 17 假如一维数组a N 中的元素是一个从小到大顺序排列的有序表 编一程序从a中二分查找出其值等于给定值x的元素 include defineN10 定义符号常量N 其值等于10inta N 15 26 37 45 52 60 66 73 90 定义数组a N 并初始化intBinarySearch intx 二分查找算法 intlow 0 high N 1 定义并初始化区间下界和上界变量intmid 定义保存中点元素下标的变量while low high 当前查找区间进行一次二分查找过程mid low high 2 计算出重点元素的下标if x a mid returnmid 查找成功返回elseif x a mid high mid 1 修改得到左区间elselow mid 1 修改得到右区间return 1 查找失败返回 1 voidmain intb 3 37 48 70 假定待查元素值用数组b表示intf 用于保存调用二分函数查找函数的返回值for inti 0 i 3 i f intBinarySearch b i if f 1 printf 二分查找 d成功 其下标为 d n b i f elseprintf 二分查找 d失败 n b i 5 5字符串 数组是表示和存储数据的一种重要方法 是一种典型的数据组织形式 在实际中应用非常广泛 如计算 统计 排序 查找各种运算 例5 12 已知两个矩阵A和B如下 7 5 33 6 9A 2 8 6B 2 8 31 4 25 2 7编一程序计算出矩阵A B的和 差 include defineN3voidmain inta N N 7 5 3 2 8 6 1 4 2 intb N N 3 6 9 2 8 3 5 2 7 inti j c N N d N N 字符数组定义 字符数组的初始化逐个字符赋值用字符串常量字符数组的引用 例charc 10 ch 3 4 5 5字符串 例输出一个字符串 includemain charc 10 I a m a b o y inti for i 0 i 10 i printf c c i printf n 字符串字符串及其结束标志无字符串变量 用字符数组处理字符串字符串结束标志 0 字符串的输入输出逐个字符I O c整个字符串I O s 例用 cmain charstr 5 inti for i 0 i 5 i scanf c 例用 smain charstr 5 scanf s str printf s str 用字符数组名 不要加 输入串长度 数组维数遇空格或回车结束自动加 0 用字符数组名 遇 0 结束 例main chara 5 H e l l o printf s a 例main chara Hello printf s a 结果 Hello 结果 Hello 用 s 输出时 遇 0 结束 main chara h e l 0 l o 0 printf s a 例 输出 hel 数组中有多个 0 时 遇第一个结束 main inti chara 5 scanf s a for i 0 i 5 i printf d a i 运行情况 1 若输入hel 正常 2 若输入hell 正常 3 若输入hello 用 s输出时 会出现问题 输入字符串长度 数组维数 例字符串输入举例 includemain chara 15 b 5 c 5 scanf s s s a b c printf a s nb s nc s n a b c scanf s a printf a s n a 运行情况 输入 Howareyou 输出 a Howb arec you 输入 Howareyou 输出 a How scanf中 s输入时 遇空格或回车结束 运行情况 输入 Howareyou 例若准备将字符串 Thisisastring 记录下来 错误的输入语句为 A scanf 20s s B for k 0 k 17 k s k getchar C while c getchar n s k c 常用的字符串处理函数包含在头文件string h 字符串输出函数puts格式 puts 字符数组 功能 向显示器输出字符串 输出完 换行 说明 字符数组必须以 0 结束 字符串输入函数gets格式 gets 字符数组 功能 从键盘输入一以回车结束的字符串放入字符数组中 并自动加 0 说明 输入串长度应小于字符数组维数 例 includemain charstring 80 printf Inputastring gets string puts string 输入 Howareyou 输出 Howareyou 字符串连接函数strcat格式 strcat 字符数组1 字符数组2 功能 把字符数组2连到字符数组1后面返值 返回字符数组1的首地址说明 字符数组1必须足够大 连接前 两串均以 0 结束 连接后 串1的 0 取消 新串最后加 0 字符串拷贝函数strcpy格式 strcpy 字符数组1 字符串2 功能 将字符串2 拷贝到字符数组1中去返值 返回字符数组1的首地址说明 字符数组1必须足够大 拷贝时 0 一同拷贝 不能使用赋值语句为一个字符数组赋值 例charstr1 20 str2 20 str1 Hello str2 str1 例strcpy与strcat举例 include includevoidmain chardestination 25 charblank c C turbo Turbo strcpy destination turbo strcat destination blank strcat destination c printf s n destination TurboC 字符串比较函数strcmp格式 strcmp 字符串1 字符串2 功能 比较两个字符串比较规则 对两串从左向右逐个字符比较 ASCII码 直到遇到不同字符或 0 为止返值 返回int型整数 a 若字符串1字符串2 返回正整数c 若字符串1 字符串2 返回零说明 字符串比较不能用 必须用strcmp 字符串长度函数strlen格式 strlen 字符数组 功能 计算字符串长度返值 返回字符串实际长度 不包括 0 在内 例对于以下字符串 strlen s 的值为 1 chars 10 A 0 B C 0 D 2 chars t v 0will n 3 chars x69 082 n 答案 131 Howareyou Hello Len1 6 Len2 12 Len3 18 例5 18 从键盘上依次输入10个字符串到二维字符数组w中保存起来 输入的每个字符串的长度不得超过29 include defineN10main charw N 30 for inti 0 i 0 i printf s n w i return0 例5 19 将一个字符串复制到另一个字符串中 并求它们的长度 include include 必须包含这个头文件main chara 10 b 10 copy strcpy a b 将b指向字符串 copy 复制到a指向的字符串中printf s s a b 输出字符串a和b 它们应该相同printf d d n strlen a strlen b 输出这两个字符串的长度return0 例5 20 将两个字符串连接成一个字符串 输出连接以后的字符串及其长度 include include 必须包含这个头文件main chara 20 string 字符串长度为6charb catenation 字符串长度为10strcat a 连接一个空格到a串之后strcat a b 把b串连接到a穿之后printf s d n a strlen a return0 例5 21 设计一个字符串比较函数 用来比较两个字符串s1和s2的大小 若s1大于s2 则返回1 若s1等于s2 则返回0 否则返回 1 在主函数中调用该函数 验证其正确性 include include 必须包含这个头文件intcompare chars1 chars2 比较两个字符串的大小main chara 20 string 字符串长度为6charb catenation 字符串长度为10printf strcmp s 1234 d n a compare a 1234 printf strcmp s s d n a b compare a b printf strcmp 123 s d n a compare 123 a printf strcmp A a d n compare A a printf strcmp 英文 汉字 d n compare 英文 汉字 printf strcmp 英文 英文 d n compare 英文 英文 return0 intcompare chars1 chars2 比较两个字符串的大小 在这个程序段中使用的s1 i 和s2 i 分别为s1数组和s2数组中下标为i的元素 分别表示s1和s2所指字符串中的第i 1个字符 inti for i 0 s1 i 例5 22 编写一个程序 首先从键盘上输入一个字符串 接着输入一个字符 然后分别统计出字符串中的大于 等于 小于该字符的字符个数 include defineN30 假定输入的字符串的长度小于30voidmain chara N chl i 0 intc1 c2 c3 printf 输入一个字符串 scanf s a printf 输入一个字符 scanf c 例5 23 编一程序 首先输入10个字符串到一个二维字符数组中 接着输入一个待查询的字符串 然后从二维字符数组中查找并统计出该待查字符串的个数 此程序比较简单 编写如下 include include defineN5 定义常变量voidmain chara N 30 用于存储10个字符串 假定每个串的长度小于30chars 30 存储待查的字符串inti k 0 printf 输入 d个字符串 N for i 0 i N i scanf s a i printf 输入待查的字符串 scanf s s for i 0 i N i 查找字符串Sif strcmp a i s 0 k printf 字符串 s个数 d n s k 例5 24 编一程序 首先输入M个字符串到一个二维字符数组中 并假定每个字符串的长度均小于N M和N为事先定义的整型常量 接着对这M个字符串进行选择排序 最后输出排列结果 include include defineM5 定义符号常量M defineN30
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度离婚协议书中赡养费支付协议范本
- 二零二五年度出口货运代理多国贸易服务协议
- 二零二五版环保技术研发合作合同示范文本
- 二零二五年度文化主题店铺特许经营合同样本
- 二零二五年度水利工程测绘技术服务合同
- 2025版绿色施工技术培训施工队合作协议
- 2025版夫妻共同生活准则不离家协议
- 2025版生物科技企业场岗位保密协议实施细则
- 二零二五年度电商数据分析与报告专员劳动合同标准
- 二零二五年度家电产品进出口贸易合作协议书
- 园艺生物技术应用与发展
- 2025上海市八年级升九年级数学暑假提升讲义:相似三角形压轴题(六大题型)原卷版
- 2025年工业互联网工程技术人员考核试题题库及答案
- 供货组织方案范文
- 农行OCRM系统讲解
- 2025年《药品经营和使用质量监督管理办法》培训试题及答案
- 2024年云南省县乡教师选调考试《教育学》真题汇编带解析(原创题)
- 体育课培训课件
- 工贸安全员考试题库及答案大全
- 羊肚菌栽培及其管理课件
- 教师身体健康管理指南
评论
0/150
提交评论