第6章数组.docx

上传人:b****8 文档编号:11000131 上传时间:2023-02-24 格式:DOCX 页数:28 大小:380.82KB
下载 相关 举报
第6章数组.docx_第1页
第1页 / 共28页
第6章数组.docx_第2页
第2页 / 共28页
第6章数组.docx_第3页
第3页 / 共28页
第6章数组.docx_第4页
第4页 / 共28页
第6章数组.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

第6章数组.docx

《第6章数组.docx》由会员分享,可在线阅读,更多相关《第6章数组.docx(28页珍藏版)》请在冰豆网上搜索。

第6章数组.docx

第6章数组

第6章数组

6.1一维数组

【学习目标】

(1)掌握数组的概念和应用范围

(2)掌握一维数组的定义和数组元素的引用

(3)掌握一维数组的初始化的方法

实例19一维数组的定义与引用——平均成绩的统计

【实例任务】

现从键盘上输入5位同学的成绩,要求求其平均成绩,运行结果如图6-1所示

图6-1程序运行结果

【程序代码】

#include"stdio.h"

main()

{floatscore[6];/*定义单精度数组score,有6个元素*/

inti;

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

{printf("请输入第%d个同学的成绩:

",i+1);/*提示输入5个人的成绩*/

scanf("%f",&score[i]);}

score[5]=0;/*score[5]中放平均成绩,所以先清0*/

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

score[5]+=score[i];/*求成绩之和*/

score[5]/=5;/*求平均成绩*/

printf("平均成绩是:

%.2f",score[5]);

getch();}

【相关知识】

1.数组的概念

将一组排列有序的、个数有限的变量作为一个整体,用一个统一的名字来表示,则这些有序变量的全体称为数组。

或者说,数组是用一个名字代表顺序排列的一组元素,顺序号就是下标变量的值。

而简单变量是没有序的,无所谓谁先谁后,数组中的单元是有排列顺序的。

在同一数组中,构成该数组的成员称为数组单元或叫数组元素。

数组里面的每一个数据用数组单元名来标识。

在C语言中,引用数组中的某一单元,要指出数组名和用括号括起来的数组单元在数组中的位置(顺序号)的下标。

因此,数组单元又称“带下标的变量”,简称“下标变量”。

例如:

score[5]中,score是数组名。

该数组可以存放5个成绩,分别用下标变量表示:

score[0],score[1],…score[4]。

数组的主要优点在于其组织数据的方式可以使数据易于处理,也有利于数据的存储。

2.数组的维数

数组下标的个数称为数组是数组的维数。

具有一个下标的数组是一维数组,相应有两个下标的数组为二维数组,依次类推。

一般来讲,数组元素下标的个数就是该数组的维数;反之,一个数组的维数一旦确定,那么它的元素下标的个数也就随之确定了。

例如:

score[5]为一维数组

3.一维数组的定义

(1)定义一维数组的格式

定义一维数组的格式为:

类型标识符数组名[常量表达式],…;

例如:

floatscore[6];

定义一个数组,数组名为score,有6个元素,每个元素的类型均为float。

这6个元素分别是:

score[0]、score[1]、score[2]、score[3]、score[4]、score[5]。

注意,下标从0开始,不能使用数组元素score[6]。

C编译程序在编译时为score数组分配了6个连续的存储单元,每个单元占用四个字节,其存储情况如图6-2所示。

score[0]score[1]score[2]score[3]score[4]score[5]

图6-2数组元素的存储情况

(2)对一维数组的使用有以下几点说明

定义一个数组,数组名是标识符,命名规则同标识符命名规则。

数组的类型,即数组元素的类型,可以是基本类型(整型、实型和字符型等),也可以是指针类型、结构体类型或共用体类型。

定义数组时,必须使用下标常量表达式,表示数组中有多少个元素,即数组的长度。

它可以是常量或符号常量,但是不能是变量。

例如,下面写法是错误的。

intn;

scanf("%d",&n);

inta[n];

同理,以下数组定义是不正确的:

intarray(10);

intn;floatscore[n];

doubleb['a'..'d'];

charstr[];

如果定义多个相同类型的数组,则可以使用逗号隔开。

例如:

inta[10],b[20];

C编译器在进行编译时,为数组连续分配地址空间,分配空间的大小为:

数组元素占用字节数×数组长度。

4.一维数组的引用

使用数组必须先定义,后引用。

C语言规定,不能引用整个数组,只能逐个引用元素。

元素引用方式为:

数组名[下标]

下标可以是整型常量或整型表达式,例如:

a[3]=a[2]+a[3*2];

在本例子中如果已经定义好数组floatscore[6]后,对其进行引用,可以引用score[0],score[1],score[2],score[3],score[4],score[5]六个数组中的元素。

在引用时应注意以下几点:

(1)由于数组元素本身等价于同一类型的一个变量,它的使用与同类型的普通变量是相同的。

(2)在引用数组元素时,下标可以是整型常数或表达式,表达式内允许变量存在。

引用数组时,下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。

下标的取值范围是[0,数组长度-1]的整型值。

(3)对于一维数组来说,在C语言中不能引用整个数组,只能引用单个数组元素。

(4)数组名后方括号内是数组下标,下标表示该元素是数组的第几个元素。

数组名后面的方括号内的内容只有在数组定义时才是数组的长度,其他时候都是数组下标。

[]是下标运算符,引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。

在本例题中,如果要引用score[2]元素的值,其步骤分为首先计算2000+2*4=2008;其次取出2008的内容。

5.数组元素的地址

数组元素的地址:

数组元素的地址也可用元素前面加取地址运算符的方式来获得,形式如下:

&数组名[下标]

实例20一维数组的初始化与引用——查询数据中的最大值

【实例任务】

从键盘上输入10个整型数据,找出其中的最大值并显示出来。

运行结果如图6-3所示。

图6-3运行结果

【程序代码】

#include"stdio.h"

main()

{inta[10],max,i;/*定义数组a中有10个元素,最大值max,变量i*/

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

scanf("%d",&a[i]);/*从键盘上输入10个整型数据*/

max=a[0];/*假设最大值为第一个元素*/

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

if(max

printf("max=%d",max);/*输出最大值*/

getch();}

【相关知识】

1.一维数组的初始化

数组的初始化是指在定义数组时给全部数组元素或部分数组元素赋值。

一维数组初始化的形式为:

存储类型数据类型数组名[数组长度]={初值列表};

{}内的各个初值之间用逗号分隔,数值类型必须与数组类型一致。

系统将按初值的排列顺序,顺次给数组元素赋值。

如下面定义语句:

inta[10]={78,98,67,87,-56,-67,67,0,-98,67};

charc[5]={'c','h','i','n','a'};

当{}中所列初值的数量必须小于等于数组长度。

当初值数量小于数组长度时,数值型数组的后面没有初值的元素由系统自动赋值为0。

例如:

对a数组中所有元素赋初值0。

可以写为inta[10]={0};

又如:

对数值元素a[0]赋初值0,对a[1]赋初值1,其他元素均赋初值0。

可以写为

inta[10]={0,1}

再如:

charc[5]={'0'};

等价于

charc[5]={'0','0','0','0','0'};

2.数组大小的指定

可以通过赋初值定义数组的大小。

在对全部数组元素赋初值时,可以不指定数组的长度,系统会自动计算长度。

例如:

inta[]={1,2,3,4,5};等价于inta[5]={1,2,3,4,5};

又如:

inta[]={0,0,0,0,0};等价于inta[5]={0};

【课堂精练】

1.从键盘上输入10个整型数据,将其逆序输出。

运行结果如图6-4所示。

图6-4程序运行结果

根据程序运行结果,请将下面程序补充完整并调试。

#include"stdio.h"

main()

{inti,a[10];

printf("请输入10个整数:

\n");

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

scanf("%d",&a[i]);/*输入时引用数组元素的地址*/

printf("请输出10个整数:

\n");

for(i=9;i>=0;i--)

________________________________/*引用数组元素输出*/

printf("\n");

getch();}

2.请输入10个数,找出最大值和最小值所在的位置,并把两者对调,然后输出调整后的10个数。

程序的运行结果如图6-5所示。

图6-5程序运行结果

根据程序的运行结果,将下面程序补充完整。

#include"stdio.h"

main()

{inta[10],max,min,i,j,k;

printf("请输入各个数组元素的值:

");

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

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

printf("互换前的各数组元素的值为:

\n");

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

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

max=min=a[0];

/*先假设a[0]是最大值,也是最小值,后面验证可能会推翻假设*/

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

{if(a[i]

{min=a[i];k=i;}/*变量k记录最小值的下标号*/

_________________________________

{max=a[i];j=i;}/*j记录最大值的下标号*/

}

a[j]=min;/*最大值和最小值互换*/

_______________________________________

printf("\n互换后的各数组元素的值为:

\n");

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

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

getch();}

6.2二维数组

【学习目标】

(1)掌握二维数组的定义和数组元素的引用方法

(2)掌握二维数组的初始化方法

实例21二维数组的定义与引用-----统计总成绩及平均成绩

【实例任务】

从键盘上任意输入某班n个学生的三门课程的成绩,计算每个学生的平均成绩、计算每门课程的平均成绩,并且打印成绩单,输出三门课程成绩的平均分及课程的平均分。

运行结果如图6-6所示。

图6-6程序运行结果

【程序代码】

#include"stdio.h"

#defineN40

main()

{floatave[3],score[N][4],sum;

inti,j,n;

printf("请输入学生的人数:

");

scanf("%d",&n);

printf("请输入这些学生的三门成绩:

");

for(i=0;i

{printf("请输入第%d个学生的3门成绩:

",i+1);

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

scanf("%f",&score[i][j]);}

for(i=0;i

{sum=0;

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

sum=sum+score[i][j];

score[i][3]=sum/3;}

for(j=0;j<3;j++)/*计算每门课的平均成绩*/

{sum=0;

for(i=0;i

sum=sum+score[i][j];

ave[j]=sum/n;}

/*打印成绩单*/

printf("序号课程1课程2课程3平均成绩\n");/*输出表头*/

for(i=0;i

{printf("%-10d",i+1);/*左对齐,输出学生编号*/

/*输出3科成绩平均分*/

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

printf("%-9.1f",score[i][j]);/*左对齐输出*/

printf("\n");}

/*输出课程平均分*/

printf("平均成绩");/*一个汉字占两个字符的位置,后面添加2个空格*/

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

printf("%-9.1f",ave[j]);/*左对齐输出*/

getch();}

【相关知识】

1.二维数组的定义

定义二维数组的一般格式为:

类型标识符数组名[常量表达式1][常量表达式2];

在二维数组的定义中,数组名后面紧跟两个方括号括起来两个下标。

常量表达式1的值指明了二维数组的行数,常量表达式2的值指明了二维数组的列数。

行下标值和列下标值的乘积,是数组元素的个数。

例如:

floatscore[40][4];

定义了一个实型二维数组score,共有40*4=160个元素,可以称为40行4列的数组。

对于以上定义的数组有以下几点说明,这些说明同样适合其他二维数组。

(1)二维数组中每个数组元素必须有两个下标,常量表达式的值即为下标的值,与一维数组要求一样,其下标只能是正整数,并且从0开始。

(2)二维数组可看作是一种特殊的一维数组。

可以将二维数组元素排列成一个矩阵,用二维数组的第1个下标表示数组元素所在的行,第2个下标表示所在的列,二维数组只是在逻辑上是二维的,从存储上看,二维数组仍是一维线性空间。

C语言中,按照行优先方式存储二维数组,即先存放第0行的元素,再存放第1行的元素……;同一行中再按列顺序存放。

例如:

floatscore[40][4];可以把score数组看作是包含二个元素的一维数组,每个元素又是一个含有四个元素一维数组。

按行形式排列数组元素的表示如下:

第0列第1列第2列第3列

score[0]score[0][0]score[0][1]score[0][2]score[0][3]

score[1]score[1][0]score[1][1]score[1][2]score[1][3]

score[2]score[2][0]score[2][1]score[2][2]score[2][3]

…………

score[39]score[39][0]score[39][1]score[39][2]score[39][3]

2.二维数组元素的引用

C语言规定,不能引用整个数组,只能逐个引用元素。

二维数组中各个元素可看作具有相同数据类型的一组变量。

因此,对变量的引用及一切操作,同样适用于二维数组元素。

二维数组元素引用的格式为:

数组名[行下标表达式][列下标表达式]

说明:

(1)下标可以是整型常量或整型表达式。

第一维下标的取值范围是[0,第一维长度-1],第二维下标的取值范围是[0,第二维长度-1]。

(2)二维数组的引用和一维数组的引用类似,要注意下标取值不要超过数组的范围。

例如,下面的语句均是正确的二维数组引用格式。

inta[3][4];

a[0][0]=3;

a[0][1]=a[0][0]+10;

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

a[0][1]=a[0][0];

a[0][2]=a[0][1]%(int)(x);

a[2][0]++;

scanf("%d",&[2][1]);

printf("%d",a[2][1]);

而下面两种引用是错误的。

a[3][4]=3;/*下标越界*/

a[1,2]=1;/*应写成a[1][2]=1;*/

实例22二维数组的初始化与引用——求矩阵的乘积

【实例任务】

编写程序求一个M行N列的矩阵和一个N行W列的矩阵的乘积。

运行结果如图6-7所示。

图6-7程序运行结果

【程序代码】

#include"stdio.h"

#defineM4

#defineN5

#defineW4

main()

{inta[M][N],b[N][W],c[M][W],i,j,k;

printf("pleaseenterarraya(%d*%d):

\n",M,N);

for(i=0;i

for(j=0;j

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

printf("pleaseenterarrayb(%d*%d):

\n",N,W);

for(i=0;i

for(j=0;j

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

for(i=0;i

for(j=0;j

{c[i][j]=0;

for(k=0;k

c[i][j]+=a[i][k]*b[k][j];}

printf("c=a*b:

\n");

for(i=0;i

{for(j=0;j

printf("%6d",c[i][j]);/*按行输出乘积矩阵*/

printf("\n");}

getch();}

【相关知识】

1.二维数组的初始化

定义之后进行数组的初始化操作,则只能对每个数组元素一一赋值。

intarr[4][10],i,j;

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

for(j=0;j<10;j++)

arr[i][j]=0;

2.赋值格式

如果在定义数组时完成数组的初始化操作,赋值格式有三种。

(1)将数组元素的初值依次放在一对{}中并用赋值号与数组连接。

具体格式为:

存储类型数据类型数组名[数组长度]={初值列表};

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

(2){}内各个初值之间用逗号分隔,初值类型必须与数组类型一致。

系统自动按数组元素在内存的顺序将初值依次赋给相应的元素。

若数值型数组的初值数量不足时,将0赋给其余数组元素,有定义如下:

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

运行后,x[0][0]=1、x[0][1]=2、x[0][2]=3、x[1][0]=4、x[1][1]=5,其余元素被自动赋值为0。

(3)赋初值时,每一行的初值放在一对{}中,所有行的初值再放在一对{}中。

系统将第一对{}内数据依次赋值给数组的第0行,将第二对{}内数据依次赋值给数组的第1行,依次类推。

具体格式为:

存储类型数据类型数组名[数组长度]={{第0行初值列表},{第1行初值列表},…};

有定义如下:

intx[4][4]={{1,2,3,4},{4,5,6},{},{7}};

系统将1、2、3、4依次赋给第0行的x[0][0]、x[0][1]、x[0][2]和x[0][3];4、5、6依次赋给第1行的x[1][0]、x[1][1]和x[1][2],x[0][3]的初值,系统自动赋0;系统给第2行的x[2][0]、x[2][1]、x[2][2]和x[2][3]均赋值0;第3行对应{7},则系统将7赋值给x[3][0],余下的x[3][1]、x[3][2]和x[3][3]均被系统赋值为0。

(4)数组初始化时,行长度可省,列长度不能省。

编译系统会根据赋初值的情况,自动得到第一维的长度。

所给初值的个数也不能多于数组元素的个数。

例如:

inta[][3]={1,2,3,4,5,6,7};/*隐含指明行下标为3*/

intb[][4]={{1},{4,5}};/*隐含指明行下标为2*/

下面对二维数组的初始化都是错误的:

inta[][],b[][2],c[3][];/*数组初始化时,行长度和列长度不正确*/

floatx[3][]={1.0,2.0,3.0,4.0,5.0,6.0};/*列长度不能省*/

intm[2][4]={1,2,3,4,5,6,7,8,9}/*编译出错,初值个数多于数组元素的个数*/

3.二维数组元素的地址

二维数组数组元素的地址可用数组元素前面加地址操作符的方式来表示:

&数组名[下标1][下标2]

【课堂精练】

1.求出矩阵a的主对角线上的元素之和,程序运行结果如图6-8所示。

图6-8程序运行结果

根据程序运行结果,将下面程序补充完整。

#include"stdio.h"

main()

{

inta[3][3]={1,3,5,7,9,11,13,15,17},sum=0,i,j;

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

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

if(i==j)/*对角线上元素的行列下标值是相等的*/

____________________________________

printf("sum=%d",sum);

getch();}

2.定义一个二维数组,编程求出最大值的元素所在的行和列下标值。

程序的运行结果如图6-9所示。

图6-9程序运行结果

根据程序运行结果,将下面程序补充完整。

#include"stdio.h"

main()

{inti,j,row=0,col=0,max;

inta[3][3]={3,-6,90,15,-53,71,12,48,91};/*定义二维数组并初始化*/

max=a[0][0];/*假设第一个数组元素就是最大值,后面再进行比较*/

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

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

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

{_________________________________

row=i;

col=j;}

printf("最大值:

%d\n所在行号为:

%d\n所在列号为:

%d",max,row,col);

getch();}

6.3字符数组与字符串

【学习目标】

(1)掌握字符数组的定义与引用方法

(2)掌握字符串的存储形式

(3)掌握字符数组与字符串的区别

实例23字符数组的定义与引用——字母替换

【实例任务】

编写程序将一行字符中所有字母替换为在字母表中其后的第三个字母,即a替换为d、b替换为f、c替换为g……,x、y、z分别替换为a、b、c,然后输出。

运行结果如图6-10所示。

图6-10程序运行结果

【程序代码】

#include"stdio.h"

#include"string.h"

main()

{charstr[80],i;

printf("请输入大小写字符序列:

");

i=0;

while((str[i]=getchar())!

='\n')/*输入字符序列,当输入字符为回车时结束*/

i++

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

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1