第七章 数组第一节 一维数组的定义与引用
1.一维数组的定义定义方式:
类型说明符 数组名 [常量表达式 ];
如,int number[10];
/*表示定义一个名为 number的数组,此数组有
10个元素,数据类型为整型 */
说明:
1.数组名的命名与变量命名规则相同如 2,int a=8;
char str[a];
如 1,int a;
char str[a];
2.数组名后面只能用 方括号 括起常量表达式如,int a(0);
3.常量表达式表示元素的个数,即数组的长度。整个数组所占字节数 =类型长度×数组长度
4.常量表达式中不能包括变量,即 C语言不允许定义动态数组
2.一维数组元素的初始化数组的初始化 是指在定义数组时给数组元素赋初值,
C语言中,规定数组元素下标从 0开始
/*说明 a数组由 a[0],a[1],a[2],a[3],a[4]*/
注意,最大下标是 4而不是 5
如,int a[5];
一维数组初始化的一般形式:
类型说明符 数组名 [常量表达式 ]={值 0,值 1,… };
如,int number[4]={1,2,3,4};
int number[4];
number[0]=1;
number[1]=2;
number[2]=3;
number[3]=4;
int number[ ]={1,2,3,4};
对数组初始化的几点说明:
( 1) 可以只给部分数组元素赋初值。
当 { }中值的个数少于数组元素时,则表示初值只赋于数组开始的若干个元素。
余下的元素为相应类型的缺省值如,int data[5]={1,3,5};
/* 表示 data[0]=1,data[1]=3,data[2]=5,
data[3]=0,data[4]=0 */
对数组初始化的几点说明:
( 2) { }中值的个数不能超过数组元素的个数如,int a[5]={1,2,3,4,5,6};
( 3) 只能给数组元素逐个赋值,不能给数组整体赋值如,int b[8]={2,2,2,2,2,2,2,2};
如,int b[8]= 2;
对数组初始化的几点说明:
( 4) 若全部元素均为 0,可对数组不赋初值如,int a[5];
/* 表示 a[0] a[1] a[2] a[3] a[4] 的值都为 0 */
( 5) 在对全部数组 元素赋值的时候,可以不指定数组长度如,a[ ]={1,2,3,4,5,6};
3.一维数组元素的引用数组 元素的表示形式,数组名 [下标 ]
如,a[0]=a[5]+a[7]-a[2*3];
其中,下标可以是整型常量或整型表达式例,数组元素引用
main( )
{
int i,a[10];
for(i=0;i<10;i++)
a[i]=i;
for(i=0;i<10;i++)
printf(“%d”,a[i];
}
/* 主函数 main( ) */
/* 定义了一个整型变量 i,和一个整型数组,数组名为 a */
/* 通过 for循环语句给数组 a中每一个元素赋值 */
/* 通过 for循环语句输出数组
a中所有元素 */
例,数组元素引用
main( )
{
int i,a[10];
for(i=0;i< 10 ;i++)
a[i]=i;
for(i=0;i< 10 ;i++)
printf(“%d”,a[i];
}
i<=10
i<=10
习题例 1,main()
{
int i,a[10];
for(i=0;i<10;i++)
{
a[i]=2*i+1;
printf(“%4d”,a[i]);
}
}
1 3 5 7 9 11 13 15 17 19
习题例 2,main()
{
int i,b[10],a[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<10;i++)
{
b[i]= a[i]* a[i]+1;
printf(“%4d”,b[i]);
}
}
2 5 10 17 26 37 50 65 82 101
习题例 3,main()
{
int i,a[6];
a[0]=1;
for(i=0;i<6;i++)
{
a[i+1]=3*a[i]+5;
printf(“%4d”,a[i]);
}
printf(“\n”);
}
1 8 29 92 281 848
习题分析:什么是 fibonacci数列?
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 6765
+ = 2+ = 3
例 4,用数组来求 fibonacci数列,前 20项第二节 二维数组的定义与引用
1.二维数组的定义定义方式:
类型说明符 数组名 [常量表达式 1][常量表达式 2];
如,int a[5][6];
说明:
1.类型说明符、数组名及常量表达式的命名要求与一维数组规则相同
2.二维数组的理解:可以把二维数组看作是特殊的一维数组:即它的元素又是一个一维数组如,int a[3][4];
int a[0][4],a[1][4],a[2][4];
a数组
a[0]数组,a[0][0] a[0][1] a[0][2] a[0][3]
a[1]数组,a[1][0] a[1][1] a[1][2] a[1][3]
a[2]数组,a[2][0] a[2][1] a[2][2] a[2][3]
说明:
3.二维数组的元素在内存中的存放顺序:按行存放,即先顺序存放第 1行的元素,再存放第 2行的元素(最右边的下标变化最快,第一维的下标变化最慢)
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]
说明:
4.常量表达式 1表示行数,常量表达式 2表示列数。
两个表达式各放在一对 [ ]中如,float a[5,6];
5.二维数组的定义原则可以用于多维(三维、四维 …… )数组的定义如,int a[5][3][6];
2.二维数组的初始化
( 1)按行分段赋值如,int a[3][2]={{1,3},{5,7},{9,11}};
( 2)按行连续赋值如,int a[3][2]={1,3,5,7,9,11};
a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
1 3 5 7 9 11
( 3)可以对数组部分元素赋值如,int a[3][4]={{2},{4},{6}};
a[0][0]
2
a[0][1]
0
a[0][2]
0
a[0][3]
0
a[1][0]
4
a[1][1]
0
a[1][2]
0
a[1][3]
0
a[2][0]
6
a[2][1]
0
a[2][2]
0
a[2][3]
0
2 0 0 0
4 0 0 0
6 0 0 0
二维数组的初始化
( 4)如果对全部元素赋初值,则在定义中可以省略第一维的长度,但 第二维 长度不能省如,int a[2][3]={1,3,5,7,9,8};
int a[ ][3]={1,3,5,7,9,8};
也可以只对部分元素赋初值时省略第一维长度,
但应按行分段赋值如,int a[ ][3]={{1,3,5},{},{9,8}};
1 3 5
7 9 8
1 3 5
0 0 0
9 8 0
二维数组的初始化
2.二维数组元素的引用二维数组 元素的表示形式,
数组名 [下标 1][下标 2]
其中,下标可以是整型常量或整型表达式如,a[3][5];
a[3-1][2*3-4];
a[2][3]= a[3][1]/2+a[4][5];
a[3,5];
a[3-1,2*3-4];
二维数组元素的引用注意点:
( 1) 和一维数组一样,二维数组元素下标值不能超出行或列的范围如,int a[5][3];

a[5][2]=2;
( 2) 注意区分定义 int a[5][3]中的 a[5][3]和引用 a[5][3]的区别
( 3) 注意下标是从 0开始。 a[0][0]表示引用该数组中的一个元素习题例 5,main()
{
int i,a[3][3]={1,2,3,4,5,6,7,8,9};
for(i=0;i<3;i++)
printf(“%d”,a[i][2-i]);
}
1 2 3
4 5 6
7 8 9
3 5 7
习题例 6,main()
{ int i,j,row=0,colum=0,max;
int a[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(max<a[i][j])
{ max=a[i][j];
row=i; colum=j;
}
printf(“max=%d,row=%d,colum=%d”,
max,row,colum); }
max=10,row=2,colum=1
第三节 字符数组和字符串
1.字符数组的定义定义方式:
char 数组名 [常量表达式 ];
如,char c[14];
2.字符数组的初始化方法 1:逐个字符赋给数组中个元素如,char c[9]={?G?,?o?,?o?,?d?,,?i?,?d?,?e?,?a?};
说明,1)如果 { }内的字符个数大于数组长度,则编译将出错;如果 { }内的字符个数小于数组长度,其余元素将自动赋空字符 (‘ \0’ )
如,char c[9]={?G?};
2)如果提供的初值个数与预定的数组长度相同,
在定义时可以省略数组长度,系统会自动根据初值字符个数决定数组大小如,char c[ ]={?G?,?o?,?d?};
方法 2:字符串常量给字符数组初始化如,char c[ ]={“good idea”};
char c[ ]={?G?,?o?,?o?,?d?,,?i?,?d?,?e?,?a?,?\0?};
char c[ ]={?G?,?o?,?o?,?d?,,?i?,?d?,?e?,?a?};
说明,C语言允许在初始化一个一维字符串时,省略字符串常量外面的大括号如,char c[ ]=“GOOG MONING”;
3.字符数组的引用例 1,main()
{
char c[10]={?I?,,? a?,? m?,,?h?,
a?,?p?,?p?,?y?};
int i;
for(i=0;i<10;i++)
printf(“%c”,c[i]);
}
例 2,main()
{
char str[3][5]={{,,?o?},
{,?o?,?o?,?o?},
{?o?,?o?,?o?,?o?,?o?}}
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<5;j++)
printf(“%c”,str[i][j]);
printf(“\n”);
}
}
4.字符数组的输入方法 1:使用格式符,%c”,通过 scanf() 函数,
逐个字符输入如,char c[10];
scanf(“%c”,&c[0]);
方法 2:使用格式符,%s”,通过 scanf() 函数,
将整个字符串一次输入如,char c[10];
scanf(“%s”,c);
从键盘输入,Computer(回车)
方法 3:使用标准的字符串输入函数 gets(),将整个字符串一次输入调用方式,gets(字符数组) ;
如,char name[10];
gets(name);
从键盘输入,Nanjing(回车)
5.字符数组的输出方法 1:使用格式符,%c”,通过 printf( )函数,
引用字符串中的单个字符,逐个字符输出如,char c[10];
printf(“%c”,c[0]);
方法 2:使用格式符,%s”,通过 printf( )函数,
将整个字符串一次输出如,char c[12]=“Success”;
printf(“%s”,c);
方法 3:使用标准的字符串输入函数 puts(),将整个字符串一次输出调用方式,puts(字符数组) ;
如,char name[10]=,Nanjing”;
puts(name);
6.字符串常用函数
C语言的库函数中提供了丰富的字符串处理函数,除了上面介绍的输入输出函数 gets()、
puts()函数外,还有一些其他专门进行字符串处理的函数,这些函数储存在文件
,string.h”。 因此,若使用它们,应在程序之前加写以下编译预处理语句:
#include<string.h>
下面介绍几种常用的字符处理函数字符串复制函数
strcpy(字符数组 1,字符串 2) /*string copy*/
如,char c1[10],c2[]=,School”;
strcpy(c1,c2);
如,char c1[10];
strcpy(c1,”China”);
如,char c1[10],c2[]=,School”;
c1={“School”};
c1=c2;
字符串连接函数
strcat(字符数组 1,字符数组 2) /*string catenate*/
如,char str1[20]=“Believe it,;
char c2[]=,or not”;
printf(“%s”,strcat(str1,str2));
字符串比较函数
strcmp(字符串 1,字符串 2) /*string compare*/
如,strcmp(“Beijing”,“BeijingChina”);
比较规则,按 ASCⅡ 码值大小比较若字符串 1==字符串 2,则函数返回值为 0;
若字符串 1<字符串 2,则函数返回一个负数 ;
若字符串 1>字符串 2,则函数返回一个正数 ;
如,if(s1==s2) printf(“yes”);
if(strcmp(s1,s2)==0) printf(“yes”);
字符串长度测试函数
strlen(字符串 ) /*string length*/
如,char c[10]=“program”;
printf(“%d”,strlen(c));
如,strlen(“How are you?”);
字符串大小写转换函数
(1)strlwr(字符串 ) /*string lowercase*/
(2) strupr(字符串 ) /*string uppercase*/
习题例 7,main()
{
char a[2];
scanf(“%s”,a);
printf(“%c,%c”,a[0],a[1]);
}
运行时输入,ab a,b
习题例 8,main()
{
char c1[60],c2[30];
int i=0,j=0;
scanf(“%s”,c1);
scanf(“%s”,c2);
while(c1[i]!=?\0?) i++;
while(c2[j]!=?\0?) c1[i++]=c2[j++];
c1[i]=?\0?;
printf(“\n%s”,c1);
}
运行时输入,Country
Side
CountrySide
例 9,int a[9]={1,2,3,4,5,6,7,8,9}
要求打印出,2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 9
习题例 10,螺旋方阵 6× 6
习题
1 2 3 4 5 6
7
8
9
10
1116 15 14 13 12
20
19
18
17
21 22 26 24
25
26
2730 31 32
32
31
33 34
36 35
习题例 11,打印杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
… …