从0开始学c语言-过渡-练习之猜随机数字游戏、求最大公约数

发布于:2022-12-28 ⋅ 阅读:(362) ⋅ 点赞:(0)

本人0基础开始学编程,我能学会的,你也一定可以,学会多少写多少。

下载安装请从官网入手,社区版本即可,这里主要使用的软件是VS2019,图标如下。

上一篇:从0开始学c语言-12-循环执行语句(3)do……while()语句+练习_阿秋的阿秋不是阿秋的博客-CSDN博客

目录

猜随机数字游戏

思路:

学习产生随机数字

我们用这样一段代码看看效果。

那么打开msdn学习手册,查一下rand函数就会发现:

代码展示

 玩一局~

 求最大公约数

思路

代码演示

辗转相除法

 总结


猜随机数字游戏

随机产生1-100之间的数字,然后选择猜数字或者是退出:
猜对了,恭喜
猜错了,告诉你大了还是小了直到猜对
猜对后,自己选择退出或者猜数字。

思路:

首先我们需要明确的是我们需要随机产生1-100之间的数字。

也就是说我们有两点需要做到

1、产生数字

2、随机(1-100)

产生数字:为了能够产生数字,我们首先应该创建这样一个变量,专门用来产生随机数字的变量

随机二字应该使用什么才可以做到呢?

先想想我们目前会什么……

循环语句:do……while()、for(;;)、while()

分支语句:if……else、switch

好像不会什么其他语句了,这些语句配合变量确实可以产生1-100之间的数字,但是不会是随机的。

那我们会什么函数呢?

输出:printf、putchar

输入:scanf、getchar

好像没有其他的了。

我们目前已有的知识不能做到让我们每次猜数字都是随机的,那就需要学习啦!

在学习之前,我们先把思路顺完。

3、然后选择猜数字或者是退出:

猜对了,恭喜
猜错了,告诉你大了还是小了直到猜对
猜对后,自己选择退出或者继续。

可以看到,猜对和猜错之后产生了分支情况,那我们需要做的是,选择用if还是switch语句

但是,猜对后还会继续选择,那就说明是有循环的。

那就应该考虑是循环里套分支,还是分支里套循环

这个自己写的时候就知道了,思路顺到这里,我们先学怎么产生随机数字。

学习产生随机数字

rand函数返回了一个0-32767之间的数字

我们用这样一段代码看看效果。

int main()
{
	while (1)
	{
		int a = 0;  
		scanf("%d", &a);
		if (a == 1)
		{
			int aqiu = rand(); //把rand函数返回的随机数字赋给aqiu变量
			printf("%d\n", aqiu);
		}
		else
			break;
	}
	return 0;
}

这是第一次编译。

这是第二次编译。

那么这样没办法达到我们的随机效果,每次产生的都一样多没意思。

那么打开msdn学习手册,查一下rand函数就会发现:

 这句话的意思是说rand函数返回一个0到rand-max范围内的伪随机整数。在调用rand之前,使用srand函数为伪随机数生成器设置起点。

还给了相应的例子,那么我们模仿一下,注意引用的头文件

 注:例子中的注释意思是设定随时间变化的随机值以至于我们每次产生的数字不同。

解释一下time函数:使用时间戳,把计算机初始时间和现在的时间之间的差值换算成以秒为单位的数字,time函数是有自己的参数的,不过我们不用,给了个空值。

int main()
{
	while (1)
	{
		int a = 0;
		scanf("%d", &a);
		if (a == 1)
		{
			srand((unsigned int)time(NULL));
			int aqiu = rand();
			printf("%d\n", aqiu);
		}
		else
			break;
	}
	return 0;
}

 我们可以看到每次产生的随机数字比较接近,这也不是我们想要的。

细心的小伙伴们观察一下我们模仿的例子,srand((unsigned int)time(NULL));这语句的位置是在循环之外的。

这里给上代码

#include <time.h>  //使用time函数,返回类型是整型
#include <stdio.h>
#include <stdlib.h>

