【C语言】折半查找(二分查找)讲解、输密码+整活(关机程序)

✨折半查找(二分查找)

在我们的日常生活中,给定一个场景,比如说你买了一个东西价格是98元,然后让你的朋友猜一下它的价格,你说,这个东西在150元以内,这个时候你的朋友会怎么猜呢?你的朋友肯定不会从1开始猜吧,他应该会给出比如说他会猜75元,然后你会说小了,让他再猜…

这个时候引入一个可以在有序数组中查找数字的方法,折半查找,也叫二分查找。

: 在一个有序数组中查找具体的某个数字k。

分析:假设在1-10的数字中,找到7。因为它是有序数组,所以这个时候可以采用折半查找的办法,现在我们要找到7,创建一个整型数组arr,用1和10的下标相加除以二算出中间值mid的下标是4,也就是数字5,5<7,所以这个时候被查找的范围减少一半,新一次的查找范围就在5的右边,左边的值变成了mid+1,10还是最右边,第二次查找,中间值的下标是7,就是数字8,7<8,要查找的值在下标7的左边,这个时候只剩下下标是5和6的6和7,第三次求的中间值为下标6,第四次就剩下下标为6的数字7,mid=mid,就查到了。向每次查找都减少一半的方式就叫折半查找。
当左边的下标大于右边的下标时,说明查找不到。
在这里插入图片描述
在这里插入图片描述

答案:

#include <stdio.h>

int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int sz = sizeof(arr) / sizeof(arr[0]);
	int left = 0;//下标
	int right = sz - 1;
	while (left <= right)
	{
	   int mid = (left + right) / 2;
	   if (arr[mid] < k)
		{
		  left = mid + 1;
		}
		else if (arr[mid] > k)
			{
			  right = mid - 1;
			}
		else
			{
				printf("找到了,下标是:%d\n", mid);
				break;
			}
			}
	    if (left > right)
			{
				printf("找不到\n");
			}
		
			return 0;
		}

在这里插入图片描述

注意:计算mid那一行一定要放在循环里头,因为mid每次查找都要重新计算。while的循环条件一定要写成left<=right,要不然就找不到了。还有这个地方计算mid,当数组里面的元素非常大的时候,left和right相加就有可能会溢出,这个时候可以用另一种方式计算,就是(right-left)/2+left。

✨模拟用户登录场景

题:模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成,如果三次均输入错误,则退出程序。

分析:首先密码可以输入三次,我们可以写一个循环来解决,如果循环终止就通过break来跳出循环。然后在循环里判断密码是否正确。如果输出三次均错误,就跳出循环。这里注意,比较两个字符串是否相等,不能直接使用==,而应该使用一个库函数:strcmp。使用该库函数需要包含头文件<string.h>。

程序代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
	int i = 0;
	char password[11] = { 0 };
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:>");
		scanf("%s", password);
		if (strcmp(password, "abcdef") == 0)
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	if (i == 3)
	{
		printf("三次密码均输入错误,退出程序\n");
	}
	return 0;
}

执行结果:在这里插入图片描述

✨整活(关机程序)

关机程序:
1.电脑运行起来后,一分钟内关机。
2.如果输入:你是我的神,就取消关机。

在命令行窗口cmd中输入shutdown -s -t 60可以设置电脑在一分钟之后关机,输入shutdown -a取消关机。在程序中可以把shutdown -s -t 60和shutdown -a放入system函数中。

:以下代码可适当娱乐🐶

#include<stdio.h>
#include<string.h>
int main()
{
	char input[20] = {0};
	system("shutdown -s -t 60");
	again:
	printf("请注意,你的电脑在60秒内关机,如果输入:你是我的神,就取消关机\n");//友好的提示doge
	scanf("%s", input);
	if (strcmp(input, "你是我的神") == 0)
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
	return 0;
}

💫写在最后:这是我写的第一篇博客✌️,如果觉得写的还行的话,给一个三连支持以下叭👌,📣感谢!

评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值