数组是有序数据的集合,数组中的元素数据类型相同。
一维数组
一维数组的定义方式
一维数组的定义方式为:
类型说明符 数组名[常量表达式]
“数组名”按标识符取名规则定义;“常量表达式”的值指定了该数组中可以存储的数据(称为数组元素)的个数,即指定数组长度,“常量表达式”中不能含有变量;数组元素的数据类型由“类型说明符”定义。
一维数组元素的引用
数组必须先定义后使用。数组中的每个元素可以作为一个变量来访问,其引用形式是:
数组名[下标]
即用数组名和下标来引用数组元素。
注意:数组不能整体引用,必须逐个元素访问。
- 计算Fibonacci数列的前15个数
#include<stdio.h>
int main(){
int f[15];
f[0] = 0;
f[1] = 1;
for(int i = 2;i<15;i++){
f[i] = f[i-1]+f[i-2];
}
for(int i = 0; i<15; i++){
printf("%4d", f[i]);
}
}
一维数组的初始化
- 数组元素可以像简单变量一样在定义的同时进行初始化,为各数组元素赋初值。数组元素初始化的一般形式为:
类型说明符 数组名[长度]={数值表};
其中,“数值表”列出与数组类型相同的各常量,每个常量用逗号隔开。
注意:
- 初始化时可对数组全部元素初始化,也可只对部分元素初始化。对全部元素初始化时,允许不指定数组长度。
- 早期ANSIC规定只有静态数组和外部数组才能初始化,但新ANSIC已经没有这一限制。
- 不能对数组整体初始化,只能对元素一一赋初值。
编写一个程序把以下10个整数按递增排列:23,56,234,1,45,34,21,394,3,35
//直接插入排序
#include<stdio.h>
int main(){
static int data[]={23,56,234,1,45,34,21,394,3,35};
int length = sizeof(data)/sizeof(data[0]);
int j, temp;
for(int i = 1; i<length; i++){
j = i-1;
temp = data[i];
//将data[i]与前面i-1项做比较,如果小于则逐项后移
while(data[j]>temp&&j>=0){
data[j+1] = data[j];
j--;
}
data[j+1] = temp;
}
for(int i = 0; i<length; i++){
printf("%4d",data[i]);
}
}
二维数组
二维数组的定义
二维数组的定义如下:
类型说明符 数组名[常量表达式][常量表达式];
在C语言中,用数组名后跟两个方括号的形式表示二维数组,便于把二维数组看成一种特殊的一维数组,其中每个元素又是一个一维数组,即二维数组由元素类型为数组类型的一维数组构成。
在C语言中,二维数组中元素是按行主序的方式连续存放的。
二维数组元素的引用
二维数组元素的引用形式为:
数组名[下标][下标]
求二维数组中最大值和最小值元素的行列号
#include<stdio.h>
int main(){
int m[3][4], i, j;
int max_value,min_value;
int max_row,min_row,max_col,min_col;
for(i = 0; i<3; i++){
for(j = 0; j<4;j++){
scanf("%d",&m[i][j]);
}
}
max_value = -32768;
min_value = 32767;
for(i = 0;i<3;i++){
for(j = 0; j<4;j++){
if(m[i][j]>max_value){
max_value = m[i][j];
max_row = i;
max_col = j;
}
if(m[i][j]<min_value){
min_value = m[i][j];
min_row = i;
min_col = j;
}
}
}
printf("max_value = %d max_row = %d max_col = %d\n", max_value, max_row, max_col);
printf("min_value = %d min_row = %d min_col = %d\n",min_value,min_row,min_col);
}
二维数组的初始化
- 可以按行对二维数组初始化。
- 可以按数组元素的存放顺序对各元素初始化。
对于二维数组,也可以全部元素或部分元素初始化,并且可以省略数组第一维的长度。下面两种情况可以省略第一维的长度:
- 全部元素初始化。
- 部分元素初始化,但必须采用按行赋值方式。
字符数组
用来存放字符的数组称为字符数组。
字符数组的定义和初始化
定义字符数组的类型说明符为char,如 char str[10];
字符数组初始化可采用下面的方式进行:
- 逐个字符对字符数组初始化,若初始化值个数与数组长度相等,可以省略定义数组长度。
- 用字符串常量对字符数组初始化,用字符串常量对字符数组初始化时,C编译程序将在字符数组的最后一个字符后自动加一个字符串结束标志’\0’。
字符数组的输入\输出
- 逐个字符输入\输出
char str[10];
for(int i = 0; i<5; i++)
scanf("%c",&str[i]);
for(int i = 0; i<5; i++)
printf("%c",str[i]);
这种方法由循环次数控制字符串长度,不检测字符串结束标志’\0’。
- 字符串整体输入\输出
字符串整体输入\输出时必须采用字符串格式符"%s",系统自动在字符串末尾增加’\0’。C语言规定数组名代表数组的起始地址。
与字符串处理有关的几个函数
- 字符串连接函数:strcat()
调用形式:strcat(字符数组1, 字符数组2);
功能:把字符数组2中的字符串连接到字符数组1的字符串后, 连接结果存于字符数组1中,函数返回值为字符数组1的地址。 - 字符串复制函数:strcpy()
调用形式:strcpy(字符数组1, 字符数组2);
功能:将字符数组2的字符串复制到字符数组1中。函数的第一个参数必须是数组名,因为该数组将接收被复制的字符串,第二个参数可以是数组名,也可以是字符串常量。 - 字符串比较函数strcmp()
调用形式:strcmp(字符串1, 字符串2);
功能:对字符串1和字符串2进行比较。函数的两个参数可以是数组名,也可以是字符串常量。
字符串比较的方法是:对两个字符串从左至右逐个字符按其ASCII码值的大小进行比较,直到出现不同的字符或遇到结束符’\0’为止。函数返回值为字符串的比较结果:- 字符串1=字符串2——函数返回值为0
- 字符串1>字符串2——函数返回值为正值
- 字符串1<字符串2——函数返回值为负值
- 测试字符串长度函数strlen()
调用形式:strlen(字符数组);
功能:测试字符数组中的字符串长度,函数返回值为字符串实际长度,结束符’\0’不计算在内。
编写一个程序输入n个人的姓名,然后统计其中有多少个以“M”字母开头的名字,并把所有的“M”开头的名字和最长的名字显示出来。
#include<stdio.h>
#include<string.h>
int main(){
char name[20][20],str[20];
int i,k,len,number,count=0;
printf("enter the number of students.\n");
scanf("%d",&number);
printf("enter the name of students\n");
len = 0;
for(i = 0; i< number; i++){
scanf("%s", name[i]);
k = strlen(name[i]);
if(len<k){
len = k;
strcpy(str, name[i]);
}
}
printf("the names begin with 'M' are:\n");
for(i = 0; i<number; i++){
if(name[i][0]=='M'){
count++;
printf("%s\n", name[i]);
}
}
printf("there are %d names begin with 'M'.\n", count);
printf("the longest name is %s\n",str);
return 0;
}