第六章 数组及常用算法

数组

数组的概念

  • 数组是一个变量,由数据类型相同的一组元素组成

    • 变量:内存中的一块空间
    • 数组:内存中的一串连续的空间
  • 数组的结构和基本要素

    • 标示符:数组的名称,用于区分不同的数组
    • 数组元素:向数组中存放的数据
    • 元素下标:对数组元素进行编号
    • 元素类型:数组元素的数据类型
  • 数组只有一个名称,即标识符(用来表示数组的变量名)

  • 元素下标标明了元素在数组中的位置,从零开始

  • 数组中的每个元素都可以通过下标来访问

  • 数组长度固定不变,避免数组越界

见图b

b

数组的使用

  • 一维数组

    • 学生单门学科的成绩
    • 某类别商品的单价
    • 某人N个月的工资
  • 语法:

    • datatype arrayName[size];
1
2
3
4
5
6
7
8
9
#define N 50
int emp_id[N];

const int SIZE = 100;
double prices[SIZE];

int nums[25];
char array_of_name[30];
double curr_salary[35];
  • 一维数组的初始化
1
2
3
4
5
6
7
8
//正确:后面的元素个数与声明的一致
int years[6] = {2012,2013,2014,2015,2016,2017};
//正确:后面5个元素未初始化,默认值为0
int months[12] = {1,3,5,7,8,10,12};
//正确:元素个数为2
in days[] = {1,15};
//错误:未知元素个数!!!!!!
interesting array[] = {};

一维数组的动态赋值

  • 动态地从键盘录入信息并赋值
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#define N 5
int main()
{
double score[5];
int i;
for(i = 0;i < N;i++)
{
printf("请输入第%d门课地成绩:",i + 1);
scanf("%lf",&score[i]);
}
return 0;
}

数组排序

  • 循环录入5个整型数字,进行降序排列后输出结果
    • 方案:使用冒泡排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <stdlib.h>
#define N 5 //宏定义,并不是必须的
int main()
{
int i, j;//循环变量
int abc; //中间换数
int nums[N] = { 16,25,9,90,23 };
//外层循环控制轮数
for (i = 0; i < N - 1; i++)
{
//内层循环控制每轮的比较次数
for (j = 0; j < N - i - 1; j++)
{
if (nums[j] < nums[j + 1])
{
abc = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = abc;
}
}
}
printf("排序后的结果是:\n");
for (i = 0; i < N; i++)
{
printf("%d\t",nums[i]);
}

//外层循环控制轮数
for (i = 0; i < N - 1; i++)
{
//内层循环控制每轮的比较次数
for (j = 0; j < N - i - 1; j++) //这里逆序只换了个符号,只用于顺逆有序的数组
{
if (nums[j] > nums[j + 1])
{
abc = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = abc;
}
}
}
printf("\n逆序后的结果是:\n");
for (i = 0; i < N; i++)
{
printf("%d\t", nums[i]);
}

return 0;
}

数组元素地删除和插入

  • 需求:
    • 根据要求操作排行榜战力值
      • 战力值从大到小排列
      • 删除战斗力42322
      • 插入战斗力41000并保持降序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <stdlib.h>
int main()
{
int count = 5;//表示数组元素的个数
int powers[] = { 42322,45771,40907,41234,40767 };
int deletePower;//用户要删除的战力值
int deleteIndex = -1;//要删除战力值的下标,给一个不可能的值
int i;
int insertPower;//新插入的战力值
printf("战力值: 42322,45771,40907,41234,40767 \n");
printf("请输入要删除的战力值:");
scanf_s("%d", &deletePower);
for (i = 0; i < count; i++)
{
if (deletePower == powers[i])
{
//记录下当前的下标
deleteIndex = i;
break;
}
}
//根据判断(是否找到),执行后续操作
if (-1 == deleteIndex)
{
printf("没有找到该值\n");
}
else
{
//从下标开始,后面一个覆盖前面一个
for (i = deleteIndex; i < count - 1; i++)
{
powers[i] = powers[i + 1];
}
//删除完毕后,让数组总长度-1
count--;
}
printf("删除后的结果为:\n");
for (i = 0; i < count; i++)
{
printf("%d\t", powers[i]);
}
//插入新战力
printf("\n请输入新战力值:");
scanf_s("%d", &insertPower);
powers[count] = insertPower;
count++;
printf("插入后的结果为:\n");
for (i = 0; i < count; i++)
{
printf("%d\t",powers[i]);
}
return 0;
}

二维数组

  • 二维数组

    • 学生多门学科地成绩
    • 玩家的背包数据
    • 游戏角色行走动画
  • 语法:

    • datatype name[rowSize] [colSize];
    • double score[5] [3];
    • int animate[4] [4];
  • 二维数组的动态赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#define ROW 3
#define COL 3
int main()
{
double score[ROW][COL];
int i,j;//循环变量
for(i = 0;i < ROW;i++)
{
for(j = 0;j < COL;j++)
{
printf("第%d位同学的第%d门课成绩:",i+1,j+1);
scanf("%lf",&score[i][j]);
}
}
//打印成绩
for(i = 0;i < ROW;i++)
{
for(j = 0;j < ROW;i++)
{
printf("%.2lf\t",score[i][j]);
}
printf("\n");
}
return 0;
}
更新于

请我喝[茶]~( ̄▽ ̄)~*

Chen 微信支付

微信支付

Chen 支付宝

支付宝

Chen 贝宝

贝宝