第7章数组教学文稿

上传人:yuzo****123 文档编号:139357349 上传时间:2020-07-21 格式:PPT 页数:53 大小:344.50KB
返回 下载 相关 举报
第7章数组教学文稿_第1页
第1页 / 共53页
第7章数组教学文稿_第2页
第2页 / 共53页
第7章数组教学文稿_第3页
第3页 / 共53页
第7章数组教学文稿_第4页
第4页 / 共53页
第7章数组教学文稿_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《第7章数组教学文稿》由会员分享,可在线阅读,更多相关《第7章数组教学文稿(53页珍藏版)》请在金锄头文库上搜索。

1、第7章数组,本书前面已经讨论了C语言中基本数据类型,但是这些数据类型还远远满足不了解决实际问题的需要。为了解决较复杂的问题,C语言提供了构造类型的数据,它们是:数组类型、结构类型、共用类型。构造类型数据是由基本类型数据按一定规则组成的。 本章介绍数组。数组是数目固定、类型相同的若干个变量的有序集合,这些变量在内存中占用连续的存储单元,在程序中具有相同的名字,但具有不同的下标,因此称这些变量为“下标变量”或数组元素。,数组是一种很有用的数据结构,许多问题,不用数组几乎难以解决。例如:对一个班的学生成绩进行处理,计算个人平均分、学科平均分、名次排序等就算法而言是十分简单的,但不用数组将全班的学生成

2、绩保存起来,解决起来将是十分烦琐的。如:一个班50名学生,若不用数组就需要有50不同个变量,这种程序无法让人接受。如果用数组元素a0、a1、a2a49只需用for循环就能很容易的完成。 当程序中需要使用数组时,必须先定义,后使用数组。数组中的每个成员成为数组元素,数组元素如同其他基本变量一样可以被赋值和在表达式中使用。,7.1 一维数组的定义和引用,7.1.1定义方式: 数据类型 数组名1 常量表达式, 数组名2 常量表达式2; 1“数据类型”是指数组元素的数据类型。 2数组名,与变量名一样,必须遵循标识符命名规则。 3“常量表达式”必须用方括号括起来,指的是数组的元素个数(又称数组长度),它

