第三章.C语言习题
前言
本章主要利用前面第三章的分支语句、循环语句知识来完成习题。
本章仅设置一题,完成在1到100之间的猜数字游戏。
一、猜数字游戏
题目要求:
1.在1到100之间猜数字
2.仅有10次机会猜数字,若猜错会显示正确答案
3.可重复游戏
1.超纲知识(补充)
1.设置随机数
在C语言中有一个rand函数,该函数能够生成随机数
rand函数会返回⼀个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的⼤⼩是
依赖编译器上实现的,但是⼤部分编译器上是32767。 rand函数的使⽤需要包含⼀个头⽂件是:stdlib.h
但是该随机数仅能随机第一次输入的值,再第二次第三次打印后值又是一样的
#include <stdlib.h>
所以C语言中又提供了一个函数叫srand函数,用来初始化函数的生成器 程序中在调⽤ rand 函数之前先调⽤ srand 函数,通过
srand 函数的参数seed来设置rand函数⽣成随机数的时候的种⼦,只要种⼦在变化,每次⽣成的随机数序列也就变化起来了。
那也就是说给srand的种⼦是如果是随机的,rand就能⽣成随机数;那么在⽣成随机数的时候⼜需要⼀个随机数,怎么办呢?
在程序中我们⼀般是使⽤程序运⾏的时间作为种⼦的,因为时间时刻在发⽣变化的。 在C语⾔中有⼀个函数叫 time ,就可以获得这个时间 time
函数会返回当前的⽇历时间,其实返回的是1970年1⽉1⽇0时0分0秒到现在程序运⾏时间之间的
差值,单位是秒。返回的类型是time_t类型的,time_t 类型本质上其实就是32位或者64位的整型类型 time函数的参数 timer
如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。 如果 timer
是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳。
time函数的时候需要包含头⽂件:time.h
#include <time.h>
若想让time函数返回时间戳,可以这么写;
time(NULL);
将time函数的返回值强制转换为整型
srand((unsigned int)time(NULL)) //那么就可以有一个每次输出都不一样的随机值了
2.设置随机数范围
在这里有一个公式:
//任何数%100都只能得到0-99
//所以要想生成a到b的随机数,公式为: a + rand()%(b - a + 1)
int r = 0 + rand%(100 - 0 + 1)
就能实现1到100的随机数范围了
3.实现猜数字游戏代码
当每次不同的随机值和随机值范围设置好了,就可以写出猜数字游戏的代码了
#include <stdio.h>
#include <stdlib.h>
#include <time.h> //需要的头文件先写好,以防止后续不能运行
//本体在最下面
void menu() //第一部分 菜单 //下面的menu();调用的内容在这里
{
printf("***************************\n");
printf("**** 1. play ****\n");
printf("**** 0. exit ****\n");
printf("***************************\n");
}
void game() //第二部分 游戏 下面的game();调用的内容在这里
{
int guess = 0; //设置变量1
int r = 0 + rand() % (100 + 1); //利用上面的公式完成1-100随机数范围
int chance = 10; //10次猜数字机会
while (chance) //当10次机会变成0,则退出循环
{
printf(" 你还有%d次机会猜,加油吧\n", chance);
chance--; //每次输入,则自减1,直到0退出为止
printf("请猜一个0-100之间的数字\n");
scanf("%d", &guess); //输入你猜的数字
if (guess > r) //若大于随机数r
{
printf("猜大了\n");
}
else if (guess < r) //若小于随机数r
{
printf("猜小了\n");
}
else //若等于随机数r
{
printf("***************恭喜你,猜对了!**************\n");
printf("正在重新进入菜单........\n");
printf("........................\n");
break; //终止,返回菜单
}
if (chance == 0) //如果chance为0,之后 代表都没猜中
{
printf("你猜错了,正确答案是%d\n", r); //给出正确答案
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //将time的返回值强制转换整型
do //上来就打印
{
menu(); //第一部分 菜单 使用void menu()调用
printf("请选择:> ");
scanf("%d", &input); //输入 1和0 开启或退出游戏
switch (input) //switch分支
{
case 1: //输入1时,进入游戏
game(); //第二部分 游戏 使用void game调用
break; //结束
case 0: //输入0时 为假退出循环,退出游戏
printf("退出游戏\n");
break;
default: //防止乱输入
printf("选择错误,请重新选择\n");//因为为真,所以会让你重新输入
break;
}
} while (input); //把switch写在内部,然后通过真假来操控while是否循环
return 0;
总结
本章讲解了一下猜数字游戏的实现,可以多敲几遍,逐步了解每一步的逻辑。