分支和循环相关练习3

Suzhou
• 阅读 155
猜数字
#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。 ::: 分支和循环相关练习3 如上系统提示,在调用rand之前,需要使用srand函数设置随机数生成器。即需要先调用srand函数。 srand的作用是设置一个随机起点,即需要一个整型值。如下: 分支和循环相关练习3

::: warning 如果没有srand,每次执行程序,生成的随机数和第一次执行时相同。 srand需要一个随机的值做起点,否则生成数字是固定的。srand获得随机值是不现实的,只要保证srand()括号中的数字是变化的就可以了。 ::: srand需要一个随机的值,可以使用时间戳。 【这里也可以套娃一个rand()即:srand(rand())】 时间戳是计算机的当前时间减去计算机起始时间(1970年1月1日0时0分0秒),计算的差值为xxxx秒。 分支和循环相关练习3 上图是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;
} 
评论区
推荐文章

暂无数据

Suzhou
Suzhou
Lv1
这个网站设计堪称垃圾。CTRL+S过后的东西,重启电脑只能保存5行。多按几次CTRL+S还提示频繁保存不了。吐了。
9
文章
0
粉丝
0
获赞