- 理解数组
- 二维数组
- 数组实现常用算法
数组
变量: 内存中的一块独立空间
数组: 内存中的一串连续空间, 数据类型相同的数据集合
eg. 新闻标题
为什么使用数组?
减少变量数量, 方便操作内存.
数组是连续的内存空间
数组的结构和基本要素:
- 标识符: 数组名称
- 数组元素: 数组中存放的数据
- 元素下标: 数组中每一个元素的编号(从0开始)
- 元素类型: 数组元素的数据类型
一维数组
eg. 学生单门学科成绩
datetype arrayName[size];
int nums[25];
#define N 50 //define不定义变量类型
int emp_id[N];
...
const int SIZE = 100; //const定义变量类型
double prices[SIZE]
一位数组的初始化
int years[6] = {1,2,3,4,5,6}; //常规写法
int months[12] = {1,3,5,7,8,10,12}; //剩余元素默认为0
int days[] = {1,15}; //数组大小会自动设置为2
int arry[] = {}; //错误写法
例题 动态录入成绩
#include <stdio.h>
#define N 5
int main() {
double score[N];
int i;
for(i = 0; i < 5; i++)
{
printf("请输入第%d门成绩:", i+1);
scanf("%lf", &score[i]);
}
for( i = 0; i < N; i++)
{
printf("请输入第%d位同学的成绩是: %.2lf\n", i+ 1, score [i]);
}
}
例题
- 循环输出数列 8,4,2,1,23,344,12值,
- 求所有数值的和和平均值,
- 输入一个数据检测是否包含此数据.
计算机中的查找:
默认方法为穷举法
for(i = 0; i < 7; i++)
{
//一个一个元素查找
//如果要查找的数字跟数组中的某个元素相同
if(searchNum == nums[i])
{
//找到了
printf("找到了\n");
//找到后,跳出循环
break;
}
if(i == 7)
{
printf("没有");
}
else
{
printf("找到了");
}
#include <stdio.h>
#define N 5
int main() {
int nums [] = {8, 4, 2, 1, 23, 344, 12};
int i;
int sum = 0; //和
double avg; //平均值
int input;
int judge = 0; //判断数字
printf(".......................\n");
for( i = 0; i < 7 ; i ++)
{
printf("%d\n", nums[i]);
}
printf(".......................\n");
for( i = 0; i < 7; i ++)
{
sum += nums[i];
}
avg = sum/7;
printf("%d\n%.2lf\n", sum, avg);
printf(".......................\n");
printf("请输入数字:");
scanf("%d", &input);
for( i = 0; i<7; i ++)
{
if(input == nums[i])
{
judge = 1;
}
}
if(judge == 1){
printf("包含这个数字\n");
}
else if(judge == 0)
{
printf("不包含这个数字\n");
}
}
例题 循环输入5个数字,将序排列后输出结果 (16; 25; 9; 90; 23)
方案: 冒泡排序
原理: 遍历和交换, 某个数字如果小于后面的数字, 那么就交换
第一轮循环比较
第n轮 | 顺序 |
---|---|
1 | 25; 16; 9; 90; 23 |
2 | 25; 16; 9; 90; 23 |
3 | 25; 16; 90; 9; 23 |
4 | 25; 16; 90; 23; 9 |
- 需要多轮比较 (数组长度-1轮)
- 第一轮比较了4次 (数组长度-1次)
- 之后每一轮比较次数比上一轮-1次
第二轮循环比较
第n轮 | 顺序 |
---|---|
1 | 25; 16; 90; 23 |
2 | 25; 90; 16; 23 |
3 | 25; 90; 23; 16 |
第三轮循环比较
第n轮 | 顺序 |
---|---|
1 | 90; 25; 23 |
2 | 90; 25; 23 |
第四轮循环比较
第n轮 | 顺序 |
---|---|
1 | 90; 25 |
#include <stdio.h>
#define N 5
int main() {
int nums[N] = { 16, 25, 9, 90, 23}; //输入数组
int i, j; //循环变量ij
int temp; //用来交换的临时变量
for(i = 0; i<5; i++) //外层循环控制"轮"
{
for( j = 0; j < N - i - 1; j ++)//内层循环控制"次数"
{
/*如果当前值小于后一个就交换*/
if(nums[j] < nums[j + 1])
{
temp = nums[j];
nums[j] = nums [j + 1];
nums [j + 1] = temp;
}
}
}
printf("排序后的结果是: \n");
for( i = 0; i < N; i++)
{
printf("%d\t", nums[i]);
}
}
例题:无序元素互换
for (i = 0; i < N/2; i++)
{
temp = num[i];
nums[i] = num [N - i - 1];
nums[N - i - 1] =temp;
}
结束
数组元素的删除和插入
删除的逻辑
1 2 3 4 5
1. 查找要删除的数字下标 2;
2. 从下标开始, 后面一个数字覆盖前面一个数字 --> 12450
3. 数组长度减一
作业:
战力排行表( 255, 244, 233, 222, 211)
删除用户想删除的战力值, 输出结果
增加用户想增加的战力值.
二维数组
eg.
- 学生的多门课程
- 游戏背包数据
- 游戏角色行走动画
语法:
datatype name[rowSize][colSize];
eg. double socre[5][3];
例子:
使用二维数组表示学生成绩
4个学生的三门课成绩
int main() {
int i, j;
double scores[4][3] = {
{98, 67 ,89},
{89, 67, 88},
{99, 77, 55},
{79, 99, 67}
};
printf("语文\t数学\t英语\n");
//使用循环打印每个数组元素
for(i = 0; i < 4; i++) //外层控制行,有几个同学
{
for(j = 0; j < 3; j++) //内层控制列, 每科成绩
{
printf("%-8.2lf", scores[i][j]);
}
printf("\n");
}
}
其中 %-8.2lf 中的 -8 表示左对齐,至少占八个字符
教训:
4. 注意检查大括号涵盖范围. 什么应该在循环中,什么不应该在.