资源描述
第七章数组,2、一维数组的定义和引用,3、二维数组的定义和引用,4、字符数组,1、概述,1. 基本类型之外,C语言还提供了构造类型的数据,它们有:数组类型、结构体类型、共用体类型。构造类型数据是由基本类型数据按一定规则组成的,因此也可以称之为“导出类型”。,2. 数组是有序数据的集合。 (a)数组中的每一个元素都属于同一个数据类型。(b)用一个统一的数组名和下标,唯一的确定数组中的元素。,章节总览,一维数组的定义(1),一、定义方式: 类型说明符 数组名 常量表达式 ;,二、说明: (1)数组名定名规则和变量名相同,遵循标识符定名规则。,例如: int a 10 ; 表示数组名为a ,此数组有10个元素,每个元素为整型数据.,(2)数组名后是用方括弧括起来的常量表达式,不能用圆括弧。,下面的用法是错误的:int a(10);,(3)常量表达式表示元素的个数,即数组长度。,例如: 在a10中,10表示a数组中有10个元素, 下标从0开始,这10个元素是:a0, a1, a2, a3, a4, a5, a6, a7, a8, a9,注意:不能使用数组元素a10;,(4)常量表达式可以包括常量和符号常量,不能包含变量。C不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。,例如:下面这样定义数组是不行的: int n; scanf(“%d”,一维数组的定义(2),更准确的说法是 整型常量表达式,例 int i=15; int datai; (不能用变量定义数组维数),合法标识符,表示元素个数 下标从0开始,编译时分配连续内存 内存字节数=数组维数* sizeof(元素数据类型),数组名表示内存首地址, 是地址常量,int a10;,数组在内存的存放形式,一、规则: (1)数组必须先定义,后使用。,一维数组元素的引用(1),(2)数组元素的使用形式为: 数组名 下标 ,下标可以是整型常量或整型表达式, 例如: a0=a5+a7-a2*3;,注意: C语言规定只能逐个引用数组元素, 不能一次引用整个数组.,例7.1数组元素的引用,一维数组元素的引用举例,main() int i ,a10; for( i =0; i=9; i +) a i = i ; for(i=0;i=9;i+) printf(“%d,”,ai) ; ,程序使a0到a9的值为09, 然后按顺序输出,如果按逆序输出,运行结果: 0, 1, 2, 3, 4, 5, 6,7,8,9,for(i=9;i=0;i-) printf(“%d”,ai);,运行结果: 9,8,7,6,5,4,3,2,1,0,1、在定义数组时对数组元素赋以初值。,一维数组的初始化(1),例如:int a10= 0,1,2,3,4,5,6,7,8,9 ;,初始化之后:a0=0,a1=1,a8=8,a9=9。,2、可以只给一部分元素赋值.,例如:int a10=0,1,2,3,4; 只给前五个元素赋值,后五个元素为0。 初始化之后:a0=0,a1=1,a2=2,a3=3,a4=4, a5=0,,a8=0,a9=0。,3、如果想使一个数组中全部元素值为0,,可以写成 int a10=0,0,0,0,0,0,0,0,0,0;,不能写成 int a10=0*10;,4、对全部数组元素赋初值时,可以不指定数组长度。,一维数组的初始化(2),例如:int a=1,2,3,4,5;,上面的写法中, 中只有五个数,系统会据此自动定义数组的长度为5。 初始化之后:a0=1,a1=2,a2=3,a4=4,a5=5。,如果被定义的数组长度与提供初值的个数不同,则数组长度不能省略。,例如:想定义数组长度为10,就不能省略数组长度的定义。,而必须写成 int a10= 1,2,3,4,5; 只初始化前面5个元素,后5个元素为0。,不能写成 int a =1,2,3,4,5;,注意:对部分元素赋初值时,长度不能省。,一维数组的程序举例(1),例 7.2用数组来处理Fibonacci数列问题。(见教材124页),程序如下:,/*行号1*/main( ) /*行号2*/int i; /*行号3*/int f20=1,1; /*行号4*/for(i=2,i=20;i+) /*行号5*/f i =f i -1+f i -2; /*行号6*/for(i=0,i20;i+) /*行号7*/ /*行号8*/if( i %5= =0) printf(“n”);/*控制换行,每行输出五个数*/ /*行号9*/printf(“%12d”,f i ); /*行号10*/ /*行号11*/,运行结果: 11235 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,main( ) int a10 ,i , j , max ; printf( “ input 10 numbers: n ” ) ; for( i = 0 ; i 10 ; i + + ) scanf( “ %d ” , ,例(2) 输入10个数并从中找出最大者.,一维数组的程序举例(3.1),例 7.3用起泡法对n个数排序(由小到大)。(见教材124页),起泡法的思路是:将相邻两个数比较,将小的调到前头。,具体参见课本: 例如:对一个这样的序列排序:9,8,5,4,2,0(一共有6个数),(1)985420 /*98,交换*/,(2)895420 /*95,交换*/,(3)859420 /*94,交换*/,(4)854920 /*92,交换*/,(5)854290 /*90,交换*/,第一轮结束854209,那么第一轮进行了 n-1=6-1=5 次比较即循环了5次,一维数组的程序举例(3.2),第二轮交换:,(1)854209 /*85,交换*/,(2)584209 /*84,交换*/,(3)548209 /*82交换*/,(4)542809 /*80,交换*/,第二轮结束542089,那么第二轮进行了 n-2=6-2=4 次比较即循环了4次,总结:第 i 轮进行了n- i 比较即循环了n- i 次.,一共要n-1轮比较即外围循环n-1次,一维数组的程序举例(3.3),算法的N-S结构流程图如下:,a ia i+1,for i =0 to n-j-1,for j=1 to n-1,输入n个数给a0到an-1,真,假,t=ai; a i=ai+1; ai+1=t;,输出a0到an,源程序如下: main()int a10, i,j,t;,for(i=0;i10;i+) scanf(“%d”,for(j=0;jai+1) t=ai; ai=ai+1; ai+1=t;,for(i=0;i10;i+) printf(“%d”,ai); ,求2-100以内的素数 题目分析:首先定义一个int型数组b100,将b当作一个筛子,并规定当bi的值为非0时,表示整数i在筛中。2为素数,将2输出,然后将筛中2的倍数筛去,即将下标为2的倍数的元素清零。此时,筛中下一个非零元素为b3,说明3为素数将其输出,然后再将下标为3的倍数的元素清零(筛去3的倍数)。这样,在下一个元素为b5,将5输出并筛去5的倍数,直到筛中无非零元素为止。,源程序: main() int b100,i,j; b0=b1=0; for(i=2;i100;i+) bi=1; for(i=2;i100;i+) if(bi!=0) printf(“%4d”,i); for(j=i;j100;j+=i) bj=0;,
展开阅读全文