分支循环语句(练习篇)-含猜数字游戏

Posted Bumblebee951

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分支循环语句(练习篇)-含猜数字游戏相关的知识,希望对你有一定的参考价值。

目录

一、计算N的阶乘

二、计算1!+2!+......+10!

三、二分查找

四、模拟密码登录

五、猜数字游戏


一、计算N的阶乘

 我们来剖析这段代码,想要求N的阶乘,那么首先就要产生N个数字,产生N个数字我们可以想到用循环的方式,在这里我们采用while循环。定义三个整型变量 a n ret,并且将其初始化赋值。在这里不能赋值为0,因为0乘任何数都为0。首先要先输入N,采用scanf函数输入N,然后产生N个数字,假设我们求5的阶乘,5!=1*2*3*4*5,我们可以理解为5!=4!*5以此往前推4!=3!*4,3!=2!*3,2!=1!*2,所以在while循环体内部就是,ret=上一次ret的值,乘上调整之后的a,然后a进行一次调整,调整之后判断是否小于等于n,如果成立再次循环,直到a=n,

此时ret的值就是(n-1)!*n,也就是n的阶乘。最后跳出循环,输出最后的ret。

二、计算1!+2!+......+10!

相加到10的阶乘数值比较大,我们没有办法一下子判断对错,所以先用相加到3的阶乘判断一下。

代码如上,这段程序在计算N的阶乘基础上略加改进,我们逐步剖析,首先要相加到3的阶乘,那么就要产生1!,2!,3!我们先定义一个外部的for循环,n从1开始,判断部分为n<=3,调整部分n++,当n为1时,1<3为真,进入循环,循环体内部还是一个for循环,a从1开始,a<=n,a++,此时a为1,n也为1判断部分为真,进入内部for循环体,之前定义过ret为1,ret = ret*a,可以求得当前ret为1,然后进入调整部分,a++为2,此时n为1,为假,跳出内部循环,sum初步赋值为0,sum=sum+ret为1。进入外部for循环的调整部分,n++为2,小于3为真 准备进入内部for循环,进入前将ret初始化为1,对于此时的内部for循环,a为1,n为2,ret为1。符合判断条件,ret=ret*a也就是ret=1*1=1,然后进入调整部分a++为2,此时n也为2符合判断,再次进入内部for循环ret=ret*a=1*2=2,再调整a为3,此时n为2,跳出循环。到了sum+=ret,此时ret为2,sum为1,所以最终sum为1+2为3。

这时该外部for循环进行调整,n为3,符合判断,进入内部循环,ret初始化为1,对于内部for循环,a=1,1<3成立,进入,ret = ret*a=1,a++,a为2,为真,ret=ret*a=2,调整,a++为3,为真,ret=ret*a=6。调整a,为假,跳出循环。sum=sum+ret=3+6=9。再次调整n,为假,跳出外部for循环,输出sum。

希望大家在书写这段代码之后可以用F10来进行调试,可以更直观的感受代码的逻辑。

以上的输出就是相加到10!求得的数值。 

三、二分查找

二分查找在计算机中是一个比较重要的算法,二分查找也称为折半查找, 下面通过解析上面的代码来说明什么是二分查找。

想要在1-10这个有序数组中快速的找到某个值,比如我们想要找到3,慢一点的方法是一个一个的寻找,如果需要我们在上万个数字中找到6587呢?显然一个一个的寻找不是好的办法,我们可以通过二分查找,先找有序数组中的一半,看和需要找的值是大还是小,如果大,就把后一半的数字全部抛掉,反之亦然。这样会大大提高我们的效率。

那么找1-10的数字的时候也可以这样查找,首先定义1-10的数组。规定我们要找的数字是3。因为数组都是通过下标访问的,所以定义最左边数字的下标为0,最右边的下标为,整个数组大小除以单个数组元素大小然后减1。然后我们依靠mid来确定数组,首先用(left+right)/2缩小一半的范围,然后通过下标arr[mid]判断和我们需要的数值是否相等,如果这一次找到的值大于我们需要的值,那么说明本次找到的值往右,包括这个值都舍弃。将right变为mid-1。从代码来看最初mid为4,对应的arr[mid]为5,比我们需要的值偏大,所以从5往右的数字都舍弃。接下来从1 2 3 4这里面挑选 。

然后再进行一次二分查找,left=0,right =3 mid=(left+right)/2=1 arr[1]=2和我们需要找的值偏小,于是将left改为mid+1 为2,arr[2]为3,那么剩下来就是需要我们从3和4两个数字中寻找。

