C语言基础(五)数组的定义和使用


系列合集 初窥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);
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rpk712

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值