第4章数组.docx

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

第4章数组.docx

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

第4章数组.docx

第4章数组

第4章数组

4.1数组应用的C程序实例

数组是若干具有相同数据类型且按一定存储顺序排列的一组变量。

数组中的变量称数组元素。

每一个元素通过数组名和存储位置(下标)来确定。

根据确定数组的一个元素所需要的下标数把数组分为一维数组、二维数组、三维数组等,二维以上的数组也称为多维数组。

【例4.1】应用一维数组,实现从键盘输入10个整数,输出其中的最小数。

程序名为l4_1.cpp。

#include"stdio.h"

main()

{inta[10],i,min;/*定义一维整型数组a有10个元素*/

for(i=0;i<10;i++)/*循环输入数组a的10个元素*/

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

min=a[0];/*设a[0]元素为最小值min的初值*/

for(i=1;i<10;i++)/*逐个元素与min比较,找出最小值*/

if(min>a[i])

min=a[i];

printf("MIN=%d\n",min);/*输出找到的最小值min*/

}

【例4.2】应用二维数组,实现从键盘为23数组输入值,并输出数组所有元素之和。

程序名为l4_2.cpp。

#include"stdio.h"

main()

{inta[2][3],i,j,sum=0;/*定义二维整型数组有2行3列6个元素*/

for(i=0;i<2;i++)/*按行向数组a输入6个元素,并将元素值送入sum进行累加求和*/

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

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

sum+=a[i][j];

}

printf("Sum=%d\n",sum);/*输出和值sum*/

}

4.2一维数组的定义和引用

4.2.1一维数组的定义

一、定义的格式:

类型说明符数组名[常量表达式];

二、说明:

1.类型说明符可以是int、char和float等,指明该数组的类型,即数组中每个元素的类型

2.数组名的命名规则遵循标识符的命名规则,它代表数组存储时的首地址

3.常量表达式是指数组的长度,即数组元素的个数。

三、含义及功能:

一维数组被定义后,编译系统将为该数组在内存中分配一片连续的存储空间,按一定的顺序连续存储数组的各个元素。

四、注意:

1.常量表达式的值必须是一个正的整数值

2.数组定义后,数组的长度就不能再改变

3.定义时,可用一个类型说明符来定义多个相同类型的数组和变量,相互之间用逗号分隔

4.2.2一维数组元素的引用

一、一维数组的数组元素表示形式为:

数组名[下标]

二、说明

1.遵从“先定义,后使用”的原则。

2.数组的引用是通过对数组元素的引用实现的,而不能直接引用整个数组。

3.下标是一个整型常量或整型表达式。

4.在一维数组引用过程中要防止下标越界问题,C语言编译系统不进行检测,即不进行错误报告,只是会造成程序运行结果的错误。

一维数组元素的下标从0开始,如果该数组长度为n,则元素的最大下标为n-1。

4.2.3一维数组的初始化

一、一维数组的初始化

在定义数组时,同时给数组元素赋值,称为一维数组的初始化。

二、一般形式为:

类型说明符数组名[常量表达式]={初始值表};

三、说明:

1.初始值表中数据与数组元素依次对应,初始值表中的数据用,分隔。

例如:

inta[5]={12,-3,4,0,367};

2.当初始化,初始值表给出全部元素初值时,则数组长度可以缺省。

例如:

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

3.给数组中的部分元素赋初始值。

例如:

inta[5]={1,2,3};

按照下标递增的顺序依次赋值,后两个元素系统自动赋0值。

即a[0]为1,a[1]为2,a[2]为3,而a[3]和a[4]均由系统自动赋值为0。

4.数组中的全部元素赋初值为0。

inta[5]={0};

此时,数组中的全部元素均为0。

4.3二维数组的定义和引用

4.3.1二维数组的定义

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

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

二、说明:

1.常量表达式1表示行数,而常量表达式2表示列数。

也就是他们分别指出数组的行长度和列长度。

