第7章 数组

  • 格式:doc
  • 大小:104.00 KB
  • 文档页数:19

第1页 第七章 数组 数组是一种常用的数据结构,用来存储同一类型值的集合。当程序要处理大量的同类型的数据就需要将这批数据存储在数组中,以便用循环来处理数组中的每个值。 7.1 一维数组 一、一维数组中的基本语法 1. 一维数组的定义语法 数据类型 数组名[整型常量表达式]; 说明: (1) 一个数组是由若干数组元素组成的,每个数组元素相当于一个变量,用来存放单个数据。一个数组的数据类型就是数组中所有元素的数据类型。 (2) 数组名要符合C语言标识符的命名规则。 (3) 整型常量表达式,即表达式中只有常量没有变量,而且表达式的结果必须为整型。整型常量表达式的值表示数组中的元素个数(也称为数组长度)。 例如,要计算一个班级100名同学某门课程的平均分,我们可以定义一个长度为100的数组,存储每位同学的课程成绩:double score[100]。这里将数组命名为score,数组中的每个元素的数据类型都为double,一个元素存放一名同学的课程成绩。 这里特别要指出的是,定义数组时必须给出数组长度,即必须说明数组中的元素个数。 而且数组长度必须用整型常量表达式来表示,例如: int a[10]; 或者: #define N 10 int a[N]; double a[5+5],b[5*2]; int c[N+5],d[N*2]; 不能通过变量或者带有变量的表达式表示数组长度。例如,下列数组的定义是错误的: int n=10; int a[n]; int b[n+10]; 另外,不能定义长度为0的数组,例如:int a[0],b[10-10];

2. 数组元素 第2页

(1) 数组元素的引用 通过数组名和元素下标来引用所有的数组元素,即数组名[元素下标]。其中元素下标表明某个具体的元素在数组中的位序,数组中第一个元素的下标为0,最后一个数组元素的下标应该是数组长度-1。元素下标可以用整型表达式表示。 如有数组定义:int a[10];根据数组长度,不难知道数组a是由10个数组元素组成的,这10个元素可以分别表示为:a[0]、a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9]。需要注意起始元素的下标为0,最后一个元素的下标为9(数组长度减去1)。 在引用数组元素时,其实我们用到了数组下标运算符[],它是C语言优先级最高的4个运算符之一。 (2) 数组元素的语法本质 每个数组元素相当与一个与数组类型相同的变量,所有凡是能对变量进行的运算都适合数组元素,见下面这段程序: int i,j,a[10]; i=4;j=i;printf("%d",j); a[3]=123;a[i]=a[1+2]; /*数组元素的下标可以用变量定义!*/ printf("%d",a[i]);

3. 一维数组的初始化 数组的初始化是指在定义数组的同时为每一个数组元素赋值,可通过初始化列表对数组进行初始化,具体语法如下:数据类型 数组名[常量表达式]={表达式1,表达式2,…,表达式n}; 例如,int x=3;int a[10]={0,1,x-1,x,x+1,2*x-1,5+1,7,8,9}; 初始化列表语法有两个重要的变形: (1) 只初始化部分元素。例如,int a[10]={0,1,2,3,4};其中a[5]~a[9]没有被初始化, 初值为0,所以在初始化数组时,凡没有被初始化的元素其初值就为0。 【课内思考题7.1】 设int a[2010];如何将数组a中的全部元素初始化为0?_________ (2) 初始化全部元素可以省略数组长度。例如,int a[6]={0,1,2,3,4,5};可以写成int a[]={0,1,2,3,4,5};

4. 一维数组元素的内存分布 例如,short a[5];数组a中有5个元素,每个元素相当于一个short变量,占2个字 第3页

节,所以系统需为a分配连续的10个字节,a[0]获得头2个字节,a[1]得到接下来的2个字节…… 【例7.1】 验证一维数组元素内存分布的连续性。 #include main() { short a[5]={1,2,3,4,5}; int i; printf("sizeof(i)=%d\n",sizeof(i)); printf("&i=%#x\n",&i); printf("sizeof(a)=%d\n",sizeof(a)); printf("sizeof(a[0])=%d\n",sizeof(a[0])); printf("&a[0]=%#x\n",&a[0]); printf("&a[1]=%#x\n",&a[1]); printf("&a[2]=%#x\n",&a[2]); printf("&a[3]=%#x\n",&a[3]); printf("&a[4]=%#x\n",&a[4]); printf("a=%#x\n",a);/*数组名代表数组首元素的地址*/ } 说明:从程序最后一条语句的打印情况来看,数组名代表数组中第一个元素的地址,即a≡&a[0]。 【课内思考题7.2】 如何使用sizeof运算符计算数组的长度(特别是省略长度的数组)?

二、一维数组在编程中的应用 1. 顺序访问一维数组 (1) 循环打印一维数组全部元素的值 #include main() { int a[8]; int i; 第4页

for(i=0;i<8;i++) a[i]=i+1;/*scanf("%d",&a[i]);*/ for(i=0;i<8;i++) printf("%d ",a[i]); printf("\n"); for(i=7;i>=0;i--) printf("%d ",a[i]); printf("\n"); }

(2) 数组间赋值 #include main() { int a[8],b[8]; int i; for(i=0;i<8;i++) scanf("%d",&a[i]); /*逐元素地拷贝*/ for(i=0;i<8;i++) b[i]=a[i]; for(i=0;i<8;i++) printf("%d ",b[i]); }

2. 用数组生成fibonacci数列 #include main() { int f[20]; int i; f[0]=f[1]=1; for(i=2;i<19;i++) f[i]=f[i-1]+f[i-2]; 第5页

for(i=0;i<20;i++) { printf("%-5d",f[i]); if( (i+1)%5==0 ) printf("\n"); } }

3. 数组逆置 #include main() { int a[8]; int i,j; for(j=0;j<8;j++) scanf("%d",&a[j]); i=0,j=8-1; while(i{ int temp=a[i]; a[i]=a[j]; a[j]=temp; i++; j--; } for(j=0;j<8;j++) printf("%d ",a[j]); }

4. 顺序查找 #include main() { int a[5]; 第6页

int x; int index=-1; int i; for(i=0;i<5;i++) scanf("%d",&a[i]);/*输入N个数保存在数组a中*/ scanf("%d",&x);/*输入给定值*/ for(i=0;i<=5-1;i++) if(a[i]==x) { index=i break; } printf("%d\n",index); }

5. n个数中找出最大数及其位置 #include main() { int a[10];/*用一维数组作为n个数的存储结构*/ int maxindex;/*存储最大数在数组中的下标*/ int i; for(i=0;i<10;i++) scanf("%d",&a[i]); maxindex=0;/*假定第一个数最大*/ for(i=1;i<10;i++)/*扫描数组每个元素,并和当前序列中的最大数比较*/ if(a[i]>a[maxindex]) index=i;/*index存放已比较过的序列中的最大元素的下标*/ printf("max=%d,index=%d\n",a[index],index); }

6. 排序 第7页

(1) 选择排序 #include #define N 10 main() { int a[N]; int i,j; for(i=0;iscanf("%d",&a[i]); for(i=0;i<=N-2;i++) { int index=i; for(j=i+1;jif(a[j]if(index!=i) { int temp=a[index]; a[index]=a[i]; a[i]=temp; } } for(i=0;iprintf("%d ",a[i]); printf("\n"); }

(2) 冒泡排序 #include #define N 10 main() {