丁亚涛全套配套课件C语言程序设计第3版,第6章,数组

第6章数组 掌握一维数组 二维数组的定义 初始化和数组元素的引用掌握字符数组的定义 初始化和数组元素的引用掌握字符串的存储方法和应用掌握有关处理字符串的系统函数的使用方法 学习目标 数组 6 1数组的基本概念 问题 从键盘接收10个数 求平均数并输出所有小于平均数的数 分析 从键盘接收10个数 求平均数很简单 可以采用边接收边求和的方法 最后根据总和求平均数 下面的程序可以做到 inta i floats for i 0 s 0 i 10 i scanf d 输出小于平均数的数 6 1数组的基本概念 所谓数组 就是一组类型相同的变量 它用一个数组名标识 每个数组元素都是通过数组名和元素的相对位置 下标来引用的 数组可以是一维的 也可以是多维的 inta1 a2 a3 a10inta 10 a 0 a 1 a 3 a 9 其中下标从0开始 和前面不同的是 这些变量统一共享一个数组名a 6 2一维数组 一维数组用于存储一行或一列的数据 定义方式如下 简单类型或结构体 共用体等复杂类型 数组的标识 命名规则同变量名 用来定义数组的长度 因为数组也必须先定义再使用 例如 inta 10 chars 100 C语言不允许对数组的大小作动态定义 即定义行中的数组长度可以包括常量和符号常量 但不能包括变量 例如 下面的定义是错误的 intn 10 inta n 因为n为变量 而下面的定义是正确的 defineN10main inta N N为符号常量 定义数组的同时可以对数组初始化 以下初始化的方法都是允许的 inta 10 1 2 3 4 5 6 7 8 9 10 完全初始化inta 1 2 3 4 5 6 7 8 9 10 完全初始化 可省略长度inta 10 1 2 4 5 部分元素a 0 a 1 a 3 a 4 初始化 数组元素的下标从0开始 数组名不能像变量一样进行赋值操作 以下用法是错误的 inta 10 b 10 a b 错误 正确的定义 inta 10 定义整型数组a 它有10个元素 chars 20 定义字符型数组s 它有20个元素 floatf 5 g 10 定义实型数组f和g f数组有5个元素 g数组有10个元素 6 3案例 求10个数中的最大值 最小值 平均值 voidmain inta 10 i intmax min floats 0 aver printf 10numbers for i 0 imax max a i elseif a i min min a i s s a i aver s 10 printf maxis d n max printf minis d n min printf averageis 2f n aver for i 0 i 10 i if a i aver printf 4d a i printf n 6 4二维数组和多维数组 二维数组用于存放矩阵形式的数据 如二维表格等数据 定义二维数组的格式如下 例如 inta 3 4 3 4的矩阵 共12个元素 floatf 5 10 6 4二维数组和多维数组 inta 3 4 a 0 0 a 0 1 a 0 2 a 0 3 a 1 0 a 1 1 a 1 2 a 1 3 a 2 0 a 2 1 a 2 2 a 2 3 二维数组的初始化 完全初始化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 3 4 1 2 3 4 5 6 7 8 9 10 11 12 部分初始化inta 3 4 1 2 3 4 例6 2 演示二维数组的定义及元素引用 includemain inti j k 0 inta 3 4 for i 0 i 3 i 变量i控制数组a的行下标 for j 0 j 4 j 变量j控制数组a列下标 a i j k printf a d d d t i j a i j k printf n 6 5案例 输入学生成绩 计算每门课程的平均分 例6 3 输入3位学生的计算机 数学成绩 计算每门课程的平均分 includemain floatscore 3 2 average 3 temp charinfo 2 10 Computer English inti j for i 0 i 3 i printf No d n i 1 for j 0 j 2 j printf s info j scanf f for i 0 i 2 i temp 0 for j 0 j 3 j temp temp score j i average i temp 3 printf s 2f n info i average i 6 6字符数组与字符串 字符数组其实就是类型为字符型 char 的数组 每一个元素存放一个字符 主要用于存储和处理字符型数据 字符数组的定义和一般的数组一样 例如 chars 10 charstring 3 10 初始化的方法如下 chars 10 H e l l o C chars H e l l o C chars 10 H e l l o chars 11 HelloC chars 11 HelloC 6 7案例 逆序输出字符串 include includemain chars 100 inti 0 printf astring gets s while s i 0 i while i 0 putchar s i putchar n 6 8字符串函数 strlen 字符串 字符串长度函数求字符串s中第一个结束符 0 前的字符个数 例如 chars 100 HelloWorld 长度是12 chart 100 12345 06789 0 长度是5 实际上字符数组s和t实际存储长度都是100 6 8字符串函数 strcpy 字符串1 字符串2 字符串复制函数函数将字符串s2复制到字符串s1 例如 chars1 20 chars2 Goodluck strcpy s1 s2 puts s1 输出Goodluck strcpy函数可以将结束符一起复制过去 以上复制操作也可以直接写成 strcpy s1 Goodluck 6 8字符串函数 strcat 字符串1 字符串2 字符串连接函数函数将字符串s2连接到字符串s1后面 很显然 s1也必须有足够的空间来存储由原来的s1和s2构成的新s1字符串 例如 chars1 20 Goodluck chars2 toyou strcpy s1 s2 puts s1 输出Goodlucktoyou 连接后的s1的有效字符长度为17 包括结束符在内 s1至少需要18个字符长度 否则连接是错误的 6 8字符串函数 strcmp 字符串1 字符串2 字符串比较函数函数比较s1和s2字符串的大小 并返回比较的结果 若s1大于s2 则返回一个正整数 若s1等于s2 则返回0 若s1小于s2 则返回一个负整数 字符串比较规则 自左向右按ASCII码值大小进行比较 直至出现一对不同字符或者遇到结束符为止 例如 strcmp ABC abc 返回负整数 前面字符串小 strcmp ABC ABC 0abc 返回0 二者相等 strcmp ABC AB 返回正整数 前面的大 strcmp AB ABC 返回负整数 前面的小 6 8字符串函数 strlwr 字符串 字符串大写变小写将字符串s的所有大写字母转换成小写字母 strupr 字符串 字符串小写变大写将字符串s的所有小写字母转换成大写字母 除了上面的几个函数以外 经常使用的还有 strncpy 字符串1 字符串2 字符个数 strncmp 字符串1 字符串2 字符个数 strstr 字符串1 字符串2 strncat 字符串1 字符串2 字符个数 6 9案例 查找最大字符串 include includevoidmain chars 5 50 HelloWorld Goodlucktoyou Howareyou MoonRiver Ilovethisbook inti max 0 for i 1 i0 max i printf maxstringis s n s max 6 10案例 冒泡排序算法 例6 6 将10个数排序输出 冒泡法排序 分析 所谓冒泡法 就是指找到的大数或者小数像气泡一样浮出水面被发现 为了理解算法 来看下面的例子 6 10案例 冒泡排序算法 第1次查找 范围 72918第1步 7 2 将7和2交换位置 得到27918第2步 71 将9和1交换位置 得到27198第4步 9 8 将9和8交换位置 得到27189第1次查找 将9作为最大数放在最后 结果为27189 6 10案例 冒泡排序算法 第2次查找 范围 2718第1步 21 将7和1交换位置 得到 21789 第3步 7 8 不交换 第2次查找结果为 21789 6 10案例 冒泡排序算法 第3次查找 范围 217第1步 2 1 将2和1交换位置 得到 12789第2步 2 7 不交换 第3次查找结果为 12789 6 10案例 冒泡排序算法 第4次查找 范围 12第1步 1 2 不交换 第4次查找结果为 12789 6 10案例 冒泡排序算法 includemain defineN5inta N 7 2 9 1 8 inti j t for i 0 ia j 1 t a j a j a j 1 a j 1 t for i 0 i N i printf 5d a i 变量跟踪 6 11案例 字符串的连接 插入和删除 includevoidmain chars1 100 12345 chars2 50 6789 inti j i j 0 while s1 i 0 i while s2 j 0 s1 i s2 j i j s1 i 0 printf s n s1 例6 8 编写程序删除字符串中的指定字符 includemain chars 100 Ilovethisprogram charc inti j printf c c getchar for i j 0 s i 0 i if s i c s j s i j s j 0 printf s n s 例6 8 编写程序删除字符串中的指定字符 变量跟踪 6 12案例 转置矩阵 例6 9 已知一个3 3的二维数组 编程将行列元素互换 生成它的转置矩阵 includemain intt a 3 3 9 8 7 6 5 4 3 2 1 inti j for i 0 i 3 i for j 0 j i j t a i j a i j a j i a j i t for i 0 i 3 i for j 0 j 3 j printf 5d t a i j printf n 6 13案例 杨辉三角形 分析 杨辉三角形是由 x y n展开后的多项式系数排列而成 例如 x y 1展开后 x y x y 2展开后 x2 2xy y2 x y 3展开后 x3 3x2y 3xy2 y3 x y 4展开后 x4 4x3y 6x2y2 4xy3 y4 6 13案例 杨辉三角形 include defineN10voidmain inti j a N N for i 0 i N i a i i 1 a i 0 1 for i 2 i N i for j 1 j i 1 j a i j a i 1 j 1 a i 1 j for i 0 i N i for j 0 j i j printf 5d a i j printf n 6 14案例 日历的打印 例6 12 输入2012年的某个月份 打印该月份的日历 6 14案例 日历的打印 includevoidmain inti intdaysmonth 12 31 29 31 30 31 30 31 31 30 31 30 31 intfirst