“inta[2][3];”表示数组名是a,数组元素是整型,数组有2行3列,共计有6(23)个元素。

故定义了一个2行3列的整型数组a。

2.二维数组的行列下标均从0开始。

则数组a的6个元素是:

a[0][0],a[0][1],a[0][2]

a[1][0],a[1][1],a[1][2]

3.定义后,编译系统将为该数组在内存中分配一片连续的存储空间,按行的顺序连续存储数组中的各个元素。

即先顺序存储第一行元素,从a[0][0]到a[0][2],再存储第二行的元素,从a[1][0]到a[1][2]。

数组名a仍然代表数组的起始地址。

4.二维数组可以看作是特殊的一维数组。

例如二维数组a[2][3]可看成是由两个元素a[0]和a[1]组成。

而a[0]和a[1]又分别是一个一维数组,各有3个元素。

a[0]的元素是a[0][0]、a[0][1]、a[0][2]。

a[1]的元素是a[1][0]、a[1][1]、a[1][2]。

如图4-3所示。

4.3.2二维数组元素的引用

一、二维数组元素的引用形式为:

数组名[行下标][列下标]

二、说明:

1.行(列)下标表达式可以是整型常量、整型变量及表达式,表示二维数组的行(列)长度。

2.下标值仍然从0开始,到行(列)长度减1。

“inta[2][3];”,定义了一个2行3列的二维整型数组a,则在内存中依次连续存储的数组元素为a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2],通过循环嵌套语句:

for(i=0;i<2;i++)/*按行向数组a输入6个元素,并将元素值送入sum进行累加求和*/

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

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

sum+=a[i][j];

}

完成给数组元素赋值,即输入231245-12-3435,并将输入的值依次送入sum变量进行累加求和。

循环结束后,由输出语句printf("Sum=%d\n",sum);完成累加和sum的输出,结果为:

Sum=69

4.3.3二维数组的初始化

一、二维数组初始化:

定义二维数组时,给数组元素赋初值称为二维数组初始化。

二、说明:

1.注意二维数组的各元素所赋初始值的排列顺序。

初始值的排列顺序必须与数组各元素在内存的存储顺序完全一致。

具体的方法如下:

(1)分行给二维数组赋初值。

例如:

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

此方法直观,明显第1行的元素的初值由第1个花括号数据提供,第2行的元素的初值由第2个花括号数据提供,按行赋初值。

(2)按数组排列顺序对各元素赋初值。

例如:

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

此方法与前一种方法效果相同,但数据所处的行列位置不直观,尤其是数据多时,数据存储所在的行列需要仔细定位,容易出现错误。

(3)对部分元素赋初值。

例如:

inta[2][3]={{1},{0,4}};

此法,是对数组中各行的部分元素赋初值,其余元素值自动为0。

本例的作用是只对0行0列元素赋初值1,对1行1列元素赋初值4,而其余元素值自动为0。

即赋值后数组a的各元素为:

100

040

(4)赋初值时,有些情况可缺省第一维长度,但第二维长度不能缺省。

第一种情况:

数组的全部元素都赋初值时,则定义数组时对第一维长度可以缺省。

例如:

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

此时,系统会根据元素总个数分配存储空间,一共6个元素,每行3列,自然确定为2行。

第二种情况:

在分行赋值时(含对部分元素赋初值情况),可以在定义时省略第一维的长度。

例如:

inta[][3]={{0},{0,3}};

此时,编译系统知道数组共有2行。

赋值后数组a的元素分别为:

000

030

4.4字符数组与字符串

字符数组是用来存放字符数据的数组,即数组的数据类型是字符型(char)的数组称为字符数组。

字符数组的每个元素存放一个字符。

4.4.1字符数组的定义

一、字符数组的定义形式为:

1.一维字符数组定义:

char数组名[常量表达式];

2.二维字符数组定义:

char数组名[常量表达式1][常量表达式2];

二、举例:

charc[10];/*定义了一个10个元素的一维字符数组c*/

