C语言——选择和循环结构练习(2)

C语言——选择和循环结构练习(2),第1张

目录

1.二分法(折半查找算法)

2.关机小程序

3.字符从两端向中间移动

4.猜数字小游戏

正常版:

关机版


1.二分法(折半查找算法)

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

关键是实现一个二分查找的函数。

二分查找的思想:

比如一个有序数组1 2 3 4 5 6 7 8 9 10,假设我们需要在这十个数中找到数字2,那我们如何查找呢?首先我们可能想到使用暴力的方式去解决这个问题,把每一个数字都和2进行比较,全部遍历一遍,这种方法固然有效,可是如果这个数组中有百万,千万个元素呢,用暴力的方式去解决会大大增加我们的计算量。

而二分查找可以有效减少计算量,二分查找的前提得是在有序x数组内,我们可以先拿中间的数字6和2比较,6>2那么我们就将2和1-6的中间值3比较,2<3则将2与1-3的中间值2比较,2=2,此时就可以确定2的位置。

从上面例子中可以看出,二分查找每查找一次,就可以为我们减少一半的计算量,这大大缩小了复杂度,二分查找的查找次数就为k=log2n,n就是数组中总元素个数。算法复杂度即是while循环的次数,二分查找的时间复杂度可以表示“O(h)=O(log2n)”。

下面代码就是从数组中找到7所在的位置,返回下标

int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    int left = 0;
    int right = sizeof(arr) / sizeof(arr[0]) - 1;
    int key = 7;
    int mid = 0;
    while (left <= right)
    {
        mid=(left + right) / 2;//如果数字过大就会导致left + right超出整型的范围,会                                                                                
                                      //溢出,可以写成((right-left))/2+left
        if (arr[mid] > key)
        {
             right = mid - 1;
        }
        else if (arr[mid] < key)
        {
             left = mid + 1;
        }
        else
        {       
             printf("找到了,下标是%d\n", mid);
             break;
        }
    }
    if (left > right)
        printf("找不到\n");
    return 0;
}

二分查找函数:
int bin_search(int arr[], int left, int right, int key)
{
    int mid = 0;
    while(left<=right)
    {
        mid = (left+right)>>1;
        if(arr[mid]>key)
        {
            right = mid-1;
        }
       else if(arr[mid] < key)
        {
            left = mid+1;
        }
        else
            return mid;//找到了,返回下标
    }
    return -1;//找不到
}
2.关机小程序

go to语句的运用

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

int main()
{
        char input[] = "0";
        
    //system("shutdown -s -t 60");//shutdown -s关机指令,-t 60设置关机时间60s
again:
        printf("请注意,你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");
        scanf("%s", input);
        if (strcmp(input, "我是猪") == 0)//strcmp比较字符串指令,头文件是stdio.h
        {
               system("shutdown -a");//shutdown -a取消关机指令
        }
        else
        {
               goto again;
        }
        return 0;
}

法二:不使用go to

int main()
{
        char input[20] = { 0 };
        system("shutdown -s -t 60");//shutdown -s关机指令,-t 60设置关机时间60s
        while (1)
        {
               printf("请注意,你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");
               scanf("%s", input);
               if (strcmp(input, "我是猪") == 0)//strcmp比较字符串指令,头文件是stdio.h
               {
                       system("shutdown -a");//shutdown -a取消关机指令
                       break;
               }
        }
        return 0;
}
3.字符从两端向中间移动

//welcome to CQUPT!!!
//###################
//w#################!
//we###############!!
//...
//welcome to CQUPT!!! 

#include
#include
int main()
{
        char arr1[] = "welcome to CQUPT!!!!";
        char arr2[] = "####################";
        int left = 0;
        int right = sizeof(arr1) / sizeof(arr1[0]) - 2;//int right = strlen(arr1)-1
        
        while (left <= right)
        {
               arr2[left] = arr1[left];
               arr2[right] = arr1[right];
               printf("%s\n", arr2);
               Sleep(1000);//休眠一秒,对应头文件#include
               system("cls");//system是一个库函数,可以执行系统命令,cls是清空屏幕
               left++;
               right--;
        }
        printf("%s\n", arr2);
        return 0;
}
4.猜数字小游戏

