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

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

相关推荐
CHTXRT4 分钟前
2025第十六届蓝桥杯大赛(软件赛)网络安全赛 Writeup
c语言·网络·web安全·网络安全·蓝桥杯·wireshark
小智学长 | 嵌入式1 小时前
单片机-89C51部分:4、固件烧录
c语言·单片机·嵌入式硬件
simple_whu2 小时前
C语言标准库函数setlocale用法详解
c语言
清泉-通达信编程专家-苏大毕业4 小时前
N字形上升形态选股代码如何编写?
c语言·开发语言·算法·青少年编程·启发式算法
qq_447429416 小时前
Linux0.11内存管理:相关代码
linux·c语言
梁下轻语的秋缘14 小时前
每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)
c语言·c++·学习·蓝桥杯
加点油。。。。15 小时前
C语言高频面试题——指针函数和函数指针的区别
c语言·面试
lkbhua莱克瓦2416 小时前
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
c语言·开发语言·数据结构·链表·学习方法·交友·计算器
lwewan17 小时前
26考研——存储系统(3)
c语言·笔记·考研
祁同伟.21 小时前
【数据结构 · 初阶】- 堆的实现
c语言·数据结构