C语言数组(下)

我希望各位可以在思考之后去看本期练习,并且在观看之后独立编写一遍,以加深理解,巩固知识点。

练习一:编写代码,演⽰多个字符从两端移动,向中间汇聚

我们依旧先上代码

cpp 复制代码
//编写代码,演⽰多个字符从两端移动,向中间汇聚
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
int main()
{
	char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
	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(500);
		system("cls");
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

第一步

对于这道题来说,我们要先搞清楚怎么样让字符从两端向中间移动。既然题目说的是多个字符,那就会用到数组去存放这些字符;移动是一个过程,所以这道题必定要使用循环。那我们先创建出所需要的数组:

cpp 复制代码
#include<stdio.h>
int main()
{
	char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
	char arr2[] = { "###################################################" };
	return 0;
}

这里英语句子是有意义的,各位感兴趣可以试着翻译,嘻嘻。

接着我们要创建循环体系,从两端开始,那就要左右各设置一个变量去满足题意。

cpp 复制代码
#include<stdio.h>
int main()
{
	char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
	char arr2[] = { "###################################################" };
	int left = 0;
	int right = strlen(arr2) - 1;
	while (left <= right)
	{

	}
	return 0;
}

注意,right的值应该是字符串长度-1,原因是我们要用的是数组下标,如果不明白可以去看上一篇知识点讲解。从两端开始,当 left 不再<= right 的时候,说明我们的移动也结束了。

第二步

多个字符移动汇聚

cpp 复制代码
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
	char arr2[] = { "###################################################" };
	int left = 0;
	int right = strlen(arr2) - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		left++;
		right--;
	}
	return 0;
}

怎么样,是不是体会到移动的感觉了,接下里我们就要去让他称为一个动态的移动过程了。

第三步

这一步有分两个点:一是在每次打印之间都要设置停顿。

二是在每下一次打印之前都要清理掉前一次的打印。

那我们就要用到新知识了:

第一个是Sleep函数,这个函数的作用是生成停顿,需要包含头文件(windows.h)

形式:Sleep(时间) 单位是毫秒

第二个是系统提供的清屏指令符cls,需要包含头文件(stdlib.h)

形式:stytem("cls");

写出代码就是

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
int main()
{
	char arr1[] = { "Learn arrays well, and suffer less in the future!!!" };
	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(500);
		system("cls");
		left++;
		right--;
	}
	printf("%s\n", arr2);
	return 0;
}

这里要注意你两个函数的位置,如果放到了printf 前面的话,就得不到想要的效果了。动态过程不便呈现,各位自行尝试效果。

练习二:二分查找

在有序数组中查找某个数的下标。

老样子,上代码:

cpp 复制代码
#include<stdio.h>
int main()
{
	//创建数组
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//k就是我们要找的元素,这里也可以写成scanf输入变量
	int k = 7;
	//二分法
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = sz - 1;
	int flag = 0;
	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标是%d\n", mid);
			flag = 1;
			break;
		}
	}
	if (flag == 0)
	{
		printf("找不到\n");
	}
	return 0;
}

这道题的思路和上一道有相似之处,我们可以对比着来看。注意这道题是有序数组中的查找,在无序的数组中,这种方法不适用。

首先,创建数组和需要查找的变量是必不可少的,注释中也有相应的替换方法,这里不多讲了。

我着重讲一下二分法,根据上面的数组可知,元素下标最大的9,最小的是0,而我们要寻找的元素的下标是6,我们就可以通过(max+min)/2的方法先把所有的元素去掉一半,如果没找到,再重复上一步,这样的方式在数组元素非常多的时候可以极大的减少计算机的执行时间,提高了运行效率。

还有两个细节,第一,中间值mid必须在循环内部,因为在每次改变left 或者 right之后,我们也需要改变中间值。第二 flag 是用于找不到你想查找数时的必要办法。

本期到此就结束了,如果还有不太清楚的地方,欢迎在评论区讨论。

相关推荐
一路往蓝-Anbo2 小时前
STM32单线串口通讯实战(三):协议层设计 —— 帧结构、多机寻址与硬件唤醒
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网
爱吃生蚝的于勒2 小时前
【Linux】零基础深入学习动静态库+深入学习地址
linux·运维·服务器·c语言·数据结构·c++·学习
♛识尔如昼♛3 小时前
C 基础(4) - 字符串和格式化输入输出
c语言·开发语言
散峰而望11 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
冷凝雨12 小时前
复数乘法(C & Simulink)
c语言·开发语言·信号处理·simulink·dsp
智者知已应修善业13 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
量子炒饭大师14 小时前
Cyber骇客的逻辑节点美学 ——【初阶数据结构与算法】二叉树
c语言·数据结构·c++·链表·排序算法
量子炒饭大师15 小时前
Cyber骇客神经塔尖协议 ——【初阶数据结构与算法】堆
c语言·数据结构·c++·二叉树·github·
Herbert_hwt16 小时前
C语言赋值操作符详解:从基础使用到避坑指南
c语言
!停17 小时前
C语言顺序表
c语言·开发语言