嵌入式课程day10-C语言数组
目录
七、数组
7.1数组是什么?
7.2数组的使用
7.3定义数组
7.4数组初始化
7.5冒泡排序
7.6二分法查找
七、数组
7.1数组是什么?
存储多个同种类型的数据 ,方便数据处理
7.2数组的使用
先定义再使用
7.3定义数组
存储多少数据 数据的数据类型 数组名
元素:数组中数据可以统称为元素。
>> 元素类型 数组名[元素个数];
数组下标:定义完数组后就自动有了。从0开始 ~ 元素个数 - 1 , 不要超标
7.4数组初始化
定义数组就给空间数据
int a[5] = {1,6,8,19,20};
int b[5] = {1,2}; // 初始化的时候没有赋值空间默认补0 {1,2,0,0,0}
int c[5] ={1,2,4,5,67,8,9,9,10}; // {1,2,4,5,67}
// 省略个数的初始化 -- 只有在初始化可以省略个数,定义的时候不可以省略
int a[] = {1,3}; // 2个int型空间
int a[]; // 1个空间都没有
int a[] = {}; // 1个空间都没有
int a[] = {0}; // 1个int
练习1:int a[] = {1,2,3,4,5,6,7,8,9,10};
// 计算偶数项(下标偶数)的和和奇数项(下标奇数)的和
//将数组颠倒过来
#include<stdio.h>
int main() {
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int i;
int sum1 = 0, sum2 = 0;
for ( i = 0; i < 10; i += 2){
sum1 += a[i];
sum2 += a[i+1];
}
printf("奇数项和%d\n", sum1);
printf("偶数项和%d\n", sum2);
int b;
for (i = 0; i < 10/2; i++)
{
b = a[i];
a[i] = a[9 - i];
a[9 - i] = b;
}
for (i = 0; i < 10; i++)
printf("%d ", a[i]);
}
7.5冒泡排序
冒泡排序-- - 数组里面的数据是乱序的。
冒泡排序规则:
一轮排序确定一个数据的位置。
n个数需要比较 n - 1轮
每一轮里面 相邻的(下标相邻) 两个数据进行比较
每一轮里面比较次数: 数据个数 - 当前是第几轮。
冒牌排序思路:
1、准备数组 -- 有乱序数据
2、数组里面的数据个数
3、冒泡排序逻辑
0 ~< n - 1 -- - i 循环
{
// 第i轮的排序
0 ~< 数据个数 - 1 - i -- j 比较次数
{
// 相邻的两个数据-数组中的数据 -- 根据 规则确定要不要交换位置
// 数组名[j]--前 和 数组名[j+1] --- 后
// 从小到大 什么时候交换数组名[j] 和 数组名[j+1]位置
// 数组名[j] > 数组名[j+1] ---交换 数组名[j] 和 数组名[j+1]里面的数值
// 从大到小 什么时候交换数组名[j] 和 数组名[j+1]位置
// 数组名[j] < 数组名[j+1] --- 交换 数组名[j] 和 数组名[j+1]里面的数值
}
}
完成代码:
int a[] = { 10,40,67,8,29,3,100,6,7,89 };
int b = sizeof(a) / sizeof(a[0]);
int i, j, z, count;
for (i = 0; i < b - 1; i++)
{
for (j = 0; j < b - i - 1; j++)
{
if (a[j] > a[j + 1])
{
count = a[j];
a[j] = a[j + 1];
a[j + 1] = count;
}
}
}
for (i = 0; i < b; i++)
{
printf("%d ", a[i]);
}
7.6二分法查找
二分查找:必须是有序的数组 ,在有序的数组中查找某一个数据存不存在。
存在就输出 下标, 不存在就输出不存在。
int a;
scanf("%d", &a);
int arr[] = { 2,9,20,46,78,90,130,205,306 };
二分查找思路:
准备一个有序的数组 -- 从小到大
查找的数据 -- 目标数据
计算数组数据个数
// 准备下标
left = 0;
right = 数据个数 - 1
while (1)
{
// 设置查不到的终止条件
if (right < left)
{
printf("找不到");
break;
}
mid = (left + right) / 2;
数组名[mid] > 目标数据
{
right = mid - 1;
}
数组名[mid] < 目标数据
{
left = mid + 1;
}
数组名[mid] == 目标数据
{
输出 mid
结束查找
}
}
代码:
#include <stdio.h>
#include <string.h>
int main() {
int arr[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 };
int findnum;
scanf("%d", &findnum);
int left = 0, right = 20 - 1;
while (1) {
if (right < left) {
printf("找不到");
break;
}
int mid = (left + right) / 2;
if (arr[mid] > findnum)
right = mid - 1;
if (arr[mid] < findnum)
left = mid + 1;
if (arr[mid] == findnum) {
printf("找到了他在a[%d]", mid);
break;
}
}
return 0;
}