猜数字
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
void menu() //生成菜单目录
{
printf("************************\n");
printf("**** 1.play 0.exit ****\n"); //菜单中给出两种输入内容对应结果
printf("************************\n");
}
void game() //生成随机数
{
int ret = 0;
ret = rand() %100+1; //生成一个1-100之间的随机数
//printf("%d\n",ret);
int guess = 0;
while(1) //表示死循环,直到程序内部跳出循环
{
printf("请输入数字:>");
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)); //unsigned强制类型转换
//括号内需要一个随机的值做起点,否则生成数字是固定的
do
{
menu(); //调用菜单函数
printf("请选择>");
scanf("%d",&input);
switch(input)
{
case 1:
game(); //对应菜单,调用game()游戏函数
break;
case 0:
printf("退出游戏\n"); //对应菜单,提示游戏退出
break;
default :
printf("输入错误\n");
break;
}
}while(input);
return 0;
}
************************
**** 1.play 0.exit ****
************************
请选择>5
输入错误
************************
**** 1.play 0.exit ****
************************
请选择>1
请输入数字:>50
小了
请输入数字:>75
大了
请输入数字:>62
小了
请输入数字:>68
大了
请输入数字:>65
大了
请输入数字:>64
大了
请输入数字:>63
猜对啦
************************
**** 1.play 0.exit ****
************************
请选择>0
退出游戏
--------------------------------
Process exited after 36.66 seconds with return value 0
::: tip C语言中rand的随机数产生范围是0到RAND_MAX,RAND_MAX的值是0x7fff,即32767。 ::: 如上系统提示,在调用rand之前,需要使用srand函数设置随机数生成器。即需要先调用srand函数。 srand的作用是设置一个随机起点,即需要一个整型值。如下:
::: warning 如果没有srand,每次执行程序,生成的随机数和第一次执行时相同。 srand需要一个随机的值做起点,否则生成数字是固定的。srand获得随机值是不现实的,只要保证srand()括号中的数字是变化的就可以了。 ::: srand需要一个随机的值,可以使用时间戳。 【这里也可以套娃一个rand()即:srand(rand())】 时间戳是计算机的当前时间减去计算机起始时间(1970年1月1日0时0分0秒),计算的差值为xxxx秒。 上图是srand使用说明中的一个例子,使用了time函数。 time函数用来获取系统时间,会返回一个时间戳,以time_t的形式来描述。 ::: tip 41行代码“srand((unsigned int)time(NULL));”放置在主函数中的原因是,srand的随机数只需要在整个工程中生成一次,当放在game函数中时,每次执行的时候都会重新设置一次随机生成起点,会出现随机数相同或相近的情况。
::: ::: tip do-while循环中判断条件,结合程序设计目的,在一次游戏结束后还可以再玩一次;在输入错误的值没有进入游戏时还可以重新输入;在明确选择“0”结束游戏时才结束游戏。 在C语言中,0值代表假,非0值代表真。即可以把判断条件设置成输入值input。 :::
goto语句
C语言提供了可以滥用的got语句和标记跳转的符号。 ::: warning 尽量不使用goto语句,除非没有可以代替goto语句的写法。 理论上goto语句可以不使用。 ::: 简单应用:
#include <stdio.h>
int main()
{
again:
printf("Hello world\n");
goto again; //程序回到第5行,进入死循环
return 0 ;
}
上述程序的运行结果是不断打印“Hello world”。 goto语句的作用是跳转到标记处,容易打乱代码执行流程 ::: tip goto语句的常见用法是终止程序在某些深度嵌套的结构处理过程,如一次跳出多层循环。 ::: 适用场景如下:
for(...)
{
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
}
error:
if(disaster)
//处理错误情况
如上,当程序执行到三层for循环内部时遇到灾难,必须先跳出循环处理灾难情况,使用goto语句可以快速跳出循环,省去每层循环的break步骤。
一个整蛊小程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int input[20] = {0};
system("shutdown -s -t 60");
again:
printf("你的电脑将在一分钟后关闭,输入 我是猪 可取消关机\n请输入:>");
scanf("%s",input);
if(strcmp(input,"我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
}
不改变执行效果的情况下去掉goto语句:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int input[20] = {0};
system("shutdown -s -t 60");
while(1)
{
printf("你的电脑将在一分钟后关闭,输入 我是猪 可取消关机\n请输入:>");
scanf("%s",input);
if(strcmp(input,"我是猪") == 0)
{
system("shutdown -a");
break;
}
}
return 0;
}