C语言程序设计教程第五章数组Word文档格式.docx

上传人:b****6 文档编号:21584589 上传时间:2023-01-31 格式:DOCX 页数:20 大小:73.55KB
下载 相关 举报
C语言程序设计教程第五章数组Word文档格式.docx_第1页
第1页 / 共20页
C语言程序设计教程第五章数组Word文档格式.docx_第2页
第2页 / 共20页
C语言程序设计教程第五章数组Word文档格式.docx_第3页
第3页 / 共20页
C语言程序设计教程第五章数组Word文档格式.docx_第4页
第4页 / 共20页
C语言程序设计教程第五章数组Word文档格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

C语言程序设计教程第五章数组Word文档格式.docx

《C语言程序设计教程第五章数组Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言程序设计教程第五章数组Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。

C语言程序设计教程第五章数组Word文档格式.docx

因为,在编译时,C编译器根据已知数组大小分配内存。

在定义数组时对各元素指定初始值,称为数组的初始化。

1、一般初始化

用花括号把要赋给各元素的初始值括起来,数据间用逗号分隔。

staticinta[9]={1,2,3,4,5,6,7,8,9};

a[0]=1,a[1]=2,a[2]=3,……a[8]=9

2、部分元素初始化

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

只对前5个元素赋初值,后5个元素未指定初值,系统默认为0。

3、全部元素均初始化为0,不允许简写。

staticinta[10]={0,0,0,0,0,0,0,0,0,0};

不能简写为:

staticinta[10]={0*10};

当程序不给数组指定初始值时,编译器作如下处理:

(1)编译器自动把静态数组的各元素初始化为0或空字符。

(2)编译器不为动态数组自动指定初始值,其初值不可预料。

4、如果全部元素均指定初值,定义中可以省略元素的个数。

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

可写成:

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

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

引用形式:

数组名[下标]

使数组元素a[0]~a[9]的值为0~9,然后逆序输出。

main()

{inti,a[10];

for(i=0;

i<

=9;

i++)

 

a[i]=i;

for(i=9;

i>

=0;

i--)

printf("

%d"

a[i]);

}

运行输出:

9876543210

⑴下标可用整常数或整型表达式,其起始值为0。

⑵在引用时应注意下标的值不要超过数组的范围。

C编译不检查下标是否超界,即不指出“下标超界”的错误。

1、数组元素用作函数实参,其用法与普通变量完全相同:

在发生函数调用时,把数组元素的值传送给形参,实现单向值传送。

写一函数,统计字符串中字母的个数。

/*功能:

数组元素作为函数实参*/

intisalp(charc)

