二分查找以及循环练习

目录

1 在一个有序数组中查找每个具体的某个数字n(二分查找)

2  编写代码,演示多个代码从两端移动,向中间汇聚

3 编写代码实现,模拟用户登录情景,并且只能登陆三次(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序)

4 猜数字游戏


1 在一个有序数组中查找每个具体的某个数字n(二分查找)

常规方法:(缺点:如果要找的数字在最后一位,则需要遍历整个数组,浪费时间)

#include <stdio.h>
int main()
{
	int i = 0;
	int k = 7;
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i < 10; i++)
	{
		if (arr[i] == k)
		{
			printf("找到了,下表为%d", i);
			break;
		}
	}
	if (i == 10)
	{
		printf("没有");
	}
	return 0;
}

二分查找法(折半查找法):(比较,缩小范围)

arr[]={1,2,3,4,5,6,7,8,9,10},在这里还是找数字k=7,

首先用1的下标0(left1),和10的下标9(right1),相加除于2等于4(mid1)余1,用下标为4(mid1)的数字5和7比较,7显然在5的右边;

然后用下标5(mid1+1)(left2)和10的下标9(right2)相加除于2等于7(mid2),用下标为7的数字8和7比较,7在8的右边;

然后用下标6(mid2-1)(right3)和left2(left3)相加除于2等于5(mid3),用下标为5的数字6和7比较,7在6的右边

最后用下标6(mid3+1)和结尾3相加除于2等于6,刚好等于7。

 代码展示:

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

2  编写代码,演示多个代码从两端移动,向中间汇聚

举例说明: “#######” “a#####g” “ab###fg” “abc#efg” “abcdefg” ,就这样一步一步展示出来的就是多个代码从两端移动,向中间汇聚。

代码展示:

#include <stdio.h>
#include <windows.h>
int main()
{
	char arr1[] = "abcdefg";
	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(1000);
		system("cls");
		left++;
		right--;
	}
	printf("%s", arr2);
	return 0;
}

代码理解

代码1展示:

#include <stdio.h>
#include <windows.h>
int main()
{
	char arr1[] = "abcdefg";
	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--;
	}
	return 0;
}

新知识:Sleep()函数,括号内放置数字,单位为毫秒(一秒=1000毫秒=1000 000微秒=1000 000 000纳秒),需要时调用的头文件是#include <windows.h> 。

例如:

Sleep(1000),若是上面的代码块中printf()的后面一行插入(代码2展示),编码时,结果会每隔一秒出现一行。就是第一次出现a#####g,一秒后出现a#####g,又一秒后出现a#####g,一秒后出现a#####g 

                                                          ab###fg                          ab###fg                      ab###fg

                                                                                                  abc#efg                      abc#efg

                                                                                                                                     abcdefg

 代码2展示:

#include <stdio.h>
#include <windows.h>
int main()
{
	char arr1[] = "abcdefg";
	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(1000);
		left++;
		right--;
	}
	return 0;
}

system("cls")清除调试台的内容。

代码3展示:

#include <stdio.h>
#include <windows.h>
int main()
{
	char arr1[] = "abcdefg";
	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(1000);
		system("cls");
		left++;
		right--;
	}
	printf("%s", arr2);
	return 0;
}

复习知识点:打印字符串用%s,打印字符用%c.

知识点总结:(1)整数类型数组,求最大下标是多少:a=sizeof(arr[])/sizeof(arrr[0])-1

                        (2)字符类型:strlen(arr)-1  sizeof(arr[])-2(因为/0也算一个字节)

3 编写代码实现,模拟用户登录情景,并且只能登陆三次(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序)

代码展示:

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

知识点:

(1)scanf("%d",password)  为什么不是 scanf("%d",&password)   因为password是数组名,数组名本来就是地址,所以不需要取地址符号。

(2)strcmp()函数是string compare(字符串比较)的缩写,比较字符串返回整数。(头文件是string.h)

 strcmp(str1,str2),str1=str2,返回0:;str1<str2,返回负数;str1>str2,返回正数。

4 猜数字游戏

电脑随机产生一个数字,玩家猜。

代码展示:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
	printf("**************************\n");
	printf("****    1.play   *********\n");
	printf("****    0.exit   *********\n");
	printf("**************************\n");
}
void game()
{
	int guess = 0;
	int r = rand()%100 + 1;
	while (1)
	{
		printf("请输入猜测的数字:");
		scanf("%d", &guess);
		if (guess < r)
		{
			printf("猜小了\n");
		}
		else if (guess > r)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("猜测正确");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("请重新输入");
			break;
		}
	} while(input);
	return 0;
}

代码新知识:

该代码中,#include <stdlib.h>  #include <time.h> 是产生随机数的头文件(记好)

%100 产生的是(0-99)

C语言中随机产生数字的是rand函数(产生的都是整数)(0-32767), 库文件是<stdlib.h>。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
习题1.8是关于二分查找的题目。二分查找是一种常用的查找算法,用于在有序数组中快速查找指定元素的位置。引用提供了一个C语言二分查找的实现代码。该代码使用了一个名为Position的结构体,在数组L中查找元素X的位置。 具体实现思路如下: 1. 定义两个变量min和max,分别表示数组的最小索引和最大索引。初始时,min=1,max=L->Last,其中L->Last表示数组L的最后一个元素的索引。 2. 使用一个循环语句,不断缩小查找范围,直到找到目标元素或查找范围为空。 3. 在每次循环迭代中,计算中间索引mid=(max+min)/2,将数组的中间元素与目标元素进行比较。 4. 如果目标元素小于中间元素,则更新max=mid-1,缩小查找范围为左半部分。 5. 如果目标元素大于中间元素,则更新min=mid+1,缩小查找范围为右半部分。 6. 如果目标元素等于中间元素,则说明找到了目标元素,返回mid作为目标元素的位置。 7. 如果循环结束后仍然没有找到目标元素,则返回NotFound表示未找到。 注意:该代码的输入样例是一个有序数组L和目标元素X,输出结果是目标元素X在数组L中的位置。而输入样例1和输出样例1是示例输入和输出,不是该代码的输入和输出。 希望对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [《量化投资以Python为工具》资源及源码及习题](https://download.csdn.net/download/fairy_tail20/88248689)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [习题1.8 二分查找 (20 分)](https://blog.csdn.net/weixin_43838785/article/details/101601296)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小刘同学啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值