老九C 31~36 数组 一维数组 二维数组

  • 理解数组
  • 二维数组
  • 数组实现常用算法

数组

变量: 内存中的一块独立空间
数组: 内存中的一串连续空间, 数据类型相同的数据集合
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]);
    }
}

例题

  1. 循环输出数列 8,4,2,1,23,344,12值,
  2. 求所有数值的和和平均值,
  3. 输入一个数据检测是否包含此数据.
计算机中的查找:
默认方法为穷举法
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轮顺序
125; 16; 9; 90; 23
225; 16; 9; 90; 23
325; 16; 90; 9; 23
425; 16; 90; 23; 9
  1. 需要多轮比较 (数组长度-1轮)
  2. 第一轮比较了4次 (数组长度-1次)
  3. 之后每一轮比较次数比上一轮-1次

第二轮循环比较

第n轮顺序
125; 16; 90; 23
225; 90; 16; 23
325; 90; 23; 16

第三轮循环比较

第n轮顺序
190; 25; 23
290; 25; 23

第四轮循环比较

第n轮顺序
190; 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.

  1. 学生的多门课程
  2. 游戏背包数据
  3. 游戏角色行走动画

语法:
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. 注意检查大括号涵盖范围. 什么应该在循环中,什么不应该在.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值