资源预览内容
第1页 / 共81页
第2页 / 共81页
第3页 / 共81页
第4页 / 共81页
第5页 / 共81页
第6页 / 共81页
第7页 / 共81页
第8页 / 共81页
第9页 / 共81页
第10页 / 共81页
亲,该文档总共81页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第9章 数组类型,9.1 一维数组 9.2 二维数组 9.3 数组和函数 9.4 字符数组 9.5 指针数组,9.1 一维数组,一维数组的定义 一维数组的定义格式为: 存储类型 数据类型 数组名数组长度; 例如,语句“float a6,b10;” 说明: 数组的存储类型可以是auto或static,但不能为register。 数组的数据类型既可以是基本类型,也可以是构造类型等。 数组名应符合标识符的命名规则,数组名代表的不是整个数组,而是数组所占内存空间的起始地址。 数组长度表示数组元素的个数。数组长度只能是整型常量或整型常量表达式。 C编译系统为数组分配连续的内存单元。数组元素的相对次序由下标来表示。数组元素的下标是从0开始的整数。,9.1 一维数组,一维数组的引用 在C语言中不能引用整个数组,只能引用单个数组元素。 一个数组元素就是相当于一个变量,它的使用与同类型的普通变量是相同的。 一维数组元素的引用形式为: 数组名下标 数组名后方括号内是数组下标,下标表示该元素是数组的第几个元素。数组名后面的方括号内的内容只有在数组定义时才是数组的长度,其他时候都是数组下标。 数组元素的下标是整型的常量、变量或表达式。下标的取值范围是0,数组长度-1的整型值。 C程序运行时,编译系统并不检查数组元素的下标是否越界,需要编程人员自己保证数组元素的下标不要越界。,9.1 一维数组,一维数组的初始化 如果在数组定义之后进行初始化操作,则只能对每个数组元素一一赋值。 int arr10,i; for(i=0;i10;i+) arri=i; 如果在定义数组时完成数组的初始化操作,则需要将数组元素的初值依次放在一对花括弧中,并用赋值号与数组连接。定义数组时赋初值的形式为: 存储类型 数据类型 数组名数组长度=初值列表; 花括弧内各个初值之间用逗号分隔,数值类型必须与数组类型一致。系统将按初值的排列顺序,顺次给数组元素赋值。 例如,语句“int arr10=0,1,2,3,4,5,6,7,8,9;” 花括弧中初值的数量必须小于等于数组长度。当初值数量小于数组长度时,数值型数组的后面没有初值的元素由系统自动赋值为0。,9.1 一维数组,若给数组的所有元素赋初值,可以省略数组的长度。系统会根据所赋初值的个数确定数组的长度。 例如,int arr=1,2,3,4,5,6,7,8,9; 如果是auto存储类型的数组未赋初值,数组元素的值是不确定的。而static存储类型的数值型数组未赋初值,编译系统会在编译时将元素全部初始化为0。,9.1 一维数组,一维数组应用举例 【例9.1】求100个整数的平均值。 #include “stdio.h” main( ) int a100, i; float ave,sum; printf(“please enter 100 numbers:n“); for(i=0;i100;i+) /*输入元素*/ scanf(“%d“, ,9.1 一维数组,【例9.2】编写程序,找出10个整数中的最小值及其位置。 解题思路:首先输入10个整数,然后找出其中的最小值及其位置,最后输出结果。其中最主要的功能是求最小值及其位置,完成这一功能的主要步骤为: 假定最小值为第一个数,也就是位置min为0; 将min位置的数和数组的下一个数进行比较,如果min位置上的数大,则更改min值为更小数的位置; 如果比较完数组中所有的数,位置min上的数就是最小值,否则转向继续执行。 假设数组x的10个数依次为3、2、7、1、4、8、5、11、4、9 ,则寻找最小值及其位置的过程应该为:,9.1 一维数组,9.1 一维数组,#include “stdio.h“ main( ) int x10,i,min; printf(“please enter 10 numbers: “); for(i=0;i10;i+) /*输入10个元素*/ scanf(“%d“, /*输出最小值*/ 输入3、2、7、1、4、8、5、11、4、9的程序运行结果为: please enter 10 numbers: 3 2 7 1 4 8 5 11 4 9 minimum is x3=1,9.1 一维数组,【例9.3】采用选择法对数列进行排序。 解题思路:选择法排序(设对N个数进行排序)是每次从待排序数据中选择最小的数,与相应位置上的数交换。假设待排序的数列存放在一维数组a中,且找最小值位置的方法同例9.2,则选择法排序的过程为:第一次从N个元素(a0到aN)中找到最小值位置min,如果min不等于0,将amin与a0交换;第二次从剩下的N-1 个元素(a1到aN)中找到最小值位置min,如果min不等于1,将amin与a1交换,直至第N-1次从最后两个数(aN-2到aN-1)中找到最小值位置min,如果min不等于N-2,将amin与aN-2交换,9.1 一维数组,9.1 一维数组,假设数组a有10个数据,依次为3、2、7、1、4、8、5、12、45、9,则排序过程为: 第一趟排序(i=0)的过程中,找到的a0到a910个元素中的最小元素下标放在min中: 3 2 7 1 4 8 5 12 45 9 min=3 1 2 7 3 4 8 5 12 45 9 min!=0, 交换a0与a3 第二趟排序(i=1)过程中,找到的a1到a99个元素中的最小元素下标放在min中: 1 2 7 3 4 8 5 12 45 9 min=1,元素已在合适的位置,不需交换。 第三趟排序(i=2)过程中,找到的a2到a98个元素中的最小元素下标放在min中: 1 2 7 3 4 8 5 12 45 9 min=3 1 2 3 7 4 8 5 12 45 9 min!=2, 交换a2与a3 依此类推,在经过九趟排序后得到有序序列: 1 2 3 4 5 7 8 9 12 45,9.1 一维数组,#define N 10 #include “stdio.h“ main( ) int aN,i,j,min,temp; printf(“please enter %d numbers:“,N); for(i=0;iN;i+) /*输入数列*/ scanf(“%d“, ,9.1 一维数组,printf(“the sorted array is:n“); /*输出排序后的数列*/ for(i=0;iN;i+) printf(“%6d“,ai); 【例9.4】在递减的有序数列中,插入一个数x,使得数列仍然有序(如果有相同的数则不插入)。 和前面的例题一样,用数组存放数列。则本题相当于在一个有序的数组中寻找合适的位置插入一个元素。问题的解决可分为两个步骤: 寻找插入位置:由于是非递增序列,所以插入位置应该是在第一个小于x的数组元素的前面(假定找到的位置为k); 如果第k个元素等于x,则不须插入,否则执行插入操作: a. 第k个元素及其后面的元素都后移一位。 b. 插入元素在k位置。,9.1 一维数组,#define N 11 #include “stdio.h“ main( ) int arrN,x, j,k; printf(“nplease enter the array(%d): “,N-1); for(j=0;jN-1;j+ ) scanf(“%d“, /*k记录插入位置*/,9.1 一维数组,if(arrk=x /*输出数组*/ 某次程序运行结果为: please enter the array(10 ): 67 43 39 33 30 28 26 15 10 7 please enter the number: 27 the array is: 67 43 39 33 30 28 27 26 15 10 7,9.1 一维数组,一维数组和指针 数组元素的地址 数组元素的地址也可用元素前面加地址操作符的方式来获得: &数组名下标 数组名 C语言规定数组名代表数组的首地址,是一个地址常量。一维数组的数组名是基类型为数组元素类型的指针类型。 可以通过数组名来表示数组元素的地址,还可以指针方式引用数组元素。设a为一维数组的数组名,则: a+i表示数组第i个元素的地址(和 &ai)等价),a+0和a是等价的。 *(a+i) 表示数组的第i个元素。,9.1 一维数组,【例9.5】输入一个有10个数的数列,然后输出。注意数组的引用形式。 #include “stdio.h“ main( ) int a10,i; printf(“please enter the 10 number: “); for(i=0;i10;i+) /*输入数组元素*/ scanf(“%d“,a+i); for(i=0;i10;i+) /*输出数组元素*/ printf(“%3d“,*(a+i); 程序运行结果: please enter the 10 number:9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0,9.1 一维数组,指向数组元素的指针变量 一维数组定义之后,可以定义指针变量指向该数组的元素。 通过指针变量可以对数组元素进行操作。语句“int a10,*p=a;”之后, 数组元素ai可以有四种方式表示: ai pi *(a+i) *(p+i) 而数组元素ai的地址也相应有四种方式表示: &ai &pi a+i p+i 指针变量的值是可以变化的,所以既可引用指针变量的值,也可重新给它赋值。例如,若p的值是&a1,那么下面的操作均合法: p+、+p:表示指针变量p向后移动一个数组元素的存储单元,相当于p=&a2;p-、-p表示指针变量p向前移动一个数组元素的存储单元,相当于p=&a0。,9.1 一维数组,p+x、p-x (x表示某个整型的变量、常量或表达式)分别表示以指针变量p为基准向后、向前移动x个数组元素的存储单元,例如p+2表示则p-q的值为1。 指向同一个数组的数组元素的指针变量以及该数组的数组名之间可以进行比较,比较的是地址值大小。因此,pa 的值为真,p=a 的值为假,p!=a 的值为真。可利用指针间的关系做数组操作的循环条件。,9.1 一维数组,【例9.6】输入一个有10个数的数列,然后输出。 #include “stdio.h“ main( ) int a10,*p,*q; printf(“please enter the 10 number: “); for(p=a;pa+10;p+) /*输入数组元素 scanf(“%d“,p); */ for(p= *(p+)表示先取p所指向的数组元素的值作为表达式的值,再将指针变量p向后移动一个数组元素的存储单元; *(-p)表示先将指针变量p向前移动一个数组元素的存储单元,再取p所指向的数组元素的值作为表达式的值。,9.1 一维数组,【例9.7】输入一个有10个数的数列,然后按正序、逆序分别输出。 #include “stdio.h“ main( ) int a10,*p,*q; printf(“nplease enter the 10 number: “); for(p=a;p=a;) /*逆序输出数组元素*/ printf(“%3d“,*(p-); please enter the 1
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号