例:一个专业当中同学分为不同的班级,引进二维数组
一、二维数组
(一)二维数组的定义
1.定义方式:
数据类型数组名[常量表达式][常量表达式];
其中,第一个常量表达式代表数组的行数,第二个表达式代表数组的列数,元素个数=行数*列数
注意:第一个常量表达式可以为空,但第二个常量表达式不能为空。
例:int a[3][4]; /*表示整型二维数组,有3行4 列*/ 该数组下标共有3×4个,即:
a[0] |
|
|
|
|
a[1] |
|
|
|
|
a[2] | a[2][0] | a[2][1] | a[2][2] | a[2][3] |
说明:在声明二维数组int[3][4]以后,可以把二维数组a认为含有3个元素的一维数组,这3个元素就是a[0],a[1],a[2],每一个元素就相当于一行,每一个元素又是含有4个元素的一维数组。
存储方式:在C语言中,二维数组是按行序优先存放的,先存放a[0]行元素,再存放a[1]行元素,最后存放a[2]行元素。
(二)二维数组元素的引用
形式:数组名[下标][下标]
其中,第一个下标为行下标,第二个下标为列下标。
例:引用第2行第3列的数组,即a[1][2](数组的行列下标从0开始)注意:在二维数组中,不能整体引用整个数组,只能对单个元素进行操作。
main()
{
inta[2][3],i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
/*引用二维数组的行*/
/*引用二维数组的列*/
scanf("%d",&a[i][j]);
for(i=0;i<2;i++)
{
for(j=0;j<3;j++) /*加上{},实现每输出一行就换行的操作*/
printf("\n"); }
}
(三)二维数组元素的初始化
| 分行初始化 | 按元素排列顺序初始化 |
全部初始化 | int a[2][3]={{1,2,3},{4,5,6}}; | int a[2][3]={1,2,3,4,5,6}; |
部分初始化 | int a[2][3]={{1,2},{4}}; | int a[2][3]={1,2,4}; |
第一维长度省略初始化 | int a[][3]={{1},{4,5}}; | int a[][3]={1,2,3,4,5}; |
(四)二维数组举例
将一个二维数组行和列的元素互换,存到另一个二维数组中。
a= | 1 2 3 | b= | 1 4 |
2 5 | |||
4 5 6 |
3 6
a[0][0] | a[0][1] | a[0][2] | a[1][0] | a[1][1] | a[1][2] |
1 | 2 | 3 | 4 | 5 | 6 |
b[0][0] | b[1][0] | b[2][0] | b[0][1] | b[1][1] | b[2][1] |
输出:
|
{
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(“array b:\n”);
for(i=0;i<=2;i++)
{
for(j=0;j<=1;j++)
printf(“%5d”,b[i][j]);
printf(“\n”);
}
二、字符数组和字符串 }
(一)字符数组
1.定义:用来存放字符数据的数组是字符数组。字符数组中的一个元素存 放一个字符。
例:charc[7];
c[0]=’j’;c[1]=’i’;c[2]=’n’;c[3]=’’;c[4]=’h’;c[5] =’u’;c[6]=’a’;
2.字符数组的初始化
(1)逐个字符赋值
char ch[5]={‘h’,’e’,’l’,’l’,’o’};
h | e | l | l | o |
ch[0] | ch[1] | ch[2] | ch[3] | ch[4] |
(2)用字符串常量
charch[6]={“hello”};
charch[6]=”hello”;
charch[]=”hello”;
h | e | l | l | o | \0 |
ch[0] | ch[1] | ch[2] | ch[3] | ch[4] | ch[5] |
注意:把字符串赋给字符数组时,该数组定义的大小一定要比所赋予的字符串
的长度要多一个空间,用来存储字符串结束标志“\0”。如果所赋予的字符串长度比数组所定义的大小要小,那么没有被赋予的字符的数组元素将会被直接赋ch[5]=”boy”; 予 |
二维字符数组初始化
char
fruit[][7]={“apple”,”orange”,”grape”,”pear”,”peach”};
a | p | p | l | e | \0 | \0 |
o | r | a | n | g | e | \0 |
g | r | a | p | e | \0 | \0 |
p | e | a | r | \0 | \0 | \0 |
p | e | a | c | h 下 | 载高清 | \0 |
(二)字符串的输入输出
1.逐个字符输入输出。用“%c”输入或输出一个字符。
例:用%c
main()
{
char str[5];
int i;
for(i=0;i<5;i++)
scanf(“%c”,&str[i]);
for(i=0;i<5;i++)
printf(“%c”,str[i]);
}
出。 2.将整个字符串一次输入或输出。用“%s”对字符串(string)输入或输
例:用%s
main()
{
charstr[5];
scanf(“%s”,str);
printf(“%s”,str);
}
例1 main( )
{ char a[5]={‘H’,’e’,’l’,’l’,’o’};
printf(“%s\n”,a);
}
结果为:
例2 main()
{ char a[ ]=“Hello”;
printf(“%s\n”,a);
}
结果为:
例3 | main() |
|
|
}
结果为:
总结:用%s输出时,遇到”\0”结束;数组中有多个”\0”时,遇到第一个结束。
(三)字符串输入输出函数
包含在头文件stdio.h
1.字符串输出函数puts
格式:puts(字符数组)
功能:向显示器输出字符串
说明:字符数组必须以”\0”结束
2.字符串输入函数gets
格式:gets(字符数组)
功能:从键盘输入一个以回车结束的字符串放入字符数组中,并自动 加“\0”
说明:输入串长度应小于字符数组维数
例 #include <stdio.h>
main( )
{ char string[80];
printf(“Input a string:”);
}
输入: Jin Hua
输出: Jin Hua
三、字符处理函数(包含在头文件string.h)
(一)字符串连接函数strcat(STRingCATenate 字符串连接)
例子:charstr1[30]={“I am ”};
char str2[]={“Jin Hua”};
printf(“%s”,strcat(str1,str2));
结果为:I am Jin Hua
格式:strcat(字符数组1,字符数组2)
功能:把字符数组2连到字符数组1后面
返值:返回字符数组1的首地址
说明:(1)字符数组1必须足够大
(2)连接前,两串均以‘\0’结束;连接后,串1的‘\0’取消,新串 最后加‘\0’
(二)字符串拷贝函数strcpy(STRingCoPY 字符串复制)
例子:charstr1[10],str2[]={“china”};
strcpy(str1,str2);
执行后,str1 状态为: |
返值:返回字符数组1的首地址
说明:(1)字符数组1必须足够大
(2)拷贝时‘\0’一同拷贝
(3)不能使用赋值语句为一个字符数组赋值
(三)字符串比较函数strcmp(STRingCoMPare 字符串比较) 例子:strcmp(“beijing”,”Sheng yang”);
格式:strcmp(字符串1,字符串2)
功能:比较两个字符串
比较规则:对两串从左向右逐个字符比较(ASCII 码),直到遇到不同字符
或‘\0’为止
返值:返回int型整数,(1)若字符串1< 字符串2,返回负整数 (2)若字符串1> 字符串2,返回正整数 (3)若字符串1= = 字符串2,返回零
说明:字符串比较不能用“==”,必须用strcmp
(四)字符串长度函数strlen(STRingLENgth 字符串长度)
例子:charstr[10]={“China”};
printf(“%d”,strlen(str));
结果为:5
格式:strlen(字符数组)
功能:计算字符串长度
返值:返回字符串实际长度,不包括‘\0’在内