第七章 数组.docx

上传人:b****4 文档编号:5132446 上传时间:2023-05-08 格式:DOCX 页数:21 大小:21.71KB
下载 相关 举报
第七章 数组.docx_第1页
第1页 / 共21页
第七章 数组.docx_第2页
第2页 / 共21页
第七章 数组.docx_第3页
第3页 / 共21页
第七章 数组.docx_第4页
第4页 / 共21页
第七章 数组.docx_第5页
第5页 / 共21页
第七章 数组.docx_第6页
第6页 / 共21页
第七章 数组.docx_第7页
第7页 / 共21页
第七章 数组.docx_第8页
第8页 / 共21页
第七章 数组.docx_第9页
第9页 / 共21页
第七章 数组.docx_第10页
第10页 / 共21页
第七章 数组.docx_第11页
第11页 / 共21页
第七章 数组.docx_第12页
第12页 / 共21页
第七章 数组.docx_第13页
第13页 / 共21页
第七章 数组.docx_第14页
第14页 / 共21页
第七章 数组.docx_第15页
第15页 / 共21页
第七章 数组.docx_第16页
第16页 / 共21页
第七章 数组.docx_第17页
第17页 / 共21页
第七章 数组.docx_第18页
第18页 / 共21页
第七章 数组.docx_第19页
第19页 / 共21页
第七章 数组.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

第七章 数组.docx

《第七章 数组.docx》由会员分享,可在线阅读,更多相关《第七章 数组.docx(21页珍藏版)》请在冰点文库上搜索。

第七章 数组.docx

第七章数组

第七章数组

数组是一种常用的数据结构,用来存储同一类型值的集合。

当程序要处理大量的同类型的数据就需要将这批数据存储在数组中,以便用循环来处理数组中的每个值。

7.1一维数组

一、一维数组中的基本语法

1.一维数组的定义语法

数据类型数组名[整型常量表达式];

说明:

(1)一个数组是由若干数组元素组成的,每个数组元素相当于一个变量,用来存放单个数据。

一个数组的数据类型就是数组中所有元素的数据类型。

(2)数组名要符合C语言标识符的命名规则。

(3)整型常量表达式,即表达式中只有常量没有变量,而且表达式的结果必须为整型。

整型常量表达式的值表示数组中的元素个数(也称为数组长度)。

例如,要计算一个班级100名同学某门课程的平均分,我们可以定义一个长度为100的数组,存储每位同学的课程成绩:

doublescore[100]。

这里将数组命名为score,数组中的每个元素的数据类型都为double,一个元素存放一名同学的课程成绩。

这里特别要指出的是,定义数组时必须给出数组长度,即必须说明数组中的元素个数。

而且数组长度必须用整型常量表达式来表示,例如:

inta[10];

或者:

#defineN10

inta[N];

doublea[5+5],b[5*2];

intc[N+5],d[N*2];

不能通过变量或者带有变量的表达式表示数组长度。

例如,下列数组的定义是错误的:

intn=10;

inta[n];

intb[n+10];

另外,不能定义长度为0的数组,例如:

inta[0],b[10-10];

2.数组元素

(1)数组元素的引用

通过数组名和元素下标来引用所有的数组元素,即数组名[元素下标]。

其中元素下标表明某个具体的元素在数组中的位序,数组中第一个元素的下标为0,最后一个数组元素的下标应该是数组长度-1。

元素下标可以用整型表达式表示。

如有数组定义:

inta[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)数组元素的语法本质

每个数组元素相当与一个与数组类型相同的变量,所有凡是能对变量进行的运算都适合数组元素,见下面这段程序:

inti,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};

例如,intx=3;inta[10]={0,1,x-1,x,x+1,2*x-1,5+1,7,8,9};

初始化列表语法有两个重要的变形:

(1)只初始化部分元素。

例如,inta[10]={0,1,2,3,4};其中a[5]~a[9]没有被初始化,

初值为0,所以在初始化数组时,凡没有被初始化的元素其初值就为0。

【课内思考题7.1】设inta[2010];如何将数组a中的全部元素初始化为0?

(2)初始化全部元素可以省略数组长度。

例如,inta[6]={0,1,2,3,4,5};可以写成inta[]={0,1,2,3,4,5};

