前言
在我们之前的学习分享当中,向大家详细的介绍了C语言中的循环语句,那么我们仅仅是了解他们的用法还不够,我们需要自己动手写代码,去练习和熟悉知识,那么今天我就与大家一起练习以下
题目
在一个有序数组当中查找具体的某个数字n
首先我们拿到题目进行需求分析,题目让我们在有序数组当中查找某一个数,那我们可以如何查找,从数组的第一个元素开始一直向后直到找到那个数字n或找到数组最后一个数也没有找到,这样是否太过繁琐了,有没有更方便一点的找法可以简化我们的查询步骤,这里我们向大家介绍一种算法叫做二分查找(折半查找)。
二分查找:
假设数组为升序,二分查找就是每一次用数组最中间的元素与待查找元素n进行比较,如果中间元素比n小,那么我们将舍弃后半部分用前半部分的中间元素在与n比较,如果中间元素比n大,那么我们舍弃后半部分,在用前半部分的中间元素与n比较,反复循环,直到找到元素。
我们看到上面的思路,每查找一次,我们就会舍弃一半的数据,是不是查询起来比按次序比较快很多呢?如果上述描述没有理解我们用图来给大家演示一下。假设我们要在有10个元素的有序数组当中查找值为7的元素,我们可以使用二分查找,首先我们算出中间值,最左元素的下标和最右元素的下标之和除以二,就是中间元素的下标,第一次查找我们计算出来中间元素的下标为4,而在数组中下标4对应的值为5,他比我们要查询的7小,所以在他之前的所有元素都比7小,我们要舍弃他之前的所有元素所以我们的最左元素的下标就从0变成了5,第二次查找,我们继续找到中间元素,通过计算(5+9)/2我们算出来第二次查找中间元素的下标为7,对应元素值为8,比待查找元素大,所以在他之后的所以元素都要舍弃,我们把最右元素从9变成了6。之后循环进行上述操作直到找到带查找元素,或者但左值大于右值时,查询失败。
通过上述的分析我们大概了解了这个算法的思路,那么如何在代码中实现呢?我来个大家思路,因为我们要循环操作,所以我们肯定要用循环语句来实现,在循环语句内要实现的功能有,找到中间值并于待查值作比较,通过选择语句来进行判断要执行的功能,最后给出提示找到与否。代码如下:
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int n = 7;//要查找的数
int left = 0;
int right = sizeof(arr) / sizeof(arr[0]) - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] > n)
{
right = mid - 1;
}
else if (arr[mid] < n)
{
left = mid + 1;
}
else
{
printf("找到了,下标为%d",mid);
break;
}
}
if (left > right)
{
printf("找不到了!");
}
return 0;
}
这就是二分查找的基本算法,希望大家可以理解。
编写代码,演示多个字符从两端移动,向中间汇聚。
基本思路:我们需要有两组字符串,一组是我们需要输出的字符,一组是加密文,我们用待输出的字符串的首元素和尾元素依次替换掉加密文,替换一次输出一次,这样就可以达到题目所需的效果。代码如下:
//编写一个代码,演示多个字符从两端向中间移动
int main()
{
char arr1[] = "welcom to bit!!!!";
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);
left++;
right--;
}
if (left > right)
{
printf("打印完成\n");
}
return 0;
}
编写代码实现,模拟用户登录情景,并且只能登录三次。
基本思路:我们需要输入密码,再把输入的密码与正确的密码进行比较,如果相同,登录成功,如果不相同,继续输入,循环最多执行三次,根据判断给出相应的提示。一下为代码演示:
//编写一个代码,模拟用户登录,并且只能登录三次。(只允许输入三次密码,如果密码正确则提示登录成功,如果三次都错登录失败)
int main()
{
char password[] = "0";
int i = 0;
while (i < 3)
{
printf("请输入密码:\n");
scanf("%s", password);
i++;
if (strcmp(password, "123456") == 0)
{
break;
}
}
if (i == 3)
{
printf("你输入的密码有误,登录失败\n");
}
else
{
printf("恭喜你登录成功\n");
}
return 0;
}