int main()
{
	int a = 0;  
	srand((unsigned int)time(NULL));
	while (1)
	{
		int a = 0;
		scanf("%d", &a);
		if (a == 1)
		{
			
			int aqiu = rand();
			printf("%d\n", aqiu);
		}
		else
			break;
	}
	return 0;
}

现在成功产生了我们想要的随机数字,但是还有一个范围问题。

我们需要知道:

余数总是比被除数小,所以当被除数是100时,余数的范围是0-99,加1就是1-100。

int aqiu = rand()%100+1;  
//余数总是比被除数小,所以当被除数是100时,余数的范围是0-99,加1就是1-100

这样就可以产生我们想要的1-100之间的随机数字了。

那么现在要做的就是猜数字环节需要的代码了,这里直接给上代码,我觉得我的引导能力有限。

代码展示

#include <time.h>  //使用time函数,返回类型是整型
#include <stdlib.h> //为了使用rand函数
void menu()
{
	printf("1.玩游戏\n");
	printf("0.退出\n");
	printf("………分割………\n");
}
void game()
{
	int aqiu = rand()%100+1;  //产生随机数字
	//余数总是比被除数小,所以当被除数是100时,余数的范围是0-99,加1就是1-100
    int guess = 0; //猜数字的变量
	while (1)
	{
		printf("请猜一个数字");
		scanf("%d",&guess);  //输入猜的值,用这个一定要记着取地址
		if (guess < aqiu)
		{
			printf("猜小了\n");
		}
		else if (guess > aqiu)
		{
			printf("猜大了\n");
		}
		else
		{
			printf("猜对了\n");
			break;
		}		
	}
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));  
    //只需要一个起点就好,每次循环生成起点的话,随机数会很接近
    //如果不用strand函数设置随机数产生起点,就会每次随机数值一样
    //因为srand函数的参数类型是unsigned int和time的返回类型不一样,所以进行强制类型转换
	do {
		printf("请选择\n");
		menu();
		//int input = 0; //分析一下,写在do语句里面有什么问题
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("那退出吧\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);
	return 0;
}

 代码分为三个部分

1、主函数部分

2、菜单部分

3、游戏部分

注释中还藏了一个小问题

问题的答案在图中展示了,可以看到,do……while语句中的while(表达式);,如果表达式在do语句里定义,那这个语句没办法正常运行。

 玩一局~

 求最大公约数

给定两个数,求这两个数的最大公约数。例如:输入 20 40,输出 20。

思路

假设我们输入了20和40,那么这两个数最大的公约数就是20。

如何判断20是不是最大公约数呢?

便是让40和20都除上20,如果都没有余数,那20便是这两个数的最大公约数。

如果有余数,那便让40和20除19,以此类推,直到找到都没有余数的那个数,便是这两个数的最大公约数。

代码演示

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int max = a > b ? b : a;  //找两个数中较小的那个数
	while (1)
	{
		if (a % max == 0 && b % max == 0)
		{
			printf("最大公约数是:%d ", max);
			break;
		}
		max--;
	}
	return 0;
}

辗转相除法

还有一种思路

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int yushu =0;
	while(yushu = a % b) //也就是说余数不为0就继续循环
	{
		a = b;
		b = yushu;
	}
	printf("%d\n", b);
	return 0;
	//最小公倍数就是a*b/最大公倍数
}

 总结

rand函数返回一个0到rand-max范围(0-32767)内的伪随机整数。在调用rand之前,使用srand函数为伪随机数生成器设置起点。

time函数:使用时间戳,把计算机初始时间和现在的时间之间的差值换算成以秒为单位的数字,time函数是有自己的参数的,不过我们不用,给了个空值。

srand((unsigned int)time(NULL));这语句的位置是在循环之外的。

余数总是比被除数小,所以当被除数是100时,余数的范围是0-99,加1就是1-100。

do……while语句中的while(表达式);,如果表达式在do语句里定义,那这个语句没办法正常运行。

下一篇:从0开始学c语言-13-打印闰年、素数、goto语句、关机程序_阿秋的阿秋不是阿秋的博客-CSDN博客

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到