charc[2][10];/*定义了一个2行10列的二维字符数组c*/

由于字符型与整型是互相通用的,因此上面的定义也可改为:

intc[10];

intc[2][10];

但是,此种方法定义会浪费存储空间。

4.4.2字符数组的初始化

一、在定义字符数组时,可以对字符数组初始化。

二、字符数组初始化有以下方法:

(1)用字符常量初始化数组。

①一维字符数组初始化,例如:

charc[10]={’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’};

②二维字符数组初始化,例如:

charc[2][10]={{’a’,’b’,’c’},{’d’,’e’,’’}};

③当初值个数与字符数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。

例如:

charc[]={’H’,’o’,’w’,’’,’a’,’r’,’e’,’’,’y’,’o’,’u’};

相当于:

charc[11]={’H’,’o’,’w’,’’,’a’,’r’,’e’,’’,’y’,’o’,’u’};

④用整型常量初始化字符数组。

例如:

charc[5]={‘H’,111,119};

(2)用字符串常量初始化数组。

字符串是用双引号括起来的字符序列,是利用字符数组来存放和处理的。

用字符串常量初始化一个字符数组,例如:

charc[]={"Howareyou"};

也可写成:

charc[]="Howareyou";

经过初始化后,数组c共有关12个元素,它们分别为:

c[0]=’H’,c[1]=’o’,c[2]=’w’,c[3]=’’,c[4]=’a’,c[5]=’r’,c[6]=’e’,c[7]=’’,c[8]=’y’,c[9]=’o’,c[10]=’u’,c[11]=’\0’

二维数组初始化时,也可以使用字符串进行初始化。

例如:

charc[][8]={"white","black"};

此时,数组c分解成2个一维数组c[0]和c[1],它们各自有10个元素,每一个以一个字符串初始化,如图4-4所示:

c[0]

w

h

i

t

e

\0

\0

\0

c[1]

B

l

a

c

k

\0

\0

\0

图4-4

4.4.3字符数组的引用

字符数组的引用,也是通过对数组逐个元素引用实现的。

引用数组的元素可以得到一个字符。

【例4.3】应用一维字符数组,输入一个字符串。

程序名为l4_3.cpp。

#include"stdio.h"

main()

{charc[]="Howareyou!

";/*定义一维数组c有13元素*/

inti;

for(i=0;i<13;i++)/*通过循环控制输出数组每个元素*/

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

printf("\n");

}

运行结果:

Howareyou!

4.4.4字符数组的输入输出

通过scanf()或getchar()对字符数组进行赋值,

通过printf()或putchar()对字符数组进行输出,

在利用scanf()和printf()完成输入输出时,%c格式是逐个字符元素进行输入输出,而%s格式是对整个字符串一次完成输入和输出。

用格式说明符%s进行整串输入和输出应注意以下问题:

(1)在scanf中使用格式说明符%s实现整串的输入。

例如:

charc[20];

scanf(“%s”,c);

执行上面的语句,如果输入:

abcd

则这个字符串将从数组c的起始地址(&c[0]或数组名c)开始依次放入数组c中,数组剩余空间补’\0’。

(2)用%s格式符输入字符串时,空格、Tab符和回车符只能作为分隔符而不能输入到数组中。

例如

如果输入字符串为:

Howareyou!

则只有字符串“How”存入到数组中,其余被截掉。

(3)当输入项为数组元素的地址时,输入数据将从这一元素开始存放。

(4)输入字符串时,避免发生越界。

在printf()中使用格式说明符%s可以实现整串的输出。

其调用形式如下:

printf(“%s”,c);

这里,c是存储单元的首地址。

调用这个函数时,将从c地址开始输出存储单元中的字符,直到遇到第一个’\0’为止。

输出结束后不自动换行。

【例4.4】应用一维字符数组,输入一个字符串。

程序名为l4_4.cpp。

#include"stdio.h"

main()

