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 是用于找不到你想查找数时的必要办法。

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

相关推荐
五味香2 小时前
Linux学习,ip 命令
linux·服务器·c语言·开发语言·git·学习·tcp/ip
lb36363636362 小时前
整数储存形式(c基础)
c语言·开发语言
浪里个浪的10242 小时前
【C语言】从3x5矩阵计算前三行平均值并扩展到4x5矩阵
c语言·开发语言·矩阵
<但凡.3 小时前
编程之路,从0开始:知识补充篇
c语言·数据结构·算法
f狐0狸x3 小时前
【数据结构副本篇】顺序表 链表OJ
c语言·数据结构·算法·链表
CoderBob4 小时前
【EmbeddedGUI】脏矩阵设计说明
c语言·单片机
浪里个浪的10244 小时前
【C语言】计算3x3矩阵每行的最大值并存入第四列
c语言·开发语言·矩阵
敲敲敲-敲代码4 小时前
游戏设计:推箱子【easyx图形界面/c语言】
c语言·开发语言·游戏
simple_ssn4 小时前
【C语言刷力扣】1502.判断能否形成等差数列
c语言·算法·leetcode
ahadee5 小时前
蓝桥杯每日真题 - 第10天
c语言·vscode·算法·蓝桥杯