C语言程序设计教程第五章数组Word文档格式.docx
- 文档编号:21584589
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:20
- 大小:73.55KB
C语言程序设计教程第五章数组Word文档格式.docx
《C语言程序设计教程第五章数组Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言程序设计教程第五章数组Word文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
因为,在编译时,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]在数组中的位置计算公式为:
i×
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\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 教程 第五 数组
![提示](https://static.bdocx.com/images/bang_tan.gif)