3、是一个整型值,其中可以包含常数和符号常量,但不能包含变量。 例如:int a10 ;10表示a数组有10个元素,它们为: a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,不能对数组的大小作动态定义。,例如:下面的定义是错误的。 int n; scanf(“%d”,表示定义了两个数组,一个a数组10元素,每个元素都是整型的。一个b数组5元素,每个元素都是整型的。数组定义后内存就留好相应个数的存储空间。,例题7.1 建立一个a数组10个元素,a0到a9的值为,然后按逆序输出。 /*例题源代码文件名:LT7_1.C*/ main( ) int i,a10; for(i=0;i=0;i-)

4、 printf(“%d” ,ai); ,运行结果: 9 8 7 6 5 4 3 2 1 0,7.1.3 一维数组元素的初始化,初始化格式: 数据类型 数组名常量表达式初值表 如:int a6=0,1,2,3,4,5; 1定义数组时,对元素初始化 例如:int a5=1,2,3,4,5; 经过上面定义和初始后: a0=1, a1=2, a2=3, a3=4, a4=5 2“初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值,后几个元素值为0。 例如:int a6=1,2,3; a0=1, a1=2, a2=3, a3=0, a4=0,a5=0,3如果想使一个数组中全部元素值为0,可

5、以写成: int a5=0,0,0,0,0; 不能写成: int a5=0*5; 4如果对数组的全部元素赋以初值,定义时可以不指定数组长度(系统根据初值个数自动确定)。 例如:int a =1,2,3,4,5; 等价于int a5=1,2,3,4,5; 如果被定义数组的长度,与初值个数不同,则数组长度不能省略。 例如:int a10=1,2,3,4,5; 只初始化前5个元素,后5个元素为0。,5根据存储类型的不同,数组有静态数组(static)和动态数组(auto)之分;根据定义的位置不同,数组有内部数组(在函数内部定义的数组)和外部数组(在函数外部定义的数组)之分。(这将在后面章节会介绍)

6、(1) 对于静态数组和外部数组,如果定义而未初始化,则系统自动赋以0值(整型和实型)或0(字符型)。 例如:static int a6; 编译后:a05的值均为0 (2) 对于内部动态数组,如果定义而未初始化,各元素的初值是不确定的。 例如: auto int a6; (其中“autu”可以缺省) 则a0a5的值是不确定的。,7.1.4 一维数组应用举例,例题7.2已知有10个整数,求它们当中的最大值。 /*例题源代码文件名:LT7_2.C*/ main() int a10=2,5,8,12,14,9,23,30,4,18,j,max; max=a0; /* 将数组的第一个元素给变量max *

7、/ for(j=1;jmax) max=aj; printf(“max=%dn”,max); ,运行结果:max=30,例题7.3 从键盘上输入10个整数,求其中正数之和、负数的个数。 main() int b10,sum=0,n=0,j; printf(“input 10 numbers:”); for(j=0;j0) sum=sum+bj; else if(bj0) n=n+1; printf(“sum=%d,n=%dn”,sum,n); ,运行: input 10 numbers:2 4 5 12 8 0 6 10 2 3 sum=41,n=3,例题7.4 求数Fibonacci列的前4

8、0个数.该数列第1项、第2项为1、1,从第3项开始。每个数等于前2个数之和。 main( ) int n,f20=1,1; /*定义20个元素的数组,初始化f0=f1=1 */ for(n=2;n20;n+) fn=fn-2+fn-1; for(n=0;n20;n+) if(n%5=0) printf(“n”); /*每行输出5个数据*/ printf(“%10d”,fn); ,运行结果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,例题7.5 编程将一个数组的值按逆序重新存放。 main() int

9、 a10,j,t; printf(“input 10 numbers:n”); for(j=0;j10;j+) scanf(“%d”, ,运行情况: input 10 numbers: 1 2 3 4 5 6 7 8 9 10 10 9 8 7 6 5 4 3 2 1,例题7.6 用冒泡法对6个整数按从小到大排序。 冒泡法的思路:从前到后将相邻两个数比较,将小的调到前头。见图7-1,若有6个整数,第一次将第1个数和第2个数(9和8比较)对调,第二次将第2个数和第3个数(9和5比较)对调如此共进行5次,得到854209的顺序,可以看到:最大数9已“沉底”,成为最下面一个数,而小数“上升”。最小数

10、0已向上“浮起”一个位置。经第一趟(共5次比较与交换)后,已得到最大数。然后进行第二趟比较,对余下的前面5个数按上面方法进行比较见图7-2。经过4次比较与交换,得到次大的数8。如此进行下去,可以推知,对6个数要比较5趟,才能使6个数按从小到大顺序排列。在第一趟中要进行每相邻两个数之间的比较,共5次,在第二趟中比较4次第5趟比较1次。,例题7.6 main() int a6,i,j,t; printf(“input 6 numbers:n”); for(i=0;iaj+1) /*if条件控制从小到大排序*/ t=aj; aj=aj+1; /*若前面数大于后面的数,就交换两个数*/ aj+1=t;

11、 ,printf(“the sorted numbers:n:”); for(i=0;i6;i+) /*输出排好序的6个数据*/ printf(“%dt”,ai); printf(“n”); ,运行结果: input 6 numbers: 9 8 5 4 2 0 the sorted numbers: 0 2 4 5 8 9,7.2二维数组的定义和引用,7.2.1二维数组的定义方式 二维数组的定义方式如下: 数据类型 数组名行常量表达式列常量表达式 例如:int a23; 定义为2行3列数组,如图:7-3,1数组元素在内存中的排列顺序为“按行存放”,即先顺序存放第一行的元素,再存放第二行,以此

12、类推。 如图7-4,2设有一个m*n的数组x,则第i行第j列的元素xij在数组中的位置为:i*n+j (注意:行号、列号均从0开始计数)。 例如: a11 位置为: 1*3+1=4 (注意:位置号从0开始) 3可以把2维数组看作是一种特殊的1维数组:它的元素又是一个1维数组。 例如,int x34; 对x34可以把x看作是一个1维数组,它有3个元素:x0、x1、x2,每个元素又是一个包含4个元素的1维数组,如图7-5所示。即把x0、x1、x2看作是3个1维数组的名字。 上面定义的x34二维数组可以理解为定义了3个一维数组。,此处把x0 x1x2看作一维数组名,这种处理方法,在数组初始化和用指针

13、表示时显得方便,这在以后会体会到。,7.2.2 二维数组元素的引用,引用2维数组元素的形式为: 数组名行下标列下标 1“行下标”和“列下标”,都应是整型表达式或符号常量。 如:x21 x2*j+11 (j是已有值的变量) 2“行下标”和“列下标”的值,都应在已定义数组大小的范围内。假设有数组x34,则可用的行下标范围为02,列下标范围为03。 如:x23正确 x34元素超出范围,3对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的2维数组元素。 如:x21=x20+1; 如:int i,j,x23; for(i=0;i2;i+) for(j=0;j3;j+) xij=2; ,7.2.

14、3 二维数组的初始化,数据类型 数组名行下标列下标常量列表, ; 1分行给二维数组赋初值 int b34=1,2,3,4,5 ,6,7,8,9,10,11,12; 2所有数据都写在一个括号内,按二维数组在内存中的排列顺序给各元素赋初值。 int b34=1,2,3,4,5,6,7,8,9,10,11,12; 3可以对部分元素赋初值,其余元素值均为0。 如: int a44=1,5,9,7;,如:int a34=1,0,6,0,0,9;,4如果对全部元素都赋初值,则“行数”可以省略。 注意:只能省略“行数”,列数不能省略。 如:int b 4= 1,2,3,4,5,6,7,8,9,10,11,1

15、2; 等价于: int b34=1,2,3,4,5,6,7,8,9,10,11,12; 定义时也可以只对部分元素赋初值,要省略行数,必须分行赋初值。 如:int b 4=0,0,3, 1,0,10; 这样的写法能通知编译系统,数组共有3行。,7.2.4 二维数组的应用举例,例题7.7 求一个33矩阵的主对角线之和。 /*例题源代码文件名:LT7_7.C*/ main( ) int x, y, sum=0, a33=1,2,3,4,5,6,7,8,9; for(x=0;x3;x+) for(y=0;y3;y+) if(x= =y) /*主对角线元素的行下标=列下标*/ sum=sum+axy;

16、printf(“sum=%d”,sum); ,运行结果: sum=15,例题7.8 /有一个34的矩阵,求出其中最大值,以及它所在的行和列。 main( ) int x, y, r=0, c=0, max; int a34=1,5,3,4,9,8,7,6,-8,20,-1,2; max=a00; /* 先将第一个数据给max*/ for(x=0;xmax) /* 每一元素与max 比较,大于max的数存入max中*/ max=axy; r=x; /*记住当时较大数的行号*/ c=y; /*记住当时较大数的列号*/ printf(“max=%d,r=%d,c=%dn”,max,r,c); ,运行结果: max=20,r=2,c=1,7.3 字符数组与字符串,字符数组就是类型为char的数组,字符数组中的一个元素存放一个字符,同其他类型的数组一样,字符数组既可以是一维的,也可以是多维的。 7.3.1 字符数组的定义 char 数组名常

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号