实现一个猜数字的小游戏,要求功能有:

1.要有菜单。

2.每次猜完要提示玩家猜大了、猜小了或者是猜对了。

3.和关机小程序联动:实现一个一分钟内猜不对就关机的恶搞猜数字小游戏

正常版:
#include 
#include
#include
void menu()
{
        printf("***********************************\n");
        printf("***********    1.play **********\n");
        printf("***********    0.exit **********\n");
        printf("***********************************\n");
}
//game猜数字游戏函数
void game()
{
        //srand unsigned int,srand会返回一个unsigned int类型的值
                                          //所以说需要把time生成的数强制转换为unsigned int
        //NULL=void *(0)
        //RAND_MAX;
        //生成随机数0-32767
        int ret = rand()%100+1;//生成随机数的函数,rand()%100+1 模100就会生成0-99的数字,+1后是1-100
        int guess = 0;
        //猜数字
        while (1)
        {
               printf("输入数字\n");
               scanf("%d", &guess);
               if (guess > ret)
               {
                       printf("猜大了\n");
               }
               else if (guess < ret)
               {
                       printf("猜小了\n");
               }
               else
               {
                       printf("猜对了\n");
                       break;
               }
        }
}
int main()
{
        int input = 0;
        srand((unsigned int)time(NULL));
        do
        {
               menu();
               printf("请选择:>");
               scanf("%d", &input);
               if(input==1)
               {
                       game();
                       break;
               }              
               else if (input == 0)
               {
                       printf("退出游戏\n");
                       break;
               }       
               else
               {
                       printf("选择错误,请重新输入!\n");
               }
        } while (input);
        return 0;
}

解释一下srand和rand的用法:

rand()会随机生成一个0-32767的数字,但是每次生成的数都是固定的,所以需要srand生成一个随机数种子,srand((unsigned int)time(NULL));// 这个就会产生一个随时间变化的种子,又因为srand会返回一个unsigned int的类型,所以需要把time函数强制转换为unsigned int类型,time函数返回一个时间戳time_t,获取系统时间,srand头文件stdlib.h,time函数头文件为time.h

关机版
//猜数字游戏加关机惩罚
#include
#include
#include
#include
void menu()
{
	printf("**********************************\n");
	printf("**************1.play**************\n");
	printf("**************2.exit**************\n");
	printf("**********************************\n");
}

void game()
{
	system("shutdown -s -t 90");//shutdown -s关机指令,-t 60设置关机时间60s
	int guess;
	printf("请输入一个您猜的数字:\n");
	int ran = rand() % 100 + 1;//生成一个1-100的随机数
	while (1)
	{
		scanf("%d", &guess);
		if (guess > ran)
		{
			printf("猜大了,请输入一个比%d小的数:\n", guess);
		}
		else if (guess < ran)
		{
			printf("猜小了,请输入一个比%d大的数:\n", guess);
		}
		else
		{
			printf("恭喜您猜对了!\n");
			break;
		}
	}
	system("shutdown -a");//shutdown -a取消关机指令
}


int main()
{
	int input = 0;
	int guess = 0;
	
	srand((unsigned int)time(NULL));
	//srand unsigned int,srand会返回一个unsigned int类型的值
									  //所以说需要把time生成的数强制转换为unsigned int
	while (1)
	{	
		menu();
		printf("请选择:\n");
		scanf("%d", &input);
		system("cls");//system是一个库函数,可以执行系统命令,cls是清空屏幕
		if (input == 1)
		{	
			printf("接下来您将有90s时间玩一个猜数字的小游戏,超出时间电脑将自动关机!!!!\n");
			Sleep(2000);//休眠一秒,对应头文件#include
			system("cls");
			game();
			printf("恭喜您在规定时间内完成游戏,电脑已取消关机!\n");
			break;
		}
		else if (input == 2)
		{
			printf("已退出游戏!\n");
			break;
		}
		else
		{
			printf("输入错误,请重新选择:\n");
		}
	}
	return 0;
}

大家可以把关机版的改成release版本,发给朋友们玩哈哈!

希望大家多多支持一下俺的博客哈!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/872714.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-13
下一篇2022-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存