数组:一组具有相同数据类型的数据的有序集合
一般格式:
类型说明符 数组名[常量表达式];
例如,int[10]
定义了一个整形数组,数组名为a,包含10个元素
注意:
(1)数组名命名规则和变量相同
(2)在定义数组时,需要指定数组中元素的 个数,即数组长度。
注意数组元素的下标是从0开始的
a[0] a[1] a[2] a[3] a[4]
a[5] a[6] a[7] a[8] a[9]
(3)常量表达式可以包括常量和符号常量, 但不能包含变量。C语言不允许对数组的大小作动态定义。例如,下面这样定义数组是不行的:
int n;
scanf(“%d″,&n);
int a[n];
一维数组
int a[10]={1,2,3,4,5,6,7,8,9,10};
数组元素1,2,3,…,10从低地址a[0]开始向高地址a[9]依次存放。
每个数据元素所占字节数就是基类型字节数。
这句话的意思是,每个数组元素1,2,3…所占字节数为数组的类型int所占字节数,即sizeof(int)
引用方式
数组名[下标]
下标可以是整型常量或整型表达式
例如:
a[0]= a[5]+ a[7]- a[2*3]
#include
int main()
{
int i, a[10];
for (i = 0; i < 10; i++)
a[i] = i; //将i的值赋给a[1]
for (i = 0; i < 10; i++)
printf("%d ", a[i]); //输出数组a的每个元素
return 0;
}
(1)在定义数组时对数组元素赋以初值。
int a[10]={0,1,2,3,4,5,6,7,8,9};
经过上面的初始化后
a[0]= 0 a[1]= 1 a[2]= 2 a[3]= 3 a[4]= 4
a[5]= 5 a[6]= 6 a[7]= 7 a[8]= 8 a[9]= 9
(2)可以只给一部分元素赋值。
int a[10]={0,1,2,3,4};
只给前面5个元素赋初值
(3)在对全部数组元素赋初值时,可以不指定数组长度。
int a[5]={1,2,3,4,5};
可以写成
int a[]={1,2,3,4,5};
例,用数组来处理,求解Fibonacci数列
#include
int main()
{
int i, 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]);
}
printf("\n");
return 0;
}
一般形式为
类型说明符 数组名[常量表达式][常量表达式];
例如:
float a[3][4],b[5][10];
可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。
数组元素在内存中按行存放,即先顺序存放第零行的元素,再存放第一行的元素,再存放第二行的元素…
int b[3][3] = { {1,2,3}, {4,5,6}, {7,8,9} };
二维数组元素的表示形式为:
数组名[下标][下标]
例如:
a[2][3]; a[2-1][2*2-1];
数组元素可以出现在表达式中,也可以被赋值,例如:
b[1][2] = a[2][3] / 2
在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内
(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) 可以对部分元素赋初值。
int a[3][4] = {{1},{5},{9}};
[ 1 0 0 5 0 0 9 0 0 ] \left[\begin{matrix} 1&0&0\\ 5&0&0\\ 9&0&0\\ \end{matrix}\right] ⎣⎡159000000⎦⎤
(4) 如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
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};
字符数组的每个元素都是一个字符,定义方式与普通数组一样。一维字符数组也叫字符串
**区别:**字符’a’ 字符串”a”
char c[3]={‘d’,’o’,’g’};
它在计算机中的存储其实是’d’,’o’,’g’,’\0’,即每个字符串末尾都有一个\0,叫结束标识符
(1)逐个字符赋给数组中各元素例如,
char c[3]={‘d’,’o’,’g’};
如果提供的初值个数大于数组长度,按语法错误处理
(2)如果初值个数与数组长度相同,在定义时可以省略数组长度
char c[]={‘d’,’o’,’g’};
(3)如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素定为空字符\0
定义与普通二维数组一样,例如
char c[3][5] = { { ' ',' ','*',' ',' ' },{' ','*',' ','*',' '},{'*',' ','*',' ','*'} };
‘ \0 ’:字符串结束标志
例如,“dog”,其实是d, o, g, \0
可以用字符串常量初始化字符数组,但此时\0占数组的位置,所以数组长度为字符串长度+1
char c[] = {″I am happy″};
或
char c[] = ″I am happy″;
等价
char c[] = {′I′,′ ′,′a′,′m′,′ ′,′h′,′a′,′p′,′p′,′y′,′\0′};
(1)逐个字符输入输出:用格式符”%c”输入或输出一个字符
#include
int main()
{
char c[4] = "dog";
for (int i = 0; i < 4; i++)
printf("%c", c[i]);
return 0;
}
(2)将整个字符串整体输入或输出用格式符”%s”输入输出整个字符串
#include
int main()
{
char c[4] = "dog";
printf("%s", c);
return 0;
}
(3)用scanf函数输入一个字符串。
char c[6];
scanf(″%s″,c);
从键盘输入:China↙
注意
scanf函数中的输入项如果是字符数组名,不要再加地址符&。在C语言中数组名代表该数组的起始地址。下面写法不对:
scanf(″%s″,&c);
如果利用一个scanf函数输入多个字符串,则在输入时以空格分隔。
char strl[5],str2[5],str3[5]; scanf(″%s%s%s″,str1,str2,str3);
(1)puts函数
一般形式为:puts(字符数组)
作用:将一个字符串输出到终端
char str[]={″China\nBeijing″}; puts(str);
输出结果:
China
Beijing
(2)gets函数
一般形式为:gets(字符数组)
作用:从终端输入一个字符串到字符数组
char str[9]; gets(str);
从键盘输入:
Computer↙
(3)strcat函数
一般形式为:strcat(字符数组1,字符数组2)
作用:连接两个字符数组中的字符串。把字符串2接到字符串1的后面,结果放在字符数组1中。
例如:
char str1[30]={″People′s Republic of ″}; char str2[]={″China″}; strcat(str1,str2);
数组str1变为:People′s Republic of China
(4)strcpy函数
一般形式为:strcpy(字符数组1,字符串2)
作用:将字符串2复制到字符数组1中
char str1[10],str2[]={″China″}; strcpy(str1,str2);
(5)strncpy函数
作用:将字符串2中前面若干个字符复制到字符数组1中
strncpy(str1,str2,2);
作用:将str2中前面2个字符复制到str1中
(6)strcmp函数
一般形式为:strcmp(字符串1,字符串2)
作用:比较字符串1和字符串2
例如:
strcmp(str1,str2);
strcmp(″China″,″Korea″);
strcmp(str1,″Beijing″);
自左至右逐个字符相比(按ASCII码值大小比较),如果全部字符都相同,则认为相等;若出现不相同的字符,则以第一对不相同的字符的比较结果为准。 例如
"computer">"compare" "CHINA">"CANADA" "DOG"<"cat"
比较的结果由函数值带回
(1) 如果字符串1=字符串2,函数值为0。
(2) 如果字符串1>字符串2,函数值为一正整数。
(3) 如果字符串1<字符串2,函数值为一负整数。
(7)strlen函数
一般形式为:strlen(字符数组)
作用:求字符串的实际长度(不包括′\0′)
char str[10]={″China″}; printf(″%d″,strlen(str));
输出结果是5
(8)strlwr函数
一般形式为:strlwr(字符串)
作用:将字符串中大写字母换成小写字母
(9) strupr函数
一般形式为:strupr(字符串)
作用:将字符串中小写字母换成大写字母
(1)用起泡法对10个数从小到大排序
思路:将相邻两个数比较,将小的调到前头
结论:
如果有n个数,则要进行n-1趟比较。
在第1趟比较中要进行n-1次两两比较,在第j趟比较中要进行n-j次两两比较。
#include
int main()
{
int i, j, t;
int a[10];
printf("input 10 numbers: \n");
for (i = 0; i < 10; i++)
scanf_s("%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;
}
运行结果
(2)将一个二维数组行和列元素互换,存到另一个二维数组中
A = [ 1 2 3 4 5 6 ] A=\left[\begin{matrix} 1&2&3\\ 4&5&6\\ \end{matrix}\right] A=[142536]
b = [ 1 4 2 5 3 6 ] b=\left[\begin{matrix} 1&4\\ 2&5\\ 3&6\\ \end{matrix}\right] b=⎣⎡123456⎦⎤
#include
int main()
{
int A[2][3] = { 1,2,3,4,5,6 }, B[3][2];
int i, j;
printf("array A : \n");
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
{
printf("%5d", A[i][j]);
B[j][i] = A[i][j];
}
printf("\n");
}
printf("array B : \n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
{
printf("%5d", B[i][j]);
}
printf("\n");
}
return 0;
}
运行结果
(3)有一个3×4的矩阵,输出值最大的数组元素的值,以及其所在的行号和列号
#include
int main()
{
int a[3][4] = { {1,2,3,4},{11,23,-56,46},{-45,51,31,67} };
int i, j, max, row = 0, colum = 0;
max = a[0][0];
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; 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;
}
运行结果
(4)输入一行字符,统计其中有多少个单词,单词之间用空格分隔开
算法:
#include
int main()
{
char str[100], c;
int num = 0, word = 0;
gets_s(str);
for (int i = 0; (c = str[i]) != '\0'; i++)
{
if (c == ' ') word = 0;
else if (word == 0)
{
word = 1;
num++;
}
}
printf("There are %d words in the line.\n", num);
return 0;
}
#include
#include
int main()
{
char string[20];
char str[3][20];
for (int i = 0; i < 3; i++)
gets_s(str[i]);
if (strcmp(str[0], str[1]) > 0)
strcpy_s(string, str[0]);
else strcpy_s(string, str[1]);
if (strcmp(str[2], string) > 0)
strcpy_s(string, str[2]);
printf("The largest string is %s.\n", string);
return 0;
}