- 数组是一组有序数组的集合。
- 用一个数组名和下标来唯一地确定数组中的元素,如s[15]。
- 数组中的每一个元素都属于同一个数据类型。
6.1 怎样定义和引用一维数组
怎样定义一维数组
定义一维数组的一般形式为
类型说明符 数组名[常量表达式];
说明:
⑴数组名的命名规则和变量名相同, 遵循标识符命名规则。
⑵在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。下标是从0开始的。 指定a[10],不存在数组元素a[10]。
⑶常量表达式中可以包括常量和符号常量,如"int a[3+5];"是合法的。不能包含变量,如"int a[n];"是不合法的。
怎样引用一维数组元素
只能引用数组元素而不能一次整体调用整个数组全部元素的值。只能一个个调用数组元素。
对10个数组元素依次赋值为0,1, 2, 3, 4, 5, 6, 7 ,8, 9,要求按逆序输出。
#include <stdio.h>
int 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");
return 0;
}
一维数组的初始化
- 在定义数组时对全部数组元素赋予初值。
int a[10]={0,1,2,3,4,5,6,7,8,9};
- 可以只给数组中的一部分元素赋值。
int a[10]={0,1,2,3,4};
/*这表示只给前面5个元素赋初值,
系统自动给后5个元素赋初值为0。*/
- 如果想使一个数组中全部元素值为0
int a[10]={0,0,0,0,0,0,0,0,0,0};
//或
int a[10]={0};
//未赋值的部分元素自动设定为0
- 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。
int a[5]={1,2,3,4,5};
//可以写成
int a[]={1,2,3,4,5};
说明:
如果在定义数值型数组时,指定了数组的长度并对之初始化,凡未被"初始化列表"指定初始化的数组元素,系统会自动把它们初始化为0(如果是字符型数组,则初始化为’\0’,如果是指针型数组,则初始化为NULL,即空指针。
起泡法排序
有10个地区的面积,要求对它们按由小到大的顺序排列。
#include <stdio.h>
int main()
{
int a[10];
int i,j,t;
printf("input 10numbers:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("\n");
for(j=0;j<9;j++)
for(i=0;i<9-j;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
printf("the sorted numbers:\n");
for(i=0;i<10;i++)
printf("%d",a[i]);
printf("\n");
return 0;
}
怎样定义和引用二维数组
怎样定义二维数组
二维数组定义的一般形式为:
类型说明符 数组名[常量表达式][常量表达式];
float a[3][4]; //定义a为3×4(3行4列)的数组
//也可以理解为三个一维数组
float a[0],a[1],a[2];
C语言中,二维数组中元素排列的顺序是按行存放的。在内存中,各元素是连续存放的,不是二维的,是线性的。
怎样引用二维数组的元素
二维数组元素的表现形式为
数组名[行下标][列下标]
下标应是整型表达式,且在已定义的数组大小的范围内。
二维数组的初始化
- 分行给二维数组赋初值。
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
- 可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
- 可以对部分元素赋初值。
int a[3][4]={{1},{5},{9}};
//只对各行第1列元素赋初值,其余元素值自动为0。
1 0 0 0
5 0 0 0
9 0 0 0
int a[3][4]={{1},{0,6},{0,0,11}};
//对各行中的某一元素赋初值
1 0 0 0
0 6 0 0
0 0 11 0
/*这种方法对非零元素少时比较方便,
只需输入少量数据。*/
int a[3][4]={{1},{5,6}};
//也可以只对某几行元素赋初值
1 0 0 0
5 6 0 0
0 0 0 0
//第3行不赋初值
//也可以对第2行不赋初值
int a[3][4]={{1},{},{9}};
- 如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一1维的长度可以不指定,但第2维的长度不能省。
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};
在定义时也可以只对部分元素赋初值而忽略第1维的长度,但应分行赋初值。
int a[][4]={{0,0,3},{},{0,10}};
0 0 3 0
0 0 0 0
0 10 0 0
将一个二维数组行和列的元素互换,存到另一个二维数组中。
#include <stdio.h>
int main()
{
int a[2][3]={{1,2,3},{4,5,6}};
int b[3][2],i,j;
printf("array a:\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\n",b[i][j]);
printf("\n");
}
return 0;
}
//运行结果:
array a:
1 2 3
4 5 6
array b:
1 4
2 5
3 6
打擂台算法
有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
#include <stdio.h>
int main()
{
int i,j,row,colum=0,max;
int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}}; //定义数组并赋初值
max=a[0][0]; //先认为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;
colum=j;
}
printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);
return 0;
}
//运行结果:
max=10
row=2
colum=1
6.3 字符数组
C语言中没有字符串类型,也没有字符串变量,字符串是从存放在字符型数组中的。
怎样定义字符数组
char c[10];
c[0]='I';c[1]='';c[2]='a';c[3]='m';c[4]='';c[5]='h';c[6]='a';c[7]='p';c[8]='p';c[9]='y';
由于字符型数据是以整数形式(ASCII代码)存放的,因此也可以用整型数组来存放字符数据。
int c[10];
c[0]='a'; //合法,但浪费存储空间
字符数组的初始化
- “初始化列表”,把各个字符依次赋给数组中各元素。
char c[10]={'I','','a','m','','h','a','p','p','y'};
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的。如果花括号中提供的字符个数大于数组长度,则出现语法错误。如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即’\0’)。
-
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。用这种方式可以不必人工去数字符的个数,尤其在赋初值的字符个数较多时,比较方便。
-
也可以定义和初始化一个二维字符数组。
怎样引用字符数组中的元素
输出一个已知的字符串
#include <stdio.h>
int main()
{
char c[15]={'I','','a','m','','a','','s','t','u','d','e','n','t','.'};
int i;
for(i=0;i<15;i++)
printf("%c",c[i]);
printf("\n");
return 0;
}
字符串和字符串结束标志
在遇到字符’\0’时,表示字符串结束,把它前面的字符组成一个字符串。它本身不算有效字符。
注意:
C系统占用字符数组存储字符串常量时会自动加一个’\0’作为结束符。例如"C program"共有9个字符。字符串是存放在一维数组中的,在数组中它占10个字节,最后一个字节’\0’是由系统自动加上的。
用字符串常量来使字符数组初始化
char c[]={"I am happy"};
//也可以省略花括号,直接写成
char c[]="I am happy";
//此时数组c的长度不是10,而是11。
字符数组的输入输出
⑴逐个字符输入输出。用格式符"%c"输入或输出一个字符。
⑵将整个字符串一次输入输出。用"%s"格式符。
char c[]={"China"};
printf("%s\n",c);
//在内存中数组c的存储情况为China\0
//输出时遇到'\0'停止输出,结果是China
说明:
⑴输出的字符中不包括结束符’\0’。
⑵用"%s"格式符输出字符串时,printf函数中的输出项是字符数组名,而不是数组元素名。
⑶如果数组长度大于字符串的实际长度,也只输出到遇’\0’结束。
char c[10]={"China"};
//字符串长度为5,连'\0'共占6个字节。
printf("%s\n",c);
⑷如果一个字符数组中包含一个以上’\0’,则遇第一个’\0’时输出就结束。
⑸可以用scanf函数输入一个字符串。输入的字符串应短于已定义的字符数组的长度。
char c;
//从键盘输入:
China
//系统会自动在China后面加一个'0'结束符。
如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔。
char str1[5],str2[5],str3[5];
scanf("%s%s%s",str1,str2,str3);
//输入数据:
How are you?
使用字符串处理函数
- puts和gets函数只能输出和输入一个字符串。
- strcat函数——字符串连接函数
- strcpy和strncpy函数——字符串复制函数
- strcmp函数——字符串比较函数
- strlen函数——测字符串长度的函数
- strupr函数——转换为大写的函数
注意:在使用字符串处理函数时,应在程序文件的开头用#include <string.h>
把string.h文件包含到本文件中。