4.一维数组元素的内存分布

例如,shorta[5];数组a中有5个元素,每个元素相当于一个short变量,占2个字节,所以系统需为a分配连续的10个字节,a[0]获得头2个字节,a[1]得到接下来的2个字节……

【例7.1】验证一维数组元素内存分布的连续性。

#include

main()

{

shorta[5]={1,2,3,4,5};

inti;

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

#defineN10

main()

{

inta[N];

inti;

for(i=0;i

a[i]=i+1;/*scanf("%d",&a[i]);*/

for(i=0;i

printf("%d",a[i]);

printf("\n");

for(i=N-1;i>=0;i--)

printf("%d",a[i]);

printf("\n");

}

(2)数组间赋值

#include

#defineN10

main()

{

inta[N],b[N];

inti;

for(i=0;i

/*逐元素地拷贝*/

for(i=0;i

for(i=0;i

}

2.用数组生成fibonacci数列

#include

main()

{

intf[20];

inti;

f[0]=f[1]=1;

for(i=2;i<19;i++)

f[i]=f[i-1]+f[i-2];

for(i=0;i<20;i++)

{

printf("%-5d",f[i]);

if((i+1)%5==0)printf("\n");

}

}

3.数组逆置

#include

#defineN8

main()

{

inta[N];

inti,j;

for(j=0;j

i=0,j=N-1;

while(i

{

inttemp=a[i];

a[i]=a[j];

a[j]=temp;

i++;

j--;

}

for(j=0;j

}

4.顺序查找

#include

#defineN5

main()

{

inta[N];

intx;

intindex=-1;

inti;

for(i=0;i

scanf("%d",&a[i]);/*输入N个数保存在数组a中*/

scanf("%d",&x);/*输入给定值*/

for(i=0;i<=N-1;i++)

if(a[i]==x)

{

index=i

break;

}

printf("%d\n",index);

}

5.n个数中找出最大数及其位置

#include

main()

{

inta[10];/*用一维数组作为n个数的存储结构*/

intmaxindex;/*存储最大数在数组中的下标*/

inti;

for(i=0;i

maxindex=0;/*假定第一个数最大*/

for(i=1;i

if(a[i]>a[maxindex])index=i;/*index存放已比较过的序列中的最大元素的下标*/

printf("max=%d,index=%d\n",a[index],index);

}

6.排序

(1)选择排序

#include

#defineN10

main()

{

inta[N];

inti,j;

for(i=0;i

scanf("%d",&a[i]);

for(i=0;i<=N-2;i++)

{

intindex=i;

for(j=i+1;j

if(a[j]

if(index!

=i)

{

inttemp=a[index];

a[index]=a[i];

a[i]=temp;

}

}

for(i=0;i

printf("%d",a[i]);

printf("\n");

}

(2)冒泡排序

#include

#defineN10

main()

{

inta[N];

inti,j;

for(i=0;i

scanf("%d",&a[i]);

for(i=0;i<=N-2;i++)

for(j=0;j<=N-i-2;j++)

if(a[j]>a[j+1])

{

intt=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

for(i=0;i

printf("%d",a[i]);

printf("\n");

}

【例7.2】若有以下输入,分析程序的运行结果,并掌握其中的程序设计技巧。

142334123322009342221120101320112-1

#include

#defineM50

main()

{

inta[M],c[5]={0},i,n=0,x;

printf("Enter0or1or2or3or4,toendwith-1\n");

scanf("%d",&x);

while(x!

=-1)

{

if(x>=0&&x<=4)

{

a[n]=x;

n++;

}

scanf("%d",&x);

}

for(i=0;i

printf("theresultis:

\n");

for(i=1;i<=4;i++)

printf("%d:

%d\n",i,c[i]);

printf("\n");

}

 

7.2二维数组

一、二维数组中的基本语法

1.二维数组的定义语法

数据类型数组名[整型常量表达式1][整型常量表达式2];

说明:

二维数组有两维长度,用整型常量表达式1的值表示第一维长度,用整型常量表达式2的值表示第一维长度2。

例如,inta[3][4],b[4][5];

2.二维数组的语法本质

使用二维数组时要注意,其实C语言中并没有真正的二维数组,二维数组只不过是数组中的数组,即二维数组是由若干一维数组组成的特殊数组。

对于前面定义的二维数组a,由于它的第一维长度为3,所以数组a是由3个一维数组组成的,这3个一维数组的名字分别是a[0],a[1]和a[2]。

数组a的第二维长度说明组成a的每个一维数组又分别拥有4个数组元素,例如,一维数组a[0]包括的4个元素为a[0][0]、a[0][1]、a[0][2]、a[0][3];a[1]包括的4个元素为a[1][0]、a[1][1]、a[1][2]、a[1][3];

a[2]包括的4个元素为a[2][0]、a[2][1]、a[2][2]、a[2][3]。

【例7.3】验证二维数组是特殊的一维数组。

#include

main()

{

inta[3][4];

printf("sizeof(a)=%d\n",sizeof(a));

printf("sizeof(a[0])=%d\n",sizeof(a[0]));

}

通常情况下,我们都是直观地理解二维数组:

数组a为3×4(3行4列)的二维数组,数组b为4×5(4行5列)的二维数组。

3.二维数组元素内存分布

例如,shorta[3][4];数组a中有12个元素,每个元素占2个字节,所以系统需为数组a分配连续的24个字节。

先为一维数组a[0]中的元素a[0][0]~a[0][3]各分配2字节,接下来的8个字节依次分配给a[1][0]~a[1][3],a[2][0]~a[2][3]获得最后的8个字节。

【例7.4】验证在为二维数组元素分配内存字节数时遵循行优先的原则。

#include

main()

{

shorta[2][4];

printf("a[0][0]=%#x\n",&a[0][0]);

printf("a[0][1]=%#x\n",&a[0][1]);

printf("a[0][2]=%#x\n",&a[0][2]);

printf("a[0][3]=%#x\n",&a[0][3]);

printf("a[1][0]=%#x\n",&a[1][0]);

printf("a[1][1]=%#x\n",&a[1][1]);

printf("a[1][2]=%#x\n",&a[1][2]);

printf("a[1][3]=%#x\n",&a[1][3]);

}

4.二维数组的初始化

只要理解二维数组是由若干一维数组构成的,就不难理解二维数组的初始化语法了。

(1)用多个初始化列表初始化二维数组中的每个一维数组

例如,inta[3][4]=

{

{1,2,3,4},

{5,6,7,8},

{9,10,11,12}

};

说明:

在给一维数组初始化时,我们可以省略数组中某些元素的初值,例如:

intb[4]={1,2};则b[2]和b[3]的初值就为0,同理有,inta[3][4]={{1},{5,6},{9,10,11}};

【课内思考题7.3】设inta[4][2009];怎样将数组a的所有元素初始化为0?

(2)用一个初始化列表初始化二维数组

例如,inta[3][4]={1,2,3,4,5,6,7};

(3)省略二维数组第一维长度

例如,inta[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};

当用一个初始化列表初始化二维数组并且省略该二维数组的第一维长度的情况下,例如inta[][4]={1,2,3,4,5,6,7};如果计算其第一维长度?

答案是[初值个数/第二维长度]。

数组a的第二维长度应为2。

二、二维数组应用举例

【例7.5】遍历二维数组

#include

#defineN3

#defineM4

main()

{

inta[N][M];/*行下标范围:

0~N-1,列下标范围:

0~M-1*/

inti,j;

/*外循环遍历二维数组每一行*/

for(i=0;i

for(j=0;j

scanf("%d",&a[i][j]);

for(i=0;i

{

for(j=0;j

printf("%-5d",a[i][j]);

printf("\n");

}

}

【例7.6】在二维数组a中选出各行最大的元素,组成一个一维数组b。

#include

main()

{

inta[3][4]={

{3,6,-1,4},

{0,-2,7,3},

{-5,8,3,9}

};

intb[3];

inti,j;

for(i=0;i<3;i++)

{

/*从一维数组a[i]中找出最大值,存储到b[i]*/

intindex=0;

for(j=1;j<4;j++)

if(a[i][j]>a[i][index])index=j;

b[i]=a[i][index];

}

for(i=0;i<3;i++)

printf("%d",b[i]);

printf("\n");

}

【例7.7】求矩阵中值最大的元素

#include

#defineN3

#defineM4

main()

{

inta[N][M];

inti,j;

intmax,row,col;

for(i=0;i

for(j=0;j

scanf("%d",&a[i][j]);

max=a[0][0];row=0;col=0;

for(i=0;i

for(j=0;j

if(a[i][j]>max)

{

max=a[i][j];

row=i;col=j;

}

printf("max=%d,row=%d,col=%d\n",max,row+1,col+1);

}

 

7.3字符数组

一、字符数组的相关语法

1.使用字符数组存储若个字符

C语言字符数组的基本使用方法和前面介绍的一维数组和二维数组类似。

只是数组类型变为char,数组中的每个元素相当于一个字符变量,可以存储一个字符的ASCII码。

【例7.8】字符数组的初始化、输入与输出。

#include

#defineN5

main()

{

chars1[]={'J','i','a','X','i','n','g'};/*s1省略数组长度定义*/

chars2[10]={'H','a','n','g','Z','h','o','u'};/*s2[8]和s2[9]中存储'\0'*/

chars3[4][8]={

{'W','e','n','Z','h','o','u'},/*s3[0][7]存储'\0'*/

{'T','a','i','Z','h','o','u'},/*s3[1][7]存储'\0'*/

{'N','i','n','g','','b','o'},/*s3[2][7]存储'\0'*/

{'H','u','','Z','h','o','u'}/*s3[3][7]存储'\0'*/

};

chars4[N];

inti;

for(i=0;i

for(i=0;i

printf("\n");

for(i=0;i

printf("%c",s1[i]);

printf("\n");

for(i=0;s2[i]!

='\0';i++)

printf("%c",s2[i]);

for(i=0;i<4;i++)

{

intj=0;

while(s3[i][j]!

='\0')

{

printf("%c",s3[i][j]);

j++;

}

printf("\n");

}

}

说明:

在给一维字符数组或者二维字符数组中某个一维字符数组初始化时,若省略了某些元素的初值,这些字符数组元素中存放字符'\0'。

2.使用字符数组存储字符串

其实在C语言中,字符数组主要被用于存储由若干字符组成的字符串。

(1)一维字符数组存储一个字符串

例如,charstr[]={"Iamhappy"};或charstr[]="Iamhappy";其中str[10]中存放字符串结束符'\0'的ASCII码。

用一个字符串初始化字符数组的做法等价于抽取一个字符串中的每个字符(包括串结束符)放在初始化列表中去初始化字符数组。

例如,charstr[]={'I','','a','m','','h',

'a','p','p','y','\0'};

字符数组中所存储的字符串长度和字符数组本身的长度不并一致。

有如下数组定义:

charstr1[10]="china";

charstr2[]="abcde";

charstr3[]="abc\0d\0e";

charstr4[]="";

chars[16]="4$*0;\0p\0+\0";

【课内思考题7.4】请大家分析以上这些字符数组中所存储的字符串的串长和这些字符数组的长度?

(2)二维字符数组存储多个字符串

例如,charss[4][9]={"WenZhou","TaiZhou","HangZhou","HuZhou"};

说明:

二维字符数组是由多个一维字符数组组成,每个一维字符数组可以单独存储一个字符串,所以一个二维数组能存储多个字符串。

值得注意的是,二维字符数组的第二维长度至少应该是所存储的所有字符串中最大的串长加1。

3.单个字符串的输入与输出

通过gets函数(或scanf函数)实现字符串的输入,输入的字符串存储在某个字符数组中;通过puts函数(或printf函数)输出字符数组中字符串。

#include

#defineN20

main()

{

chars1[N],s2[8];

gets(s2);/*scanf("%s",s2);*/

puts(s2);/*printf("%s",s2);*/

}

说明:

用函数scanf实现输入的缺点是,用户输入的字符串不能包含空格。

因为空格被当作输入结束处理,这种情况下就只能用函数gets实现输入了。

另外,水平制表和回车也被认为是输入结束。

4.多个字符串的输入与输出

#include

#defineM3/*存储M个字符串*/

#defineN10/*单个字符串的最大长度不能超过N-1*/

main()

{

charss[M][N];

inti;

for(i=0;i

for(i=0;i

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2