此时left=2 right=3 mid=(left+right)/2=2 arr[mid]=arr[2]=3和我们需要寻找的数字一样,所以输出找到了。

从上面的解释来看,我们的一次又一次的查找其实就是一种循环。我们引用while循环,只有当left<=right的时候才有意义,当left>right的时候,就说明我们找不到这个数字了。

四、模拟密码登录

我们需要能够模拟用户输入密码,当密码输入正确的时候跳出程序,最多输入三次密码,第三次密码错误的时候会退出程序。

 首先,假设我们的密码是123456,这是一个字符串,所以用字符数组来储存密码。因为密码一共能输入三次,我们设置一个for循环,在循环内部,密码正确便会跳出循环,密码错误可以重新输入,但只能循环三次。在这里我们用scanf函数的时候,password没有用取地址符号&,是因为数组名本来就是地址。在判断密码是否正确的时候要注意,字符串的判断不能用password == “123456”这个样子。我们需要引用库函数strcmp,strcmp就是用来比较两个字符串是否相等的。

我们通过MSDN搜索strcmp的用法发现,当返回值小于0时说明字符串1小于字符串2,当=0时,说明字符串1等于字符串2,当大于0时说明字符串1大于字符串2。 

所以我们在程序中,如果判断两个字符串对比后返回的值等于0,说明两个字符串是一样的,那么密码输入正确,否则就再次循环,重新输入,当密码输入超过三次时,也就是i == 3,就会跳出循环,输出登陆失败,退出程序。

以上就是这个程序的大致思路。

五、猜数字游戏

我们需要编写一个猜数字游戏,要求电脑随机输出1-100的数字,并且我们输入后可以提示数值偏大还是偏小,然后我们可以调整数值,当输入正确的时候提示我们正确。并且可以多次循环玩游戏,并且每次游戏内容都不一样。

首先我们先写函数的主函数部分,我们如果想要开发一款游戏,肯定要先有菜单来告诉我们要做什么,所以不管三七二十一,我们先做,先有一个菜单。然后呢,我们又需要多玩几次游戏,这又是一个循环,所以采用do while循环最合适。那么我们在do语句部分先设定一个菜单,我们用函数封装的形式先设置一个菜单menu(是一个函数),这个函数可以给我们一个界面,这个界面告诉我们输入1是开始游戏,输入0是退出游戏。那么我们就需要一个整型变量input,并且用scanf函数使我们能够输入0或1。当我们输入0或1的时候就要有语句来对应,在这里我们可以用if语句,也可以用switch case语句。我们采用switch case 语句。当我们输入1时,就对应菜单界面的1,进入游戏,我们在这里也用game来封装一个函数,输入0,就会退出程序。当我们输入非0和1时,会提示我们输入错误。

接下来重点是封装的game函数,在这个函数中,要求我们能够随机生成1-100的数字,并且可以生成很多次,每次生成的数字还不能相同,重点就是生成随机数,我们用库函数rand

 在MSDN中是这样介绍rand函数的,生成一个伪随机数。

 rand函数返回一个范围为0到RAND_MAX的伪随机整数。在调用rand之前,使用srand函数为伪随机数生成器设置种子。

srand函数需要不断的输入一个变化的值,才能让rand函数生成随机值。生活中,时间时不断变化的,所以我们给srand输入的那个不断变化的值就是时间。

任何时间都可以转化为一个时间戳,时间是不断变化的,所以时间戳也是不断变化的,如果我们需要获取时间戳,那么需要调用库函数time

当我们把rand函数设定好后,存放在r里,然后将r和输入的数值对比,并得出相应的提示。因为猜数字是一个循环的过程,所以在while的判断部分直接设定为1,非0,一直循环。

#define _CRT_SECURE_NO_WARNINGS 1
#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("恭喜你,猜对了\\n");
			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:
			break;
		default:
			printf("选择错误,请重新输入\\n");
			break;
		}
	} 
	while (input);
		return 0;
}

以上是关于分支循环语句(练习篇)-含猜数字游戏的主要内容,如果未能解决你的问题,请参考以下文章

C语言分支语句和循环语句

海贼王的成长之路家乡东海篇||第二章

脚本语句介绍和练习题一

C语言学习--分支和循环语句

JavaScript流程控制的三种结构,循环语句及相关练习

JavaScript流程控制(顺序分支循环)及相关练习