6.数组

数组

数组的概念

​ 当我们要定义一个变量时,我们是用(类型名+变量名),例如:int x; 那么我们要定义比较多的变量时,这样就会变得很繁琐。

​ 于是当要定义的变量多,而且相关性也有比较多的情况下,程序用就用数组的来表达。

​ 比如我们想要统计5个日本动作电影女明星的体重平均值时(笑),我们如果一个一个去定义变量的话,会有些复杂,但是呢,用数组就可以很方便。数组的代码示例:

#include <stdio.h>
int main() {						//开始
	int x[5] = { 51 , 52 , 53 , 54 , 55 };//定义一个int类型的数组,一共五个,分布数据用逗号隔开
	printf("%d\n", x[0]);				  //数组的单个调用是从0开始的
	printf("%d\n", x[1]);
	printf("%d\n", x[2]);
	printf("%d\n", x[3]);
	printf("%d\n", x[4]);
	int AVG = (x[0] + x[1] + x[2] + x[3] + x[4]) / 5;//计算平均体重的算式
	printf("她们的体重平均值为%d\n", AVG);			   //打印
	while (1);
	return 0;										 //结束

​ 可以在代码中看出我们用了五个变量,那么使用x[0]、x[1]、x[2]……表示的一组具有相同数据类型的变量集合我们称为数组x,数组中的每一项称为数组的元素,而[0] 、[1]、[2]叫做下标。元素的下标是由0开始的

​ 那么下标的个数只能有一个吗?不止,也可以有两个,三个,比如x[0] [0],x[0] [0] [0],所以根据下标的个数(或者叫维数)的不同,可将数组分为一维数组、二维数组、三维数组、四维数组等。一般,将二维及以上的数组称为多维数组

1.一维数组

​ 定义格式

	类型名 数组名[常量];

​ 类型名如:int,float这些啦,数组名就跟变量名是一样的,常量也就是数组的长度,或者说是存放元素的个数。

数组的初始化:

​ 1,对所有的元素进行初始化

int x[5] = { 1, 2, 3, 4, 5 };

​ 2,定义时,如果只赋值前面的几个个的话,就只会赋值前面的几个,后面的自动赋值为0

int x[5] = { 1, 2, 3 };

​ 3,对数组全部元素赋值,但并不指定长度。

int i[]={ 1, 2, 3, 4 };
一维数组的用法
#include <stdio.h>//代码可以自己上机调试
int main(){
    int a[5] = { 1,2,3,4,5 };//定义一个有五个元素的数组,全部赋值
	for (int i = 0; i < 5; i++) {
		printf("%d\n", a[i]);//打印五个元素的值
	}
	printf("------------------\n");//隔断
	int b[5] = { 6 };//定义一个有五个元素的数组,但是我们只赋值了一个
	for (int i = 0; i < 5; i++) {
		printf("%d\n", b[i]);//打印五个元素的值
	}
	printf("------------------\n");//隔断
	int c[] = { 7,8,9 };//我们直接赋值了三个,没有定义长度
	int i;
	if (c[2]==9) { printf("你赋值了三个\n"); }//验证第三个是否是9
    while(1);//卡屏
    return 0;//程序结束
}

	### 二维数组

​ 使用场景示例:比如我们在探讨5个日本女明星的时候,不止会去评估她们的体重啦,还有年龄,身高等等。

如果只用一维数组就有点不够了,那么就可以用二维数组。

格式:

类型名 数组名[常量1][常量2];

​ 与一维数组不同的就是多了一个下标,[常量1]叫做行下标,[常量2]叫做列下标。

比如说前面的场景示例,我们可以做一个表格:

我们将女明星叫做某某老师

行\列 体重/kg[0] 身高/cm[1] 年龄[2]
[0]a老师 50 155 24
[1]b老师 51 156 23
[2]c老师 52 157 22
[3]e老师 53 158 21
[4]f老师 54 159 20
二维数组的定义与初始化:

1、按行给二维数组赋初值:等号后面有一对大括号,大括号中的第一对括号代表的是第一行的数组元素,第二对括号代表的是第二行的数组元素。

int x[5][3]={{50,115,24},
             {51,156,23},
             {52,157,22},
             {53,158,21},
             {54,159,20}};

2、将所有的数组元素按行顺序写在一个大括号内。二维数组x共有5行,每行有3个元素,其中,第一行的元素依次为50,115,24,第二行元素依次为51,156,23。

int x[5][3]={50,115,24,51,156,23,52,157,22,53,158,21,54,159,20};
//或者
int x[5][3]={50,115,24,
             51,156,23,
             52,157,22,
             53,158,21,
             54,159,20};

3、对部分数组元素赋初值。

int b[3][4] = {{1},{4,3},{2,1,2}};
//其实就是
int b[3][4] = {{1,0,0},
               {4,3,0},
               {2,1,2}};

4、如果对全部数组元素置初值,则二维数组的第一个下标可省略,但第二个下标不能省略。

int a[2][3] = {1,2,3,4,5,6};
//可以写成
int a[][3] = {1,2,3,4,5,6};
二维数组的应用

利用场景示例:比如我们想知道c老师的体重,那么,我们就可以在代码中这样写

#include <stdio.h>
int main(){
    int x[5][3]={{50,115,24},//a老师
            	 {51,156,23},//b老师
            	 {52,157,22},//c老师
          	  	 {53,158,21},//d老师
        	     {54,159,20}};//f老师
    printf("%d\n",x[2][0]);//c老师在第3行,她的体重是在第一列。与一维数组一样,下标都是从0开始的。
    return 0;
}

诶,那么,我们在搜索资料的时候发现,d老师的体重是之前的,现在的她瘦了2kg了。

...//定义数组
	x[3][0] -= 2;//d老师在第4行,她的体重是在第一列。
	printf("%d\n",x[3][0]);//打印验证
...

我们可以利用二维数组来求一些数的和

例如:求3x3矩阵的一条斜线的数据的和;

#include <stdio.h>
int main(){
    int s[3][3]={10,20,30,
                 40,50,60,
                 70,80,90};//也就是算10+50+90的和
    int sum=0,i,j;					//将这个3x3的矩阵转为坐标
    for(i=0;i<3;i++){				//(0,0)(0,1)(0,2)
        for(j=0;j<3;j++){			//(1,0)(1,1)(1,2)
            if(i==j){				//(2,0)(2,1)(2,2)
                sum=sum+s[i][j];	//可以发现这一条斜线的行和列都是一样的。
            }
        }
    }
    printf("%d\n",sum);
    return;
}

我们还可以用来做一些游戏的地图和控制人物行走

比如迷宫找出口。我们可以用3代表人物♀,2代表终点★,1代表墙■,0代表路 ,

先简单的用5*5的

1 0 0 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 0 1
1 3 1 2 1
#include <stdio.h>
#include <conio.h>
int main(){
    int Map[5][5] = { 1,0,0,0,1,
				   1,0,1,0,1,
				   1,0,1,0,1,
				   1,0,1,0,1,
				   1,3,1,2,1 };//地图代号
	int i, j;				//循环变量
	for (i = 0; i < 5; i++) {		//行
		for (j = 0; j < 5; j++) {	//列
			switch (Map[i][j]) {//将结果输出
			case 0:printf("  "); break;
			case 1:printf("■"); break;
			case 2:printf("★"); break;
			case 3:printf("♀"); break;
			}

		}
		printf("\n");
	}
	//让人物动起来,我们可以用wsad来表示上下左右,可以发现上的时候是行号减一,下是行号加一,左是列号减一,右是列号加一
	int x, y, flag = 0;//要先确定好人物的位置,flag的作用是让这个循环结束,并将x,y,确定下来
	for (x = 0; x < 5; x++) {
		for (y = 0; y < 5; y++) {
			if (Map[x][y] == 3) {//找到人物了
				flag = 1;
				break;		//结束if语句
			}
		}if (flag)break;//当flag=1时,结束for(x)的循环。
	}
	while (1) {			//死循环
		switch (getch()) {//适用getch()是在键盘中获取输入的字符,但不会显示,需要调用头文件conio.h
		case 'w':Map[x][y] = 0;//将原本的位置变为路0
			x = x - 1;//将行号减一
			Map[x][y] = 3;//将要走的位置改为人物
			break;
		case 's':Map[x][y] = 0; x = x + 1; Map[x][y] = 3; break;
		case 'a':Map[x][y] = 0; y = y - 1; Map[x][y] = 3; break;
		case 'd':Map[x][y] = 0; y = y + 1; Map[x][y] = 3; break;
		}
		system("cls");//当我输入某个动作后,将屏幕清屏
		for (i = 0; i < 5; i++) {		//重新生成地图
			for (j = 0; j < 5; j++) {	
				switch (Map[i][j]) {
				case 0:printf("  "); break;
				case 1:printf("■"); break;
				case 2:printf("★"); break;
				case 3:printf("♀"); break;
				}

			}
			printf("\n");
		}
	}
    return 0;
}

多维数组在实际的工作中使用不多,使用方法与二维数组相似。

例如

int x[3][4][5];
posted @ 2020-10-24 15:16  onedust  阅读(172)  评论(0)    收藏  举报