{charc[6];

inti;

for(i=0;i<5;i++)/*利用getchar()给数组c输入字符*/

c[i]=getchar();

c[i]='\0';/*将字符串结束标志'\0'赋值给数组c的c[5]元素*/

printf("%s",c);/*输出字符串*/

}

4.4.5字符串处理函数

C语言编译系统提供了大量处理字符串的库函数

应用字符串输入函数gets()和输出函数puts()时,需要使用#include命令将“stdio.h”头文件包含到源文件中。

其他的字符串处理函数在使用时,需要用#include命令将“string.h”头文件包含到源文件中。

1.字符串输入函数gets()

形式:

gets(字符数组);

作用:

从终端输入一个字符串(包括空格)赋给从字符数组起始的存储单元中,直到读入一个回车符为止。

回车符读入后,不作为字符串的内容,系统将自动用’\0’替换,作为字符串结束的标志。

例如:

charc[20];

gets(c);

执行上面的语句,如果输入:

Howareyou!

则将读入的12个字符依次存入到c[0]开始的存储单元中,并在其后自动加入一个字符串结束标志’\0’。

2.字符串输出函数puts()

形式:

puts(字符数组);

作用:

将字符数组起始地址开始的一个字符串(以’\0’结束的字符序列)输出到终端,并将字符串结束标志’\0’转化成’\n’,自动输出一个换行符。

例如:

charc[]="How\nare\nyou!

";

puts(c);

输出结果:

How

are

you!

3.字符串长度函数strlen()

形式:

strlen(字符数组或字符串);

作用:

测试字符数组起始地址开始的字符串(以’\0’结束的字符序列)有效长度。

函数值为字符数组或字符串的有效字符个数,不包括’\0’在内。

例如:

charc[20]="How\nare\nyou!

";

printf("%d\n",strlen(c));

输出结果:

12

4.字符串连接函数strcat()

形式:

strcat(字符数组1,字符数组2或字符串);

作用:

将字符数组2(字符串)连接到字符数组1的后面,函数值为字符数组1的地址。

例如:

charc1[30]="Howareyou!

\n";

charc1[]="Iamfine!

";

printf("%s",strcat(c1,c2));

输出结果:

Howareyou!

Iamfine!

注意:

(1)连接前字符数组1和字符数组2的尾部都有一个’\0’,连接时将字符数组1后的’\0’自动取消,字符数组2后的’\0’一并连接到字符数组1后。

(2)字符数组1必须有足够长度,以便在其有效字符后能够容纳下字符数组2中的字符串。

5.字符串复制函数strcpy()

形式:

strcyp(字符数组1,字符数组2或字符串);

作用:

将字符数组2(字符串)复制到字符数组1中去。

函数值为字符数组1的起始地址。

例如:

charc1[30],c2="Howareyou!

\n";

printf("%s",strcpy(c1,c2));

输出结果:

Howareyou!

注意:

(1)字符数组1的长度必须大于或等于字符数组2的长度,以便容纳字符数组2中的字符串。

(2)复制时将字符数组2中字符串的结束标志’\0’一起复制到字符数组1中。

(3)strcpy()函数能够实现将字符数组2中前面若干个字符复制到字符数组1中的功能。

例如:

strcpy(c1,c2,4);

该语句的作用是将c2中前面的4字符复制到c1中去,然后系统自动添入一个字符串结束标志’\0’。

6.字符串比较函数strcmp()

形式:

strcmp(字符数组1或字符串1,字符数组2或字符串2);

作用:

将两个字符数组(字符串)自左向右对应的字符逐个进行比较(按ASCII码值大小比较),直到出现不同字符或遇到’\0’字符为止,函数值为一个整型数。

当字符串中的对应字符全部相等且同时遇到’\0’字符时,则两个字符串相等,否则,以第一个不相同的字符的比较结果作为整个字符串的比较结果,比较结果由函数值带回,具体情况见表4-1所示。

表4-1字符串比较strcmp()函数值情况

字符串大小情况

函数值

VisualC++6.0函数值