{if(c>

='

a'

&

c<

z'

||c>

A'

Z'

return

(1);

elsereturn(0);

}

{inti,num=0;

charstr[255];

printf("

Inputastring:

"

);

gets(str);

/*从标准设备读入字符串,并放入str指向的数组*/

for(i=0;

str[i]!

\0'

;

if(isalp(str[i]))num++;

puts(str);

/*把str指向的字符串输出到标准设备*/

num=%d\n"

num);

getch();

/*从标准输入设备读入下一个字符*/

}

说明:

用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。

换句话说,对数组元素的处理是按普通变量对待的。

2、数组名作函数参数时,既可以作形参,也可以作实参。

数组名作函数参数时,要求形参和相对应的实参都必须是类型相同的数组(或指向数组的指针变量),都必须有明确的数组说明

已知某个学生5门课程的成绩,求平均成绩。

floataver(floata[])/*求平均值函数*/

{inti;

floatav,s=a[0];

for(i=1;

5;

i++)s+=a[i];

av=s/5;

returnav;

{floatsco[5],av;

inti;

\ninput5scores:

\n"

);

for(i=0;

i++)scanf("

%f"

sco[i]);

av=aver(sco);

/*调用函数,实参为数组名*/

averagescoreis%5.2f\n"

av);

⑴组名作函数参数,应该在调用函数和被调用函数中分别定义数组,且数据类型必须一致,否则结果将出错。

⑵C编译系统对形参数组长度不作检查,所以形参数组可以不指定长度。

例如,本例中的形参数组a[]。

⑶如果指定形参数组的长度,则实参数组的长度必须大于等于形参数组,否则因形参数组的部分元素没有确定值而导致计算结果错误。

⑷以数组名作参数时,采取的不是“值传送”方式,而是“地址传送”方式,即把实参数组的起始地址传给形参数组,这样形参数组就和实参数组共占一段内存单元。

如上例可表示为:

a[0]

a[1]

a[2]

a[3]

a[4]

78

Sco[0]

Sco[1]

Sco[2]

Sco[3]

Sco[4]

75

86

95

68

输入10个数,用“起泡法”对10个数排序(由小到大)。

“起泡法”算法:

以六个数9、8、5、4、2、0为例。

第1趟比较

第2趟比较

算法过程:

第1趟比较后,剩5个数未排好序;

两两比较5次

第2趟比较后,剩4个数未排好序;

两两比较4次

第3趟比较后,剩3个数未排好序;

两两比较3次

第4趟比较后,剩2个数未排好序;

两两比较2次

第5趟比较后,全部排好序;

两两比较1次

算法结论:

对于n个数的排序,需进行n-1趟比较,第j趟比较需进行n-j次两两比较。

程序流程图:

(用两层嵌套循环实现)

程序:

设需排序的数有10个,定义数组大小为11,使用a[1]~a[10]存放10个数,a[0]不用。

{inta[11];

/*用a[1]~a[10],a[0]不用*/

inti,j,t;

/*i,j作循环变量,t作两两比较的临时变量*/

input10numbers:

for(i=1;

11;

scanf("

a[i]);

/*输入10个整数*/

for(j=1;

j<

j++)/*第j趟比较*/

for(i=1;

=10-j;

i++)/*第j趟中两两比较10-j次*/

if(a[i]>

a[i+1])/*交换大小*/

{t=a[i];

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

a[i+1]=t;

thesortednumbers:

如果一维数组的每一个元素是类型相同的一维数组时,就形成了二维数组。

二维数组是有二个下标变量的数组。

第一个下标称为行下标,第二个下标称为列下标,因此,二维数组可看成是一个二维表。

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

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

二维数组的理解:

a[3][4]

二维数组a[3][4]理解为:

有三个元素a[0]、a[1]、a[2],每一个元素是一个包含4个元素的数组。

二维数组的元素在内存中的存放循序:

按行存放。

即:

先顺序存放第一行的元素,再存放第二行的元素。

二维数组的元素a[i][j]在数组中的位置计算公式:

设有一个m×

n的二维数组,元素a[i][j]在数组中的位置计算公式为:

n+j+1

多维数组是有多个下标变量的数组。

多维数组的一般定义形式为:

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

三维数组:

floata[2][3][4]在内存中的存放顺序:

a[0][0][0]→a[0][0][1]→a[0][0][2]→a[0][0][3]→

a[0][1][0]→a[0][1][1]→a[0][1][2]→a[0][1][3]→

a[0][2][0]→a[0][2][1]→a[0][2][2]→a[0][2][3]→

a[1][0][0]→a[1][0][1]→a[1][0][2]→a[1][0][3]→

a[1][1][0]→a[1][1][1]→a[1][1][2]→a[1][1][3]→

a[1][2][0]→a[1][2][1]→a[1][2][2]→a[1][2][3]

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

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

floata[2][3];

有6个元素,按如下方式引用各元素:

a[0][0]、a[0][1]、a[0][2]、a[1][0]、a[1][1]、a[1][2]

数组floata[2][3]中无元素a[2][3]。

(下标从0始)

㈠二维数组的初始化

1、分行对各元素赋值,如:

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

2、全部数据写在一个花括号内,如:

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

3、只对部分元素赋值。

staticinta[3][4]={{1},{5},{9}};

仅对a[0][0]、a[1][0]、a[2][0]赋值,其余元素未赋值(对于静态数组,未赋值元素指定初值0;

对于动态数组,未赋值元素的初值是随机的)。

4、如果对全部元素赋初值,则第一维的长度可以不指定,但必须指定第二维的长度。

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

与下面定义等价:

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

㈡多维数组的初始化

 与二维数的初始化相似。

【例1】:

将一个二维数组行和列交换,存到另一个二维数组中。

算法:

b[j][i]=a[i][j]

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

staticintb[3][2],i,j;

arraya:

for(i=0;

=1;

i++)/*0~1行*/

{for(j=0;

=2;

j++)/*0~2列*/

{printf("

%5d"

a[i][j]);

b[j][i]=a[i][j];

/*行、列交换*/

 

/*输出一行后换行*/

arrayb:

for(j=0;

j++)

b[i][j]);

【例2】:

有一个3×

4的矩阵,编程序求出其中值最大的那个元素的值及其所在的行号和列号。

⑴把第一个元素a[0][0]作为临时最大值max;

⑵把临时最大值max与每一个元素a[i][j]进行比较,若a[i][j]>

max,把a[i][j]作为新的临时最大值,并记录下其下标i和j。

当全部元素比较完后,max是整个矩阵全部元素的最大值。

流程:

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

staticinta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};

max=a[0][0];

i<

i++)/*用两重循环遍历全部元素*/

j<

=3;

j++)

if(a[i][j]>

max)

{max=a[i][j];

row=i;

colum=j;

max=%d,row=%d,colum=%d\n"

max,row,colum);

本例中得到的行列值从0始。

字符数组:

存放字符数据的数组。

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

字符串是指若干有效字符(指系统允许使用的字符)的序列。

C语言允许的字符串可包括字母、数字、专用字符、转字符等。

它用双引号括起来。

C语言中没有字符串变量。

字符串存放在一个字符型数组中。

将字符串“computer”存入字符数组str中。

定义字符数组:

Charstr[8];

采用赋值运算,将字符一个一个地赋给字符数组各元素:

Str[0]=’c’;

Str[1]=’o’;

Str[2]=’m’;

….

…Str[7]=’r’;

str[8]=’\0’;

存储字符串示意图:

Str[0]Str[1]Str[2]………Str[7]Str[8]

c

o

m

p

u

t

e

R

\0

C语言规定:

以“\0”字符作为字符串结束标志。

“\0”是指ASCII为0的字符,它不是一个普通的可显示字符,而是一个“空操作”字符,它不进行任何操作,只是作为一个标志。

1、逐个为数组元素指定初值

staticcharc[10]={'

I'

'

'

m'

'

h'

p'

'

y'

};

2、初始化数据少于数组长度,多余元素自动为“空”。

c'

r'

o'

g'

3、指定初值时,若未指定数组长度,则长度等于初值个数。

staticcharc[]={'

4、对字符数组指定一个字符串初值

如:

staticcharc[]={“Iamhappy”}

字符数组的元素个数应该足够大,能容纳所存的字符和“\0”。

5.3.3字符数组的引用

引用一个元素,得到一个字符。

输出一个字符串。

{staticcharc[10]={'

b'

inti;

10;

%c"

c[i]);

输出结果:

Iamaboy

5.3.4字符串的输入\输出两种方法:

1、用“%c”格式符逐个输入输出。

2、用“%s”格式符按字符串输入输出。

staticcharc[6];

%s"

c);

(1)输入时,遇回车键结束,但获得的字符中不包含回车键本身,而是在字符串末尾添'

因此,定义的字符数组必须有足够的长度,以容纳所输入的字符。

(如,输入5个字符,定义的字符数组至少应有6个元素)。

(2)一个scanf函数输入多个字符串,输入时以“空格”键作为字符串间的分隔。

staticcharstr1[5],str2[5],str3[5];

%s%s%s"

str1,str2,str3);

输入数据:

Howareyou?

str1、str2、str3获得的数据见下图:

staticcharstr[13];

str);

输入:

结果:

仅“How”被输入数组str

如要想str获得全部输入(包含空格及其以后的字符),程序应设计为:

staticcharc[13];

13;

i++)c[i]=getchar();

