计算机二级C语言 第六章 数组.docx
- 文档编号:8534473
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:17
- 大小:23.93KB
计算机二级C语言 第六章 数组.docx
《计算机二级C语言 第六章 数组.docx》由会员分享,可在线阅读,更多相关《计算机二级C语言 第六章 数组.docx(17页珍藏版)》请在冰豆网上搜索。
计算机二级C语言第六章数组
第六章数组
【本章要求】
1、对一维数组和二维数组中元素的操作。
2、利用循环来控制数组元素,特别是利用循环的嵌套来操作二维数组中的元素。
3、对字符数组的灵活应用。
4、字符串与字符数组的联系与区别。
5、常见的字符串处理函数。
数组是一种最简单实用的数据结构。
所谓数据结构,就是将多个变量(数据)人为地组成一定的结构,以便于处理大批量、相对有一定内在联系的数据。
在C语言中,为了确定各数据与数组中每一单元的一一对应关系,必须给数组中的这些数编号,即顺序号。
将一组排列有序的、个数有限的变量作为一个整体,用一个统一的名字来表示,则这些有序变量的全体称为数组。
数组是用一个名字代表顺序排列的一组数,顺序号就是下标变量的值。
而简单变量是没有序的,数组中的单元是有排列顺序的。
有序性和无序性就是下标变量和简单变量之间的主要区别。
6.1一维数组
6.1.1一维数组的定义、引用和初始化
一、一维数组的定义
一维数组的定义方式为:
类型说明符数组名[常量表达式];
其中:
类型说明符是任一种基本数据类型或构造数据类型。
数组名是用户定义的数组标识符。
方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
例如:
inta[10];说明整型数组a,有10个元素。
floatb[10],c[20];说明实型数组b,有10个元素,实型数组c,有20个元素。
charch[20];说明字符数组ch,有20个元素。
【说明】
1、数组的类型实际上是指数组元素的取值类型。
对于同一个数组,其所有元素的数据类型都是相同的。
2、数组名定名规则和变量名相同,遵循标识符定名规则。
3、数组名后是用方括弧括起来的常量表达式,不能用圆括弧。
4、常量表达式表示元素的个数,即数组长度。
注意下标是从0开始的。
5、常量表达式中可以包括常量和符号常量,不能包含变量。
6、数组名的书写规则应符合标识符的书写规定。
7、数组名不能与其它变量名相同。
二、一维数组引用
数组必须先定义,然后再使用。
C语言规定只能逐个引用数组元素而不能一次引用整个数组。
数组元素的表达形式为:
数组名[下标]
下标可以是整型常量或整型表达式。
【例6.1】数组元素的引用。
#include"stdio.h"
main()
{inti,a[10];
for(i=0;i<9;i++)
a[i]=i;
for(i=9;i>0;i--)
printf("%d",a[i]);
运行结果如下:
9876543210
三、一维数组初始化
对数组元素的初始化可以用以下方法实现:
1、定义数组时对数组元素赋初值。
inta[10]={0,1,2,3,4,5,6,7,8,9};
2、可以只给一部分元素赋值。
inta[10]={0,1,2,3,4};
3、如想使一个数组中全部元素值为0,可以写成
inta[10]={0,0,0,0,0,0,0,0,0,0};
4、在对全部数组元素赋初值时,可以不指定数组长度。
inta[5]={1,2,3,4,5};
可以写成:
inta[]={1,2,3,4,5};
6.1.2一维数组应用举例
【例6.2】用数组来处理求Fibonacci数列问题
#include"stdio.h"
main()
{inti;
intf[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{
if(i%5==0)printf("\n");
printf("%12d",f[i]);
}
}
【运行结果】
11235
813213455
89144233377610
9871597258441816765
【说明】if语句用来控制换行,每行输出5个数据。
【例6.3】用起泡法对10个数排序(由小到大)。
起泡法的思路是:
将相邻两个数比较,将小的调到前头。
#include"stdio.h"
main()
{inta[11];
inti,j,t;
printf("input10unmbers:
\n");
for(i=1;i<11;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=1;j<=9;j++)
for(i=j;i<=10-j;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("thesortednumbers:
\n");
for(i=1;i<11;i++)
printf("%d",a[i]);
}
【运行结果】
input10numbers:
l0481265-76100-45123
thesortednumbers:
-76-4501481265100123
【例6.4】输入10个数,求出其中的最大数。
#include"stdio.h"
main()
{
inti,max,a[10];
printf("input10numbers:
\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
max=a[0];
for(i=1;i<10;i++)
if(a[i]>max)max=a[i];
printf("max=%d\n",max);
}
【运行结果】
input10numbers:
l0481265-76100-45123
max=123
6.2二维数组
6.2.1二维数组的定义
一、二维数组的定义
二维数组定义的一般形式为
类型说明符数组名[常量表达式][常量表达式];
其中常量表达式1表示第一维下标的长度,常量表达式2表示第二维下标的长度。
例如:
inta[3][4];
说明了一个三行四列的数组,数组名为a,其下标变量的类型为整型。
该数组的下标变量共有3×4个,即:
a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]
不能写成:
inta[3,4];
C语言中,二维数组中元素排列的顺序是:
按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。
C允许使用多维数组。
多维数组元素在内存中的排列顺序:
第一维的下标变化最慢,最右边的下标变化最快。
二、二维数组的引用
二维数组的元素的表达形式为
数组名[下标][下标]
例如:
a[2][3];
下标可以是整型表达式,如:
a[2-1][2*2-1]。
数组元素可以出现在表达式中,也可以被赋值,例如:
b[1][2]=a[2][3]/2
在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。
例如:
inta[3][4];
它定义了一个3×4的数组,它可用的行下标值最大为2,列坐标值最大为3。
【例6.5】一个学习小组有5个人,每个人有三门课的考试成绩。
求全组分科的平均成绩和各科总平均成绩。
张
王
李
赵
周
Math
80
61
59
85
76
C
75
65
63
87
77
Foxpro
92
71
70
90
85
可设一个二维数组a[5][3]存放五个人三门课的成绩。
再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average为全组各科总平均成绩。
编程如下:
#include"stdio.h"
main()
{
inti,j,s=0,average,v[3],a[5][3];
printf("inputscore\n");
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
{scanf("%d",&a[j][i]);
s=s+a[j][i];}
v[i]=s/5;
s=0;
}
average=(v[0]+v[1]+v[2])/3;
printf("math:
%d\nclanguag:
%d\ndbase:
%d\n",v[0],v[1],v[2]);
printf("total:
%d\n",average);
}
三、二维数组的初始化
可以用下面的方法对二维数组初始化:
1、分行给二维数组赋初值。
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
2、可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值。
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
3、可以对部分元素赋初值。
inta[3][4]={{1},{5},{9}};
也可以是对各行中的某一元素赋初值:
inta[3][4]={{1},{0,6},{0,0,11}};
4、如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等同于:
inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
在定义时也可以只对部分元素赋初值而省略第一维的长度,但因应分行赋初值。
如:
inta[][4]={{0,0,3},{},{0,10}};
6.2.2二维数组程序举例
【例6.6】将一个二维数组行和列元素互换,存放另一个二维数组中。
#include"stdio.h"
main()
{
inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2],i,j;
printf("arraya:
\n");
for(i=0;i<=1;i++)
{for(j=0;j<=2;j++)
{printf("%5d",a[i][j]);
b[j][i]=a[i][j];
}
printf("\n");
}
printf("arrayb:
\n");
for(i=0;i<=2;i++)
{for(j=0;j<=1;j++)
printf("%5d",b[i][j]);
printf("\n");
}
}
【运行结果】
arraya:
l23
456
arrayb:
14
25
36
【例6.7】有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号。
#include"stdio.h"
main()
{inti,j,row=0,colum=0,max;
inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max=a[0][0];
for(i=0;i<=2;i++)
for(j=0;j<=3;j++)
if(a[i][j]>max)
{max=a[i][j];
row=i;
co1um=j;}
printf("max=%d,row=%d,colum=%d\n",max,row,co1um);
}
6.3字符数组
用来存放字符量的数组是字符数组。
字符数组中的一个元素存放一个字符。
6.3.1字符数组的定义
char字符数组名[常量表达式]
例如:
charc[l0];
c[0]='I';c[1]='';c[2]='a';c[3]='m';c[4]='';c[5]='a';c[6]='';
c[7]='b';c[8]='o';c[9]='y';
定义c为字符数组,包含10个元素。
6.3.2字符数组的初始化
对字符初始化,最容易理解的方式是逐个字符赋给数组中各元素。
如:
chara[l0]={'c','','p','r','o','g','r','a','m'};
把10个字符分别赋给c[0]到c[9]10个元素。
如果花括弧中提供的初值个数(即字符个数)大于数组的定义长度,则按语法错误处理。
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即’\0’)。
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。
如:
chara[]={'c','','p','r','o','g','r','a','m'};
数组c的长度自动定为9。
也可以定义和初始化—个二维字符数组,如:
chardiamond[5][5]={{'','','*'},{'','*','','*'},
{'*','','','','*'},{'','*','','*'},{'','','*'}};
用它代表一个钻石形的平面图形。
6.3.3字符数组的引用
可以引用字符数组中的—个元素,得到一个字符。
【例6.6】输出一个字符串。
#include"stdio.h"
main()
{chara[l0]={'c','','p','r','o','g','r','a','m'};
inti;
for(i=0;i printf("%c",a[i]); printf("\n"); } 【运行结果】 cprogram 【例6.7】输出一个钻石图形。 #include"stdio.h" main() {chardiamond[5][5]={{'','','*'},{'','*','','*'}, {'*','','','','*'},{'','*','','*'},{'','','*'}}; inti,j; for(i=0;i<5;i++) {for(j=0;j<5;j++) printf("%c",diamond[i][j]); printf("\n"); } } 【运行结果】 * ** ** ** * 6.3.4字符串和字符串结束标志 在C语言中没有专门的字符串变量,通常将字符串作为字符数组来处理的。 字符串的实际长度与数组长度相等。 字符串总是以'\0'作为串的结束符。 因此当把一个字符串存入一个数组时,也把结束符'\0'存入数组,并以此作为该字符串是否结束的标志。 也就是说,在遇到字符'\0'时,表示字符串结束,由它前面的字符组成字符串。 在程序中往往依靠检测'\0'的位置来判定字符串是否结束。 而不是根据数组的长度来决定字符串长度C语言允许用字符串的方式对数组作初始化赋值。 注意: '\0'代表ASCII码为0的字符,从ASCII码表中可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做。 用它来作为字符串结束标志不会产生附加的操作或增加有效字符,只起—个供辨别的标志。 C语言处理字符串,可以用字符串常量来使字符数组初始化。 例如: charc[]={"Iamhappy"}; 也可以省略花括弧,直接写成 charc[]="Iamhappy"; 不是用单个字符作为初值,而是用一个字符串(注意字符串的两端是用双引号而不是单引号括起来的)作为初值。 数组c的,长度不是10,而是11,这点务请注意。 因为字符串常量的最后由系统加上—个'\0'。 6.3.5字符数组的输入输出 字符数组的输入输出可以有两种方法: 1、逐个字符输入输出。 用格式符“%c”输入或输出一个字符。 2、将整个字符串一次输入或输出。 用“%s”格式符,意思是输出字符串(String)。 例如: charc[]={"China"}; printf("%s",c); 【说明】 1、输出字符不包括结束符'\0'。 2、用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。 下面是错误的: printf("%s",c[0]); 3、如果数组长度大于字符串实际长度,也只输出到遇'\0'结束。 如: charc[10]={"China"}; printf("%s",c); 只输出“China"5个字符,而不是输出10个字符。 4、如果一个字符数组中包含一个以上'\0',则遇第一个'\0'时输出就结束。 可以用scanf函数输入一个字符串。 scanf("%s",c); scanf函数中的输入项c是字符数组名,它应该在先前已被定义。 从键盘输入的字符串应短于已定义的字符数组的长度。 例如,已定义 charc[6]; 从键盘输入: China 系统自动在后面加—个'\0'结束符。 如果利用—个scanf函数输入多个字符串,则以空格分隔。 例如: charstrl[5],str2[5],str3[5]; scanf("%s%s%s",strl,slr2,str3); 输人数据: Howareyou? 则可以将“How”输入给str1,“are”输入给str2,“you? ”输入给str3。 若改为 charstr[13]; scanf("%s",str); 如果输入以下12个字符 Howareyou? 实际上并不是把这12个字符加上'\0'送到数组str中,而只将空格前的字符“How”送到str中,由于把“How”作为一个字符串处理,因此在其后加‘\0’。 需要注意: scanf函数中的输入项是字符数组名。 输入项为字符数组名时,不要再加地址符“&”,因为在C语言中数组名代表该数组的起始地址。 下面写法不对: scanf("%s",&str); 6.3.6字符串处理函数 一、字符串输出函数puts 【格式】puts(字符数组) 【作用】将一个字符串(以'\0'结束的字符序列)输出到终端。 puts(str); 其结果是在终端上输出str。 二、字符串输入函数gets 【格式】gets(字符数组) 【作用】从终端输入一个字符串到字符数组,并且得到一个函数值。 该函数值是字符数组的起始地址。 gets(str) 其结果是从终端输入一个字符串给str。 三、字符串连接函数strcat 【格式】strcat(字符数组1,字符数组2) 【作用】连接两个字符数组中的字符串,把字符串2接到字符串1的后面,结果放在字符数组1中,函数调用后得到一个函数值——字符数组1的地址。 例如: charstrl[30]={"People'sRepublicof"}; charstr2[]={"China"}; printf("%s",strcat(strl,str2)); 输出: People’sRepublicofChina 【说明】 1、字符数组1必须足够大,以便容纳连接后的新字符串。 2、连接前两个字符串的后面都有一个'\0',连接时将字符串1后面的'\0'取消,只在新串最后保留—个'\0'。 四、字符串复制函数strcpy和strncpy 【格式】strcpy(字符数组1,字符串2) 【作用】将字符串2复制到字符数组1中去。 charstrl[10],str2[]={"China"}; strcpy(strl,str2); 【说明】 1、字符数组1必须定义得足够大,以便容纳被复制的字符串。 字符数组1的长度不应小于字符串2的长度。 2、“字符数组1”必须写成数组名形式,“字符串2”可以是字符数组名,也可以是一个字符串常量。 strcpy(strl,"China"); 3、复制时连同字符串后面的'\0'一起复制到字符数组l中。 4、不能用赋值语句将—个字符串常量或字符数组直接给一个字符数组。 如下面两行都是不合法的: strl={"China"}; strl=str2; 而只能用strcpy函数处理。 用赋值语句只能将一个字符赋给一个字符型变量或字符数组元素。 5、可以用strncpy串数将字符串2中前面若干个字符复制到字符数组1中去。 strncpy(str1,str2,2); 作用是将str2中前面2个字符复制到strl中去,然后再加一个'\0'。 五、字符串比较函数strcmp 【格式】strcmp(字符串1,字符串2) 【作用】比较字符串1和字符串2。 例如: strcmp(strl,str2); strcmp("China","Korea"); strcmp(strl,"Beijing"); 字符串比较的规则与其他语言中的规则相同,即对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止。 如果参加比较的两个字符串都由英文字母组成,则有一个简单的规律;在英文字典中位置在后面的为“大”。 但应注意小写字母比大写字母“大”。 比较的结果由函数值带回。 1、如果字符串1=字符串2,函数值为0。 2、如果字符串1>字符串2,函数值为一正整数。 3、如果字符串1<字符串2,函数值为一负整数。 【注意】对两个字符串比较,不能用以下形式: if(strl==str2)printf("yes"); 而只能用 if(strcmp(strl,str2)==0)printf("yes"); 六、测试字符串长度函数strlen 【格式】strlen(字符数组) 【作用】测试字符串长度的函数。 函数的值为字符串中的实际长度,不包括'\0'在内。 例如: charstr[l0]={"China"}; printf("%d",strlen(str)); 输出结果不是10,也不是6,而是5。 也可以直接测字符串常量的长度,如 strlen("China"); 其结果为5。 6.3.7字符数组应用举例 【例6.8】输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。 #include main() {charstring[81]; inti,num=0,word=0; charc; gets(string); for(i=0;(c=string[i])! ='\0';i++) if(c=='')word=0; elseif(word==0) {word=1; num++;} printf("Thereare%dwordsintheline.\n",num) } 【例6.9】有3个字符串,要求找出其中最大者。 #include main() {charst
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机二级C语言 第六章 数组 计算机 二级 语言 第六