TC2.0函数值

字符串1等于字符串2

0

0

字符串1大于字符串2

1

首不同字符的ASCII码差值(正整数)

字符串1小于字符串2

-1

首不同字符的ASCII码差值(负整数)

4.5综合实训

【例4.5】输入10位学生的成绩,求出平均分,并输出高于平均分的同学成绩。

程序名为l4_5.cpp。

#include"stdio.h"

main()

{inti;

floatscore[10],aver=0.0;

printf("Pleaseinputscoresof10students:

");

for(i=0;i<10;i++)/*输入10位学生成绩并累加和*/

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

aver+=score[i];

}

aver/=10;/*求出10位学生的平均成绩*/

printf("Theaveragescoreis:

%.2f\n",aver);

printf("Theyare:

");

for(i=0;i<10;i++)/*输出高于平均成绩的学生成绩*/

if(score[i]>aver)

printf("%6.2f",score[i]);

}

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

【例4.6】用冒泡法对10个整型数按升序进行排序。

冒泡法是使较小的值像空气泡一样逐渐“上浮”到数组的顶部,而较大的值逐渐下沉到数组的底部。

具体思路是:

从第一数开始将相邻的两个数比较,较大的数向后移动,较小的数向“上浮”一个,经过一轮的比较,最大的数移动到末尾。

对剩下的数继续下一轮的比较和移动。

如果n个数比较,这样n-1轮后,就完成了排序工作。

例如,对5个数据(9,8,5,3,0)进行排序,排序过程如图4-6所示。

9

8

8

8

8

8

5

5

5

5

3

3

3

0

8

9

5

5

5

5

8

3

3

3

5

0

0

3

5

5

9

3

3

3

3

8

0

0

0

5

5

5

3

3

3

9

0

0

0

0

8

8

8

8

8

8

0

0

0

0

9

9

9

9

9

9

9

9

9

9

程序名为l4_6.cpp。

#include"stdio.h"

main()

{inti,j,t,a[10];

printf("Pleaseinput10numbers:

\n");

for(i=0;i<10;i++)/*输入10个整数存入数组a中*/

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

for(i=0;i<9;i++)/*对数组a中的10个整数排序*/

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

if(a[j]>a[j+1])/*前面的元素大于后面的元素则交换*/

{t=a[j];

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

a[j+1]=t;

}

printf("Thesortednumbersare:

");

for(i=0;i<10;i++)/*输出数组a中的10个元素*/

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

printf("\n");

}

运行时输入:

8967458732104523,则结果如图4-7所示。

【例4.7】用选择法对10个整型数按升序进行排序。

选择法的思路是:

从第一元素开始逐个元素进行比较,并记录下较小元素的下标,经过一轮的比较和记录后,记录的下标为最小元素的下标,将该元素与第一个元素交换。

对剩下的数继续下一轮的比较和记录。

如果n个数比较,这样n-1轮后,就完成了排序工作。

例如,对5个数据(9,4,5,3,0)进行排序,排序过程如图4-8所示。

9

9

9

9

9

0

0

0

0

0

0

0

0

0

4

4

4

4

4

4

4

4

4

3

3

3

3

3

5

5

5

5

5

5

5

5

5

5

5

5

4

4

3

3

3

3

3

3

3

3

3

4

4

4

5

5

0

0

0

0

0

9

9

9

9

9

9

9

9

9

程序名为l4_7.cpp。

#include"stdio.h"

main()

{inti,k,j,t,a[10];

printf("Pleaseinput10numbers:

\n");

for(i=0;i<10;i++)/*输入10个整数存入数组a中*/

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

for(i=0;i<9;i++)/*对数组a中的10个整数排序*/

{k=i;

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

if(a[k]>a[j])

k=j;

t=a[k];/*本轮最小的元素与本轮首的元素交换*/

a[k]=a[i];

a[i]=t;

}

printf("Thesor

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

当前位置:首页 > 初中教育 > 数学

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

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