第6章 数组.ppt
《第6章 数组.ppt》由会员分享,可在线阅读,更多相关《第6章 数组.ppt(88页珍藏版)》请在三一文库上搜索。
1、第6章 数组,问题的提出:用100个变量存储1100的数,方法? int a1,a2,a3a100; a1=1; a2=2; a3=3; a100=100;,a1=1; a2=2; a3=3; a100=100;,提出问题,要求输入100个学生的成绩,根据他们的平均分来划分等级 大于等于平均分10分的为A级 小于平均分10分的为C级 其他的为B级,main() int s1, s2, , s100, ave; char grade; scanf(“%f“, ,这里用100个变量si处理类似的数据,进行类似的操作 可以尝试用一种结构来组织这些类似的变量 数 组,数组是一种构造数据类型 数组:有序
2、数据的集合,用数组名标识 元素:是构造数组的基本组成成份, 它们应属同一数据类型,用数组名和下标确定,主要内容,一维数组,主要内容 一维数组的定义 一维数组元素的引用 一维数组的初始化 一维数组举例,一维数组的定义,一维数组的定义方式: 数组类型说明符 数组名常量表达式;,合法标识符, :下标运算符 不能用( ) 单目运算符 优先级(1) 左结合,表示元素个数 只能是整型常量 也表示数组长度,数组元素的类型,例 int a6;,数组名表示该数组所占的内存单元的首地址,是地址常量,编译时分配内存,并且是连续的 内存字节数= 数组元素个数*sizeof(元素数据类型),数组a共有6个元素,数组元素
3、从a0开始,到a5结束,注意:不能使用a6,一维数组的定义,例 int i=15; int ai;,不能使用变量定义数组元素 只能使用整型常量,#define SIZE 10 main() int aSIZE, b10; ,P,符号常量,一维数组元素的引用,例 int a10; /*对a0 a9赋值*/ printf (“%d“, a);,for (i=0; i=9; i+) printf(“%d“, ai);,数组元素引用格式: 数组名 下标表达式 其中:下标表达式可以是整型常量或整型表达式,一维数组元素的引用 数组必须先定义后使用 只能逐个引用数组元素,而不能一次引用整个数组,例 int
4、a10; a0 = 1; a1 = 1; for (i=2; i=9; i+) ai = ai-1+ai-2;,一维数组元素的引用,分析该程序的运行结果,main() int i, a6; for(i=0; i6; i+) ai=i; for(i=0; i=5; i+) printf(“%d“, ai); ,0 1 2 3 4 5,一维数组元素的引用,例 int a6; a6=10;,数组a元素的范围是:a0 a5 a6是非法的,数组名a是一个地址常量,表示该数组的首地址, 也就是第一个数组元素a0的地址 数组元素ai表示数组的第i+1个分量, i表示数组元素相对于数组起始地址的偏移量 引用数
5、组元素时,根据首地址和下标数,计算出该元素的 实际地址,取出该地址的内容进行操作。,main() int a2; a0=1; a1=2; printf(“%dn“, a0); printf(“%dn“, a1); printf(“%d“, a); ,1 2 - 46,main() int a2; scanf(“%d“, ,5 ,5 10,scanf(“%d“, a);,一维数组的初始化,如 int a5=1, 2, 3, 4, 5;,一维数组的初始化 可以在定义数组的时候,给它赋初值,说明 将数组元素的初值依次放在一个大括号内 等价于: int a5; for (i=0; i5; i+) ai
6、=i+1;,一维数组的初始化,如 int a5=1, 2, 3;,一维数组的初始化 可以只给部分数组元素赋初值,说明 定义数组a有5个元素,大括号只提供3个初值, 则将前三个元素依次赋值,后面元素值为0 等价于:int a5; a0=1; a1=2; a2=3; a3=a4=0;,一维数组的初始化,如 int a5=1, 2, 3, 4, 5; 可以写成 int a=1, 2, 3, 4, 5;,一维数组的初始化 当给全部数组元素赋初值时,可以不指定数组长度,说明 大括号中有5个元素,在没有指定数组a的长度时, 自动定义数组a有5个元素,并分别赋初值,一维数组的初始化,如 int a3; pr
7、intf(“%d,%d,%d“,a0, a1, a2);,一维数组的初始化 若没有给数组元素赋初值,则此时数组元素的值为随机数,若所赋初值数多于定义的数组长度时,系统报错,0, 64, 3117,如 int a3=1, 2, 3, 4, 5;,Error : Too many initializers in function main,一维数组举例,读入10个整数,找出其中最大值、最小值、平均值: 用for循环读入10个整数到数组a中 令最大值max和最小值min以及总和sum为a0 用for循环,实现当i从19时: 若ai大于max,max=ai 若ai小于min,min=ai sum=su
8、m+ai 最终输出最大值max、最小值min和平均值sum/10,N-S流程图,max=min=sum=a0,ave=(float) sum/10,输出max、min、sum/10,#include # define N 10 void main() int aN, i, max, min, sum; float ave; printf(“Enter %d integers:n“, N); for(i=0; imax) max=ai; if (aimin) min=ai; sum = sum + ai; ave = (float) sum / N; printf(“max=%d, min=%d
9、, ave=%f“, max, min, ave); ,Enter 10 integers:,max=10, min=1, ave=5.500000,1 2 3 4 5 6 7 8 9 10 ,一维数组举例,用数组求Fibonacci 数列的前40个数: F1 = 1 (n=1) F2 = 1 (n=2) Fn = Fn-1+Fn-2 (n3),#include void main() int i; long int f40=1,1; for(i=2; i40; i+) fi=fi-2+fi-1; for(i=0; i40; i+) if(i%4=0) printf(“n“); printf(
10、“%12ld“,fi); ,2,3,5,8,#include void main() long f1=1, f2=1; int i; for(i=1; i=20; i+) printf(“%12ld %12ld“,f1,f2); if(i%2=0) printf(“n“); f1=f1+f2; f2=f2+f1; ,可以取出数组中的任意 一个元素fi再次使用,所有计算过的中间值都无法 再次使用,剩下的只有最后 两个数列的值f1和f2,一维数组举例,输入一个字符类型数组(20个元素) 并根据用户要查找的字符,来确定该字符的位置 读入20个字符在数组c中 读入要查询的字符ch 从c0到c19循环查
11、询是否有字符ch: 若ci=ch,则输出i,结束循环 否则继续循环检查 若已经检查到c19且c19!=ch,则输出“未找到”,#include void main() char c20, ch; int i; printf(“Please input the 20 charactors:n“); for(i=0; i20; i+) scanf(“%c“, ,Please input the 20 charactors:,Please input the charactor what you want to search:,abcdefghijklmn12345,h,h at 8,Please
12、input the 20 charactors:,Please input the charactor what you want to search:,abcdefghijklmn12345,p,No found!,一维数组举例,用冒泡法对n个数进行排序: 思路:相邻的两个数比较,将大的调到后头 过程: 比较第一个数和第二个数,把较大的数放后面; 然后比较第二个数与第三个数,仍把较大的数放后面; 依次类推,直至第n-1个数和第n个数比较完为止 结果最大的数被安置在最后的位置上, 这就是第一趟冒泡排序。 对前n-1个数进行第二趟冒泡排序 结果使次大的数被安置在第n-1个元素位置上 重复上述过程
13、,共经过n-1趟冒泡排序后,排序结束,第1趟,第2趟,第3趟,第4趟,第5趟,第6趟,第7趟,7次 6次 5次 4次 3次 2次 1次,结 果,一维数组举例,考虑比较了几趟,第m趟比较,比较几次?,n个数比较大小共进行了 趟比较,n-1,用变量i来表示趟,则1=i=n-1,在第i趟比较中,共比较了 次,n-i,用变量j来表示第i趟比较的次数,则1=j=n-i,每次比较的是aj-1和aj,一维数组举例,用冒泡法对n个数进行排序: n个数比较大小共进行了n-1趟比较 用变量i来表示趟,则1=i=n-1 在第i趟比较中,共比较了n-i次 用变量j来表示第i趟比较的次数,则1=j=n-i 每次比较的是
14、aj-1和aj,输入N 个数给a0 到 aN-1,for i=1 to i=N-1,for j=1 to j=N-i,输出a0 到 aN-1,#include #define N 10 void main() int aN, i, j, t; printf(“Input %d numbers:n“, N); for(i=0; iaj) t=aj-1; aj-1=aj; aj=t; for(i=0;iN;i+) printf(“%d “,ai); ,一维数组举例,用选择法对n个数进行排序: 例7.7 思路:先挑选出最小的数,放在第一个位置,再逐步挑出较小的数 过程: 先在n个数中进行比较选择,
15、将最小的数与第一个数组元素交换 在后面n-1个数中进行第二次挑选 将其中最小的数与第二个数组元素交换 重复上述过程,共经过n-1趟选择排序后,排序结束,第1趟,7次 6次 5次 4次 3次 2次 1次,结 果,一维数组举例,第2趟,第3趟,第4趟,第5趟,第6趟,第7趟,一维数组举例,用选择法对n个数进行排序: n个数比较大小共进行了n-1趟比较 用变量i来表示趟,则1=i=n-1 在第i趟比较中,共比较了n-i次 用变量j来表示第i趟比较的次数,则i=j=n-1 把最小的数与第i-1个数互换,#include #define N 10 main() int aN, i, j, t, k; p
16、rintf(“Input %d numbers:n“, N); for(i=0; iaj) k=j; t=ak; ak=ai-1; ai-1=t; for(i=0;iN;i+) printf(“%d “,ai); ,一维数组举例,选择法与冒泡法的区别: 选择法排序在每一轮排序时找最小(递增次序)数的下标,出了内循环(一轮排序结束),再交换最小数的位置; 冒泡法排序在每一轮排序时只要将当前第一个与其他几个比较,只要次序不对,就交换,出了内循环,最大数已冒出。,查找一个数,确定要找的数 循环比较,找到后返回下标(位置),一维数组举例,数组元素的插入与删除 在有序数组a1-an插入一个值Key元素
17、算法: 查找要插入的位置k(1=k=n-1) 腾出位置,把最后一个元素开始到第k个元素的位置腾出,就可将数据Key插入 (2) 删除 要找到欲删除的元素的位置k;然后从k+1到n个位置开始向前移动;最后将数组元素减1。,18,3,5,9,11,15,13,18,3,5,9,11,15,3,5,9,11,13,一维数组举例插入一个数,例:将一个数组中的值按逆序重新排放,分析: 循环次数?即交换多少次? ?(奇偶数时?),一维数组举例,例:读入10个整数存入数组,将数组中的元素逆序重新存放,将数组元素按颠倒的顺序重新排列的工作就是数组元素的交换。让 a0 与a9交换,a1与a8交换,依此类推,最后
18、a4与a5交换。特别要注意控制好循环,循环次数只能是数组大小的一半。,#include void main() int i,j,a10,t; printf(“请输入10个整数:n”); for(i=0;i=9;i+) scanf(“%d”, ,本章要点,C语言规定,在运行程序过程中,系统并不自动检验数组元素的下标是否越界。即对数组的引用可以越界。 就是说,下标可以不在0到(常量表达式-1)的范围内。例如,定义数组 int a4;合法的使用数组元素 是a0、a1、a2、a3;此时也可以引用a4、a5等,但由于下标越界,超出了数组元素的范围,这两个值会是什么,难以预料。所以,在编写程序时,保证数组
19、下标不越界是十分重要的。,本章要点,一维数组 求一维数组元素的最大数、最小数、平均数 Fibonacci数列(用数组实现) 数组排序冒泡法(选择法了解即可) 查找元素、确定位置 将数组元素逆序放置(与原位置相反),查找一个数在数组中第一次出现的位置, int a10=1,3,2,4,5,3,6,9,4,3; 输入一个查找的数: 3 输出它在数组中第一次出现的位置: 2 输入一个查找的数: 7 输出:7不在这个数组中 要求:用至少两种循环,区别体会各种循环的特点,例:在一个数组中查找给定值第一次出现的位置。,算法步骤: 将n个数据放入数组中,读入一个要查找的值; 让i从0到n-1做循环,每次看a
20、i是否等于给定的值,如果ai与给定的值相等则停止查找,同时退出循环,否则继续查看下一个数组元素的值如何; (3)输出结果。,一维数组举例,#include void main() int a10,i,num; printf(“请输入10个整数:n“); for(i=0; i10; i+) scanf(“%d”,i+) if(ai=num) break; if (i=9) printf(“被查找的数是第%d个数n”,i); else printf(“没有找到%dn”,num); ,问题,在数学中,我们常常用到矩阵Amn,应该用怎样的数据结构来表示矩阵呢?,二维数组,主要内容 二维数组的定义 二维
21、数组的理解 二维数组元素的引用 二维数组的初始化 一维数组举例,二维数组的定义,二维数组的定义方式: 数组类型说明符 数组名常量表达式1 常量表达式2;,行数,下标从0开始,列数,下标从0开始,元素个数=行数列数,例 int a105; float b53; int a10,5; float b5,3;,数组元素的存放顺序: 内存是一维的 二维数组的存放:按行序优先,再按列序存放,a21,a20,a11,a10,a01,a00,多维数组的存放:最右边的下标变化最快,int c234,c123,c122,c121,c120,c113,c112,c111,c110,c103,c102,c101,c
22、100,c023,c022,c021,c020,c013,c012,c011,c010,c003,c002,c001,c000,特殊的一维数组:它的元素又是一个一维数组,例 int a34;,每个元素ai是由包含 4个元素的一维数组组成,把二维数组a理解成 由3个元素组成的一维数组,a2,a1,a0,二维数组的理解,二维数组元素的引用,例 int a56, i, j; for (i=0; i5; i+) for(j=0; j6; j+) scanf(“%d“, ,二维数组元素的引用格式: 数组名 下标表达式1 下标表达式2 其中:下标表达式可以是整型常量或整型表达式,例 int a56; sc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 数组
链接地址:https://www.31doc.com/p-4333581.html