C语言学习笔记---数组和二分查找

  1. 数组的概念:

    数组是一组相同类型元素的集合

    数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。

  2. 一维数组的创建和初始化:

    type arr_name[常量值]

    存放在数组中的值被称为数组的元素,数组在创建的时候可以指定数组的大小数组元素类型

    type指数组中存放的数据类型:char short int float等,也可以自定义。

    arr_name:数组名字 [常量值]:数组大小

int math[20];                 float score[8]			char ch[2];
2.1数组的初始化--一般使用大括号,将数据放入大括号中
    int num1[5] = { 1,2,3,4,5 };
	int num2[5] = { 1,2,3 };   
	int num3[ ] = {1,2,3};-----3个元素
	int num4[] = { 1,2,3,4,5,6 };//错误初始化---初始化项太多
2.2数组的类型

数组也是有类型的,数组算是一种自定义类型,去掉数组名留下的就是数组的类型。

如下:

int arr1[10];
int arr2[12];
char ch[8];

arr1数组类型是:int [10]; arr2数组类型是:int [12] ch数组类型是:char [8]

  1. 一维数组的使用:

    3.1数组下标:c语言规定数组是有下标的,从0开始。

     假设数组有n个元素,最后一个元素的下标是n-1.               []:下标引用操作符 
    
int main() {
	int num1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	printf("%d", num1[6]);                         //7
	return 0;
}
3.3数组的输入:

输入数组

3.4数组的存储:

数组的存储

(1)数组在内存中存储是连续存储。

(2)随着下标的增长,地址是由小到大变化的。

  1. size of计算数组元素个数:

    size of:计算类型或变量大小的。-------返回值是size_t类型

    size_t是无符号整型

在这里插入图片描述

printf("%d\n",sizeof(int));-----printf("%zd\n",sizeof(int));
printf(sizeof(10));

以后创建一个数组大小就是 int sz=sizeof(arr)/sizeof(arr[0]);

  1. 二维数组的创建:

    如果把一维数组作为数组的元素,就是二维数组。二维数组作为数组元素的被称为三维数组。

    5.1 二维数组的定义:type arr_name[常量值1][常量值2]^(行 列 )^;

例:

int arr[3][5];
double data[2][8];

解释:3表示数组有3行 5表示每一行有5个元素 int表示数组的每个元素都是整型类型

5.2 二维数组的初始化:

        5.2.1 不完全初始化
int arr1[3][5]={1,2};
int arr2[3][5]={0};
	5.2.2 完全初始化
int arr3[3][5]={1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
int arr4[3][5]={{1,2},{3,4,5},{6,7}};

二维数组在初始化的时候,可以省略行,不能省略列。

int  arr5[][5]={1,2,3};
5.3 二维数组的使用

二维数组行是从0开始的,列也是从0开始的。

在这里插入图片描述
在这里插入图片描述

5.4二维数组的访问:

二维数组的访问

5.5二维数组的输入输出:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int arr[3][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7} };
	int i = 0;
	for (i = 0; i < 3; i++) {
		int j = 0;
		for (j = 0; j < 5; j++) {
			scanf("%d", &arr[i][j]);
		}
		printf("\n");
	}
	//输出
	for (i = 0; i < 3; i++) {
		int j = 0;
		for (j = 0; j < 5; j++) {
			printf("%d", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
5.6二维数组在内存中的存储:
for (i = 0; i < 3; i++) {
		int j = 0;
		for (j = 0; j < 5; j++) {
			printf("&arr[%d][%d]=%p\n",i,j, &arr[i][j]);
		}
		printf("\n");
	}

二维数组的存储
二维数组在内存中也是连续存储的

c99中,引入了变长数组的概念。

int arr[10];
int arr[5+3];
int arr[3]={1,2,3};

vs中虽然支持了变长数组的语法,但是不是全部支持的。

变长数组是不支持vs的。 变长数组是不能初始化的。

int n=0;
scanf("%d\n",&n);
int arr[n];

例题:例1:多个字符从两端移动,向中间汇聚。

welcome to you!!!


w******************!

we****************!!

wel***************!!!

welcome to you!!!

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main() {	
char arr1[] = "welcome to you!!!!";
	char arr2[] = "******************";
	int left = 0;
	int right = strlen(arr1) - 1;
	while (left<=right) {
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);
system("cls");
		left++;
		right--;
	}
	return 0;
}

二分查找:
在一个指定的有序数组中,查找具体的一个数—二分查找

int[]arr={1,2,3,4,5,6,7,8,9,10};
int k=7;

在arr数组中,找7。若找到了,打印7,若找不到,打印找不到。

  1. 遍历查找
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	scanf("%d\n", &k);
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int find = 0;;
	for (i = 0; i < sz; i++) {
		if (k == arr[i]) {
			printf("找出来了,下标输出结果是%d", i);
			find = 1;
			break;
		}
	}
	if (find == 0) {
		printf("找不到\n"); 
	}
	return 0;
}

运行结果

求中间元素的下标:int mid=left+(right-left)/2

**折半查找(二分查找)算法:(必须是有序数组)**

1 2 3 4 5 6 7 8 9 10

每次查找求出中间元素下标,由中间元素下标锁定元素,和所求值比较

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	scanf("%d", &k);
	//查找--二分查找
	int left = 0;
	int right = sz - 1;
	int find = 0;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是%d:\n", mid);
			find = 1;
			break;
		}
	}
		if (find == 0) 
		{
			printf("找不到了");
		}
		return 0;
	}

运行结果

备注:
**Sleep();**叫休眠函数 ms 1000ms=1s

system 用来执行系统命令的

cls 清除窗口

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值