您的位置:首页 > 编程语言 > C语言/C++

黑马程序员----- c语言 数组学习

2015-07-24 17:34 453 查看


——Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
——-

数组的定义

使用数组为了方便一次性定义多个变量,同时为了方便使用这些变量

一个数组就是多个变量的有序集合

1)定义一个数组,就定义了很多的变量

2)这每一个变量都是数组的一个元素或成员

3)数组是一个有序的集合,也就是说可以使用一个数字引用变量

4)数组中每一个元素的使用和一个一般的变量使用一样

 

 一维数组是元素都不是数组的数组

1)数组元素是一个简单的类型或其他非数组的类型

2)一维数组好比一串羊肉串,一个元素挨着一个元素

3)一个数组只允许存储一种数据类型的数据

语法:

数据类型 数组名[ 数组长度 ];

1)数据类型表示数组中每一个元素的类型

2)数组的名字就是一个标识符

3)数组长度可以是一个表达式,表示数组里面有几个变量,常常称为数组的长度

例如:
int nums[3];

表示定义了一个名字为 nums 的数组. 使用 nums 这个名字引用数组,数组里面有 3 个变量,都是 int 类型的

例如:
char chs[10];

表示定义了一个长度为 10 的,存储 char 类型的数组

注意:
早期 C 语言不允许使用变量定义数组
C99 标准中允许使用变量定义数组长度

数组的初始化定义

先定义再初始化,使用下标为每一个元素赋值

语法是 数组名[下标]

int nums[5];

nums[0] = 1;

nums[1] = 2;

nums[2] = 3;

nums[3] = 4;

nums[4] = 5;

定义的同时进行初始化

1)完全初始化
int nums[5] = { 1, 2, 3, 4, 5 };

2)不完全初始化,没有提供数据的默认初始化为 0 
int nums[10] = { 1, 2, 3, 4, 5 };

3)省略数组长度,由编译器自动判断
int nums[] = { 1, 2, 3, 4, 5 };

数组引用元素

引用数组元素表示使用数组中的每一个变量

使用下标引用数组中指定的变量

语法:
数组名[ 下标 ]

例如:
int nums[] = { 1, 2, 3 };

printf("%d\n", nums[0]);

printf("%d\n", nums[1]);

printf("%d\n", nums[2]);

引用数组元素和使用指定类型变量一样,可以读取数据赋值等

1)读取数据

2)获取数据(打印,计算)

3)自增等

数组的遍历

使用 for 循环对数组进行遍历

for (int i = 0; i < length; i++) {

printf("%d\n", nums[i] );

}


冒泡排序

1、冒泡排序:
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

2、冒泡排序算法的运作如下:
1)比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
3)针对所有的元素重复以上的步骤,除了最后一个。
4)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

3)演示与分析
如果存储的数据为:12,3,40,25,7
如果需要排序,根据冒泡排序的思想分为下面几步:
1)第一轮,两两比较
12和3比,交换得到:3,12,40,25,7
12和40比,不变:3,12,40,25,7
40和25比,交换:3,12,25,40,7
40和7比,交换:3,12,25,7,40
2)第二轮,两两比较
3与12比较,不变:3,12,25,7,40
12与25比较,不变:3,12,25,7,40
25与7比较,交换:3,12,7,25,40
3)第三轮,两两比较
3与12比较,不变:3,12,7,25,40
12与7比较,交换:3,7,12,25,40
4)第四轮,两两比较
3与7比较,不变:3,7,12,25,40
排序完成
for (int i =0;i <10 ;i ++)
{
for (int  j =1; j+i<10 ;j ++){

if (nums[i] > nums[j+i]){

int temp =nums [i];

nums [i]=nums[j+i];

nums[j+i]=temp ;

}
}
}


二维数组

二维数组名作为函数参数,就是将二维数组的首地址作为参数传递给函数,定义语法为:

void func( int nums[2][3], int row, int column ) {

调用:

int main (void) {
...
int nums[2][3];
...
func(nums, 2, 3);
...

}

注意:参数第一个数字可以省略

特点:函数内与函数外可以看成是同一个二维数组

迷宫游戏

#include <stdio.h>

#define ROW 6
#define COL 6

int main(int argc, const char * argv[]) {

char map[ROW][COL]={
{'#','#','#','#','#','#'},
{'#','O','#','#',' ',' '},
{'#',' ','#','#',' ','#'},
{'#',' ',' ','#',' ','#'},
{'#','#',' ',' ',' ','#'},
{'#','#','#','#','#','#'}
};

char  input ;
int x=1;
int y=1;
while (1)
{

for (int i =0 ;i < ROW ;i++){
for (int j =0;j <COL ;j++){

printf ("%c",map[i][j]);//  打印数组元素
}
printf ("\n");

}

if (x ==0||y==0||x==5||y==5 )// 表示在数组的边缘则  胜利
break ;   //胜利则推出循环

printf ("请输入w(上)s(下)a(左)d(右)");
while (1)
{
printf (">  ") ;
input = getchar() ;//  输入字符
while ( getchar()!='\n');//  吸收回车键字符

if (input =='w'|| input =='a'||input =='s'||input =='d'){
break ;   //如果输入正确则退出while 循环语句
}

}
switch (input){
case 'w':
if (map[x-1][y]==' '){
int temp =map[x-1][y];
map[x-1][y]=map[x][y];
map[x][y]=temp ;
x--;

}
break ;
case 's':
if (map [x+1][y]==' '){

int temp =map[x+1][y];
map[x+1][y]=map[x][y];
map[x][y]=temp ;
x++;
}
break;
case 'a':
if (map [x][y-1]==' '){

int temp =map[x][y-1];
map[x][y-1]=map[x][y];
map[x][y]=temp ;
y--;
}
break;
case 'd':
if (map [x][y+1]==' '){

int temp =map[x][y+1];
map[x][y+1]=map[x][y];
map[x][y] = temp ;
y++;
}

break;

}

system ("clear");

}
printf("恭喜你重获自由...\n");

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: