nullnull数 组null7.1 一维数的定义和引用null一、一维数组的定义:
类型说明符 数组名[常量表达式] ;
例如:int data[10], number[5];
数组的存储结构:data[0] data[1] data[2] …….. data[9]null定义数组,就是要:
(1)规定数组的名称,其取名规则与变量名相同;
(2)规定数组的类型,包括其数据类型和存储类型;
(3)规定数组的大小,即数组的维数及包含的数组元素的个数。数组元素就是包含在数组中的变量。null二、一维数组元素的引用
数组名[下标]
例如:a[0]=a[5]+a[7]-a[2*3][例7.1]
main( )
{ int i , a[10];
for(i=0; i<=9;i++)
a[i]=i ;
for(i=9; i>=0;i--)
printf(“%d ”,a[i]);
printf(“\n”);
}null三、一维数组的初始化null(1)在定义数组时对数组元素赋以初值;
int a[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
(2)可以只给一部分元素赋值;
int a[10]={0, 1, 2, 3, 4};
(3)如果想使一个数组中全部元素值为0,可简便实现;
int a[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
null(4)C允许通过所赋初值的个数来隐含定义一维数组的大小;
int a[]={0,1,2,3,4,5,0}; 相当于
int a[7]={0,1,2,3,4,5,0};
(5)花括号中的初值可以缺省,但有时逗号不能省略,缺省的值将被视为0。
float array[5]={,2.5, ,3.5,};
float array[5]={0,2.5,0,3.5,0};null四、一维数组应用举例null[例7.2] 利用数组来处理求Fibonacci数列的问题。nullmain( )
{ int i;
int f[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]);
}
}null[例7.3] 用起泡法对10个数由小到大排序。起泡法的思路是:将相邻两个数比较,将小的调到前头。null9
8
5
4
2
0
初态8 8 8 8 8
9 5 5 5 5
5 9 4 4 4
4 4 9 2 2
2 2 2 9 0
0 0 0 0 9
第一趟5 5 5 5
8 4 4 4
4 8 2 2
2 2 8 0
0 0 0 8
9 9 9 9
第二趟 4 4 4
5 2 2
2 5 0
0 0 5
8 8 8
9 9 9
第三趟2 2
4 0
0 4
5 5
8 8
9 9
第四趟0
2
4
5
8
9
第五趟比较5次比较4次比较3次比较2次比较1次N-S图如下:N-S图如下:nullmain( )
{ int i, j, t, a[11];
for(i=1;i<11;i++)
scanf(“%d”,&a[i]);
for(j=1;j<=9;j++)
for (i=1;i<=10-j;i++)
if (a[i]>a[i+1])
{ t=a[i]; a[i]=a[i+1];a[i+1]=t;}
for (i=1; i<11;i++)
printf(“%d “,a[i]);
}null§7.2 二维数组的定义和引用null一、二维数组的定义
类型说明符 数组名[常量表达式][常量表达式];
如:int number[5][4];
char ch[3][4], name[8]; ch[0] ch[0] [0] ch[0] [1] ch[0] [2] ch[0] [3]
ch[1] ch[1] [0] ch[1] [1] ch[1] [2] ch[1] [3]
ch[2] ch[2] [0] ch[2] [1] ch[2] [2] ch[2] [3]null数组的存储结构:以行为主序ch[0][0]ch[0][1]ch[0][2]ch[0][3]ch[1][1]ch[1][0]ch[1][2]ch[1][3]ch[2][2]ch[2][3]null二、二维数组的引用
二维数组元素的表示形式为:
数组名[下标][下标]null
如:a[2][3]、b[1][2]=a[2][3]/2、a[2][3]=3等;
注意:
(1)其中下标可以是整型表达式;
(2)不要写成a[2,3]等形式;
(3)应该注意下标值应在已定义的数组大小范围内;
(4)定义数组时用的a[3][4]与引用数组元素时用的a[3][4]的区别。null三、二维数组的初始化null
(1)分行给二维数组赋初值:如
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
(2)可以将所有数据写在一个花括号内,按数组排列的顺序对元素赋初值;如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(3)花括号内的初值个数少于每行中的数组元素个数,则每行中后面的元素自动赋初值0;也允许代表给每行元素赋初值的花括号的数目少于数组的行数,这时,后面各行的元素也自动赋0值。如:
int a[3][4]={{1},{5},{9}}; 等价于
int a[3][4]={{1,0,0,0},{5,0,0,0},{9,0,0,0}};null int a[4][3]={{1,2},{4,5}};
等价于
int a[4][3]={{1,2,0},{4,5,0},{0,0,0},{0,0,0}};
(4)C语言规定,可以用初始化的方法来隐含定义二维数组第一维的大小,即可以省略数组定义中第一个方括号中的表达式,但不能省略第二个方括号中的表达式。
如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
等价于
int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
(5)在定义时也可以只对部分元素赋初值而省略第一维长度,但应分行赋初值。
如:
static int a[ ][4]={{0,0,3},{},{0,10}}; null四、二维数组应用举例null[例7.4] 将一个二维数组行和列元素互换,存到另一个二维数组中。[
] 设:程序如下:nullmain( )
{ int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2]; int i, j;
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”);
}
for(i=0;i<=2;i++)
{ for(j=0;j<=1;j++)
printf(“%5d”,b[i][j]);
printf(“\n”);
}
}null[例7.5] 有一个二维数组a[3][4],找出其中的最大和最小元素,并指出它们所在的行号和列号。null分析:
求最大值和最小值的方法在前面章节中已介绍过,求最大值的N-S图如右图所示,求最小值的算法请读者自己完成。nullfor (i=0; i<=2; i++)
for (j=0; j<=3; j++)
if (a[i][j]>max)
{ max=a[i][j];
row=i;
colum=j;
}
printf(“max=%d,row=%d,colum=%d\n”,max,row,colum);
}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];null§7.3 字符数组null一、字符数组的定义
char 数组名[常量表达式];
如:char c[10];
int c[10];
二、字符数组的初始化
(1)给每一个字符型数组元素依次赋给一个单字符。
如:char str[6]={‘C’,’h’,’i’,’n’,’a’,’\0’};
(2)直接在赋值号右边给出字符串常量。
如:char str[6]=“China”;null注意:
(1)字符数组的长度可以通过赋初值的方式隐含定义;如:
char str[]={‘C’,’h’,’i’,’n’,’a’,’\0’};
char str[]=“China”;
(2)如果括号中提供的初值个数(即字符个数)大于数组长度,则作语法错误处理。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定义为空字符(即‘\0’)。null三、字符数组的引用
[例7.6] 输出一个字符串。main( )
{
char c[10]=“I am a boy”;
int i;
for(i=0;i<10;i++)
printf(“%c”,c[i]);
printf(“\n”);
}nullmain()
{ char diamond[][5]={{‘ ’,‘ ’,‘*’,},{‘ ’,‘*’,‘ ’,‘*’},\
{‘*’,‘ ’ ,‘ ’ ,‘ ’,‘*’}, {‘ ’,‘*’,‘ ’,‘*’},{‘ ’ ,‘ ’ ,‘ ’,‘*’}};
int i,j;
for (i=0;i<5;i++)
{ for (j=0;j<5;j++)
printf(“%c”,diamond[i][j]);
printf(“\n”);
}
} *
* *
* *
* *
*[例7.7] 输出一个钻石图案null四、字符串和字符串结束标志
字符串结束标志是“\0”,如:
“China”在存储器中实际占用6个字节:char str[12]=“The string.”; 或
char str[]=“The string.”;如:char c[6]={‘C’,’h’,’i’,’n’,’a’}
为了处理方法的一致,而写为:
char c[6]={‘C’,’h’,’i’,’n’,’a’,’\0’}null五、字符数组的输入和输出
1.字符数组的输出
(1)用格式符“%c”控制的printf();如:nullmain()
{char c[10]={‘I’,‘ ’,’a’,’m’,‘ ’,’a’, ‘ ’,’b’,’o’,’y’};
int i;
for(i=0;i<10;i++)
printf(“%c”,c[i]);
printf(“\n”);
}null(2)用格式符“%s”控制的printf();如:main()
{char c[ ]=“China”;
int i;
for(i=0;i<10;i++)
printf(“%s”,c);
}注意:
(1)输出字符不包括“\0”;
(2)用“%s”格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名;null(3)puts(字符数组);如:#include
main()
{char city[ ]=“YangZhou”;
int i, j;
for(i=0;i<=8;i++)
printf(“%c”,city[i]);
printf(“\n”);
printf(“%s\n”,city);
puts(city);
}null注意:
(1)puts用字符数组名,而不用数组元素名;
(2)输出的字符串中可含转义字符;如:
char str[]=“China\nBeijing”;
puts(str);
(3)如果数组长度大于字符串实际长度,也只输出到遇‘\0’时结束(即若一个字符数组中包含一个以上的‘\0’,则遇到第一个时输出就结束)。如:
printf(“%s\n”,“ABCD\0EFGH”);
只输出ABCDnull 2.字符数组的输入
(1)用格式符“%s”控制的scanf();如:char c[6];
scanf(“%s”,c);
再如:
char str1[5],str2[5],str3[5];
scanf(“%s%s%s”,str1,str2,str3);
若输入数据流为:How are you? 时,
str1,str2,str3分别接收到“How”、“are”、“you?”。且在各个字符串的最后自动加‘\0’。null注意:
① 如果利用一个scanf函数输入多个字符串时,则以空格分隔;
② scanf(“%s”,&str); 不对!null(2)用gets( );如:
char ch[16];
gets(ch);null注意:
① gets一次只能输入一个字符串;
② 自变量应是数组名,而不能是数组元素名;
③ 要求从键盘上输入一个字符串直到遇到换行符为止,系统会自动把换行符换成“\0”加在字符串末尾。与scnaf不同,输入字符串中的空格也会被接收。null六、字符串处理函数null
1.puts(字符数组)
功能:将一个以‘\0’结束的字符序列输出到终端;
如: char str[]=“China”;puts(str);
说明:输出的字符串中可含转义字符。
2.gets(字符数组)
功能:从终端输入一个字符串到字符数组中,并得到一个函数值,该函数值是字符数组的起始地址;
如: gets(str);
**说明:gets与puts只能输入或输出一个字符串。null 3.strcat(字符数组1,字符数组2)
功能:将字符串2接到字符串1的后而且去掉字符串1的尾空;
如: char str1[30]=“YangZhou ”;
char str2[ ]=“China”;
printf(“%s\n”,strcat(str1,str2));
说明: ①字符数组1的长度需足够大;
②去掉字符串1的尾空。
4.strcpy(字符数组1,字符串2)
功能:将字符串2拷贝到字符数组1中去;
如: char str1[10],str2[]=“China”;
strcpy(str1,str2);执行后:null说明: ①字符数组1的长度需足够大;
②字符数组1必须写成数组名形式,字符串2可以是
数组名,也可以是一个字符串常量。如:
strcpy(str1,“China”);
③拷贝时连同字符串2后的‘\0’一起拷贝;
④不能用赋值语句将一个字符串常量或字符数组
直接赋给一个字符数组。如:
str1=“China”;
str1=str2; 均是错误的。
⑤strncpy (str1,str2, 2) ;
拷贝str2中前面2字符到str1中,
str1第3位往后不变。 null 5.strcmp(字符串1,字符串2)
功能:比较字符串1和字符串2,返回:
①串1=串2,返回0;
②串1>串2,返回正整数;
③串1<串2,返回负整数。
如: if(strcmp(str1,str2)= =0) printf(“yes”);
说明:不能进行如下比较:
if(str1= =str2) printf(“yes”);
6.strlen(字符数组)
功能:测试字符串的长度;
如: char str1[10]=“China”;
printf(“%d\n”,strlen(str));
说明:不包含‘\0’在内。null 7.strlwr(字符串)
功能:将字符串中的大写字母转换成小写字母;
说明:lwr: lowercase。
8.strupr(字符数组)
功能:将字符串中的小写字母转换成大写字母。
说明:upr: uppercase。null七、字符数组应用举例 null[例6.8] 编程将两个字符串连接起来,不用strcat函数。分析:N-S图如下:nullmain( )
{ char s1[80],s2[40];
int i=0,j=0;
scanf(“%s”,s1);
scanf(“%s”,s2);
while(s1[i]!=‘\0’) i++;
while(s2[j]!=‘\0’) s1[i++]=s2[j++];
s1[i]=‘\0’;
printf(“\n结果为:%s”,s1);
}null例7.9 比较两个给出的C字符串,按比较结果函数返回如下函数值。若s1=s2,则返回0;若s1s2,则返回正值。nullint scmp(char s1[],char s2[])
{ int i=0;
while(s1[i])
if (s1[i]-s2[i])
return(s1[i]-s2[i]);
else {
i++;
}
return(0);
}null例7.10 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。null分析:
(1)假设将文本行存入字符串string中,从string[0]起逐个检查数组元素,一旦当前字符为非空格且前一个字符为空格时,就说明一个单词的开始;
(2)num用来统计单词数目,初值为0;
c用来存放当前字符;nullN-S图如下:=0null#include “stdio.h”
main()
{ char string[81];
int i,num=0,word=0;
char c; gets(string);
for(i=0;(c=string[i])!=‘\0’;i++)
if(c= =‘ ’ )word=0;
else if (word= =0)
{ word=1;
num+ +;
}
printf(“There are %d words in \
the line\n”,num);
}null