(3)C语言中,数组名代表该数组的起始地址,因此,scanf()函数中不需要地址运算符&

(在TurboC中,加上&

运算符也可以)。

str);

/*错误*/

(4)gets()函数:

输入字符串到数组。

staticcharstr[12];

gets(str);

gets()一次只能输入一个字符串。

而scanf()可以输入几个字符串。

(5)输出时,遇'

结束,且输出字符中不包含'

(6)“%s”格式输出字符串时,printf()函数的输出项是字符数组名,而不是数组元素名。

【例】:

staticcharc[6]="

China"

c[0]);

(7)“%s”格式输出时,即使数组长度大于字符串长度,遇'

也结束。

staticcharc[10]={"

/*只输出5个字符*/

(8)“%s”格式输出时,若数组中包含一个以上'

,遇第一个'

时结束。

(9)puts()函数:

输出字符串(以'

结尾)。

puts()一次只能输出一个字符串。

而printf()可以输入输出几个字符串。

staticcharc[6]="

/*printf、puts均以'

结尾*/

%s\n"

/*printf需要格式控制符%s*/

puts(c);

/*puts不需要格式控制符,且自动换行*/

5.3.5字符串运算函数

1、strcat():

连接字符串。

格式:

strcat(字符串1,字符串2);

把“字符串2”连接到“字符串1”的后面。

2、strcpy():

字符串拷贝。

strcpy(字符串1,字符串2);

把“字符串2”的值拷贝到“字符串1”中。

3、strcmp():

字符串比较。

intstrcmp(字符串1,字符串2);

比较规则:

逐个字符比较ASCII码,直到遇到不同字符或'

,比较结果是该函数的返回值。

strcmp()返回值

字符串1<

字符串2

<

字符串1==字符串2

=0

字符串2>

>

长度不同的字符串也可以进行比较,比较结果当然是“不同”。

字符串只能用strcmp函数比较,不能用关系运算符“==”比较。

if(strcmp(str1,str2)==0)printf("

yes"

if(!

strcmp(str1,str2))printf("

equal"

if(str1==str2)printf("

4、trlen():

测试字符串长度函数

strlen(字符串);

strlen(“computer”)结果:

8

5、strlwr():

将字符串中的大写字母转换为小写字母(lwr:

lowercase小写)。

6、strupr():

将字符串中的小写字母转换为大写字母(upr:

uppercase大写)。

以上函数均是库函数,使用时必须用#include语句包含头文件。

二维数组可认为是由若干个一维数组所组成的,也知道一个一维数组可存放一个字符串,因此,一个N×

M的二维数组可存放N个最大长度为M-1的字符串。

其中要留一个位置存放“\0”。

staticcharstr[3][6]={“China”,“Japan”,“Korea”}

存放在str中的字符串示意图:

C

h

I

n

a

J

K

r

Str[0]

Str[1]

Str[2]

二维字符数组元素的引用与二维数组的引用相同。

一个班级中有若干名学生。

今输入一个学生名,要求查询该学生是否属于该班,输出相应的信息。

[程序]:

#defineMAX3

#defineLEN10

{intI,flag=0;

charname[LEN];

staticcharlist[MAX][LEN]={“Zhang”,“Wang”,“Li”};

printf(“Enteryourname:

”);

gets(name);

for(I=0,I<

MAX;

I++)

if(strcmp(list[I],name)==0)flag=1;

if(flag==1)

printf(“%sisinourclass\n”,name);

else

printf(“%sisnotinourclass\

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

当前位置:首页 > 解决方案 > 学习计划

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

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