二分查找以及循环练习

目录

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

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

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

4 猜数字游戏


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

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

#include 
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。

二分查找以及循环练习_第1张图片

 代码展示:

#include 
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 
#include 
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 
#include 
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

例如:

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 
#include 
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 
#include 
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 
#include 
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:;str1str2,返回正数。

4 猜数字游戏

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

代码展示:

#include 
#include 
#include 
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   #include  是产生随机数的头文件(记好)

%100 产生的是(0-99)

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

你可能感兴趣的:(练习题,C语言初阶,c语言)