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];

浙公网安备 33010602011771号