番外篇之青蛙跳台、斐波那契数列和猜数字游戏问题

这篇是我关于之前学习过一段时间的C语言所遇到的题目进行的总结,涉及的知识点可能对初学者不太友好,思维量有一点点大,但是不管有多难,我相信我们总能克服的,我尽量把内容讲得详细一点,如果有什么不懂的可以在评论区留言,我尽量能够解决你的问题。

1 青蛙跳台问题----其实就是一个斐波那契数列问题

题目如下:一个青蛙从第1个台阶开始跳跃台阶,每次只能跳1个台阶或者2个台阶,问青蛙跳到第n个台阶的时候,有多少种跳法?

下面我先用数学的知识进行解答:青蛙跳到第n个台阶的时候只能从第n-2个台阶跳两个台阶,或从第n-1个台阶跳一个台阶到第n个台阶

番外篇之青蛙跳台、斐波那契数列和猜数字游戏问题_第1张图片

解法一用for循环(基本上后期for循环用的比较多第三讲再解释为什么for循环用的比较多)

#include
int main()
{
    int a = 1;
    int b = 1;
    int c = 0;//这里初始化三个变量用于后面的交换,c代表第n项的值
    int i = 0;
    int n = 0;
    scanf("%d",&n);
    if(1 == n||2 == n)
        {
            c == 1;
        }
        for(i=3;i<=n;i++)
          {
            c = a + b;
            a = b;
            b = c;
          }
    printf("第n项的值为:%d",c);
    return 0;
}
            
            

番外篇之青蛙跳台、斐波那契数列和猜数字游戏问题_第2张图片

我们可以看到运行的值是正确的

解法二:函数的递归和迭代

#include
int Fib(int n)
{
    if(1 == n||2 == n)
    return 1;
    else
    return Fib(n-1)+Fib(n-2);
}
int main()
{
    int n = 0;
    int ret = 0;//用来接收函数Fib(n)的值
    scanf("%d",&n);
    ret=Fib(n);
    printf("%d",ret);
}

是不是看起来很简洁,下面一张图便于理解。

番外篇之青蛙跳台、斐波那契数列和猜数字游戏问题_第3张图片

题目延申:

1-1 斐波那契数列之求前n项的和

下面是代码

#include
int main()
{
	int i = 0;
	int n = 0;
	int a = 1;
	int b = 1;
	int c = 0;
	int m = 2;
	int sum = 0;
	scanf("%d", &n);
	for (i = 3; i <= n; i++)
	{
		if (4 == i)
		m = 0;//这里加上m=0为了使下一次循环的时候不在多加2
		c = a + b;
		sum = m + c + sum;
		a = b;
		b = c;
	}
    if (1 == n)
    {
        sum == 1;
    }
	if (2 == n)
	{
		sum = 2;
	}
	printf("sum=%d\n", sum);
	return 0;
}

2 猜数字游戏

在写代码之前我们先要弄懂所需要的步骤

2-1 我们先要有一个程序进入游戏

2-2 我们要设置随机数

2-3 玩一把肯定是不过瘾的,肯定要多玩几把(隐含意就是要你用循环)

2-4 玩完了,不想玩了,肯定要有一个退出游戏的程序

下面我们用两种方法玩游戏

方法一:函数的递归与迭代

#include
#include
#include//时间戳的头文件
void menu()//注意这里viod是该函数无返回值,必须要设立哦
{
	printf("请输入你的输入你的数字:0进入游戏 1退出游戏\n");
}
void game()
{	//这里用到了时间戳的概念,时间戳就是就是现在的时间减去1970年的时间,这样每时每刻的时间戳就不一样,生成的数更加随机
	int guess = 0;//设置要猜的数字
	int random = rand()%101;//这里用了释放随机数的函数rand需要用到头文件
	printf("请猜一个1-100的整数:\n");
	do
	{
		scanf("%d", &guess);
		if (guess > random)//设置提醒你猜的数字是大了还是小了或者猜对了
		{
			printf("猜大了\n");
		}
		else if (guess < random)
		{
			printf("猜小了\n");
		}
		else
			printf("恭喜你猜对了\n");
	}
	while (guess != random);//这里要加分号别忘了哦,然后猜对了就游戏结束了
}
int main()
{
	menu();//设置菜单函数 输入0进入游戏 输入1退出游戏
	int input = 0;//设置变量你要输入的数
	srand((unsigned int)time(NULL));//设置一个随机数生成的种子,这里为了使生成的数更加随机把srand函数放在主函数里面了
	scanf("%d/n", &input);
	switch (input)
	{
	case 0:
		printf("开始玩游戏 play/n");
		game();//设置一个玩游戏的函数
        break;
	case 1:
		printf("不想玩了,我要退出游戏/n");
		break;
	default:
		printf("输入错误:请重新输入数字\n");
        break;
	}
	return 0;
}

方法二进阶版:不调用外函数只用主函数--->这里限制你猜数字的次数,你猜数字的次数,你猜数字的记录,没猜对数字会告诉你答案!

#include
#include
#include
#define MAX_STAGE 10//定义宏设置你的最大读取数字的次数
int main()
{
	int random = 0;
	int guess = 0;
	int i = 0;
	int stage = 0;//已经输入的次数
	srand((unsigned int)time(NULL));
	int num[MAX_STAGE] = { 0 };
	random = rand()%101;
	printf("请输入你的数字:0 进入游戏 1 退出游戏\n");
	int input = 0;
    while(1)
{
	scanf("%d", &input);
    while((stage++) random)
				printf("猜大了\n");
			else if (guess < random)
				printf("猜小了");
			else
			{
				printf("恭喜你猜对了");
			}
		}
		 while (random != guess&& MAX_STAGE - stage>0);//加一个限制条件猜的次数超过了10次就退出循环游戏结束
         break;
	case 1:
		printf("退出游戏\n");
        goto b;
	default:
		printf("输入错误请重新输入:");
        goto a;
	}
}
	if (random != guess)
	{
		printf("不好意思咯告诉你正确答案啦:%d", random);
	}
	printf("下面是你输入数字的记录噢");
	for (i = 0; i < MAX_STAGE; i++)
	{
		printf(" %2d : %4d %+4d\n", i + 1,num[i],num[i]-random);//读取第几次 读取的数字 与正确数字的差值
	}
    b:
	return 0;
}

  上面代码可以自己复制在你们的编译器中验证

下面总结:

1 当你设置变量的时候,心里要清楚它是用来干什么的,其次划分好每个步骤:

比如:猜数字游戏:首先我要先进入游戏

                                其次我要设置随机数

                                接着要猜数字

                                然后就是告诉你猜大了还是猜小了

                                猜对了游戏结束,猜错了继续猜

2 所需的知识点:函数的递归与迭代               

                            for和do...while的循环

                            用数组接受数字

        最后感谢大家的观看我们下一讲见!

你可能感兴趣的:(游戏,算法,数据结构)