系列合集 初窥C语言
六、数组的定义和使用
6.1 一维数组的定义和使用
6.1.1 一维数组的定义
类型说明符 数组名 [常量表达式]
类型说明符:任一种基本数据类型或构造数据类型
数组名:用户定义的数组标识符
常量表达式:数组元素的个数
例如: int a[10] 说明整数型数组a,有10个元素
6.1.2 一维数组元素的引用
数组元素的一般形式为: 数组名[数组下标]
下表可以为整形常量,变量,或整型表达式。
例如: x = a[i];
a[0] = a[5] + a[7] - a[2*3];
6.1.3 一维数组的初始化
初始化赋值的一般形式为:
类型说明符 数组名[常量表达式] = {值1,值2,…,值n};
规定:
1)可以只给部分元素赋初值
2)只能给元素逐个赋值,不能给数组整体赋值
3)如给全部元素赋值,则在数组说明中可以不给出数组元素的个数
一维数组定义的几点说明:
1)数组的类型实际上是指数组元素的取值类型
2)数组名的书写规则应符合标识符的书写规定
3)数组名不能与其它变量名相同
4)数组元素的下标从0开始,最大值是数组大小减1
5)不能在方括号[]内用变量表示元素的个数,但是可以是符号常数或常量表达式
6)允许在同一个类型说明中,说明多个数组和多个变量
6.2 二维数组的定义和使用
6.2.1 二维数组的定义
类型说明符 数组名[ 常量表达式1 ] [ 常量表达式2 ]
常量表达式1:第一维下标的长度
常量表达式2:第二维下标的长度
二维数组的排列顺序:按行存放
例如:
a[0] … a00 a01 a02 a03
a[1] … a10 a11 a12 a13
a[2] … a20 a21 a22 a23
6.2.2 二维数组元素的引用
表示形式:
数组名[ 下标 ] [下标 ]
数组元素可以出现在表达式中,也可以被赋值
例如: b[1][2] = b[2][3]/2
下标值应在已定义的的数组大小的范围内
例如:int a[3][4]; a[3][4] = 3;(超过数组大小范围)
6.2.3 二维数组的初始化
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)可对部分元素赋初值
4)对所有元素赋初值,则定义数组时,对第一维的长度可以不指定,但第二维长度不能省略
6.3 数组应用举例
1.用数组处理求Fibonacci数列问题
#include <stdio.h>
int main(){
int i;
int f[20] = {1,1};
for(i = 2; i < 20; i++){
f[i] = f[i - 2] + f[i - 1];
printf("%12d", f[i]);
}
}
2.用冒泡排序排列10个数
#include <stdio.h>
int main(){
int a[10];
int i, j, t;
printf("please input 10 numbers : \n");
for(i = 0; i < 10; i++){
scanf("%d\n", &a[i]);
}
printf("\n");
for(j = 1; j < 10; 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;
}
}
}
printf("the sorted number : \n");
for(i = 0; i < 10; i++){
printf("%d\n",a[i]);
}
}
3.将一个二维数组行和列元素互换存到另一个二维数组中
#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 < 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");
}
}
4.有一个3*4的矩阵求出其中值最大的那个元素的值,以及其所在的行号和列号
#include <stdio.h>
int main(){
int i, j, row = 0, colum = 0, max;
static int a[3][4] = {{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};
max = a[0][0];
for(i = 1; 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, row = %d, colum = %d\n", max,row, colum);
}
6.4 字符数组
6.4.1 字符数组的定义
类型说明符 数组名[常量表达式]
6.4.2 字符数组的初始化
1)逐个字符赋给数组中各元素
2)如果花括号中提供的初值个数大于数组长度,则语法错误;如果初值个数小于数组长度,只讲这些字符赋给数组中前面那些元素,其余为“\0”
3)如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度
4)可以定义二维字符数组
6.4.3 字符串结束标志
字符串用字符数组来处理,结束标识符“\0”
6.4.4 字符数组的输入输出
1)逐个字符输入输出,用格式符%c输入或输出一个字符。
2)将整个字符串一次输入输出,用%s格式符。
3)如果数组长度大于字符串实际长度,只输出到遇“\0”结束。
4)如果一个字符数组中包含一个以上“\0”,则遇到第一个“\0”时输出就结束。
5)可以用scanf函数输入一个字符串。
6.5 字符串处理函数
6.5.1 puts
puts(字符数组):
把一个字符串写入到标准输出 stdout,直到空字符,但不包括空字符。换行符会被追加到输出中。
char str[] = {"China--Beijing"};
puts(str);
//运行结果为:China--Beijing
6.5.2 gets
gets(字符数组):
从标准输入stdin读取一行,并把它存储在str所指向的字符串中。当读取到换行符时,或者到达文件末尾时,它会停止。
函数返回值:
如果成功,该函数返回 str。如果发生错误或者到达文件末尾时还未读取任何字符,则返回 NULL。
char str1[15];
printf("请输入一个字符串:")
gets(str1);
printf("输入的字符串是:%s", str1);
6.5.3 strcat
strcat(字符数组1,字符数组2):
连接两个字符数组中的字符串,把字符串2接到字符串1后面,结果放在字符数组1中,函数调用后得到一个值–字符数组1的地址
char str1[30] = {"People's Republic of "};
char str2[] = {"Chana"};
printf("%s",strcat(str1,str2));
//输出:People's Republic of Chana
6.5.4 strcpy
strcpy(字符数组1,字符数组2):
字符串拷贝函数,将字符串2拷贝到字符数组1中,把从字符数组2地址开始且含有NULL结束符的字符串复制到以字符数组1开始的 地址空间
char str1[10] ,char str2[] = {"Chana"};
strcpy(str1,str2);
6.5.5 strcmp
strcmp(字符数组1,字符数组2)
对两个字符串自左至右逐个字符比较(按ASCII码大小比较),知道出现不同的字符或遇到“\0”为止。
比较结果:
串1 = 串2 函数值为0
串1 > 串2 函数值为正整数
串1 < 串2 函数值为负整数
6.5.6 strlen
strlen(字符数组)
测试字符串长度的函数,函数值为字符串中实际长度,不包括“\0”在内
char str[10] = {"Chana"};
printf("%d",strlen(str));
//结果为5
6.5.7 strlwr 和strupr
strlwr (字符数组):将大写字母转换为小写字母,其它不进行转换
strupr(字符数组):将小写字母转换为大写字母,其它不进行转换
注:strlwr()和strupr()不是标准库函数,只能在windows下(VC、MinGW等)使用,Linux GCC中需要自己定义。
6.6 字符串数组应用举例
1)输出一个图案
#include <stdio.h>
int main(){
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");
}
}
2.输入一行字符,统计其中有多少个单词,单词之间用空格分隔开
#include <stdio.h>
int main(){
char string[100];
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){
num++;
word = 1;
}
}
printf("there are %d words in the line.\n", num);
}
3.有三个字符串,求出其中最大者
#include <stdio.h>
#include <string.h>
int main(){
char str1[20];
char str2[3][20];
int i;
for(i = 0; i < 3; i++){
gets(str2[i]);
}
if(strcmp(str2[0],str2[1]) > 0) strcpy(str1,str2[0]);
else strcpy(str1, str2[1]);
if(strcmp(str2[2], str1) > 0) strcpy(str1, str2[2]);
printf("\n the largest string is : \n%s\n",str1);
}