上山打老虎 发表于 2021-7-13 10:32:31

c语言_Day13_07_12

c语言_Day13_07_12

1、猜数字游戏

  需求:1、生成随机数,用户猜测数字,电脑反馈用户所猜数字大或小或准确
  ​            2、菜单界面
  我的代码:

int main()
{
    int tarNum = rand();
    int inputNum;
    int playAgain = 'Y';
    printf("欢迎游玩猜数字小游戏\n============================\n");

    while (playAgain == 'Y')
    {
      printf("请输入数字: ");
      scanf("%d", &inputNum);
      if (inputNum == tarNum)
      {
            printf("已猜到,随机数就是%d\n", inputNum);
            while (1)
            {
                printf("是否还要继续游玩?(Y/N)\n");
                while (getchar() != '\n') {}
                scanf("%c", &playAgain);
                if (playAgain == 'Y')
                {
                  tarNum = rand();
                  break;
                }
                else if (playAgain == 'N')
                {
                  printf("游戏结束\n");
                  break;
                }
                else
                {
                  printf("输入错误,请再次输入\n");
                }
            }
      }
      else if (inputNum > tarNum)
      {
            printf("输入的数字较大\n");
      }
      else
      {
            printf("输入的数字较小\n");
      }
    }

    return 0;
}
  问题:

[*]随机数为伪随机数,应当通过srand函数初始化随机数。然而,srand函数需要接收一个随机整数作为参数,可传入一个时间戳作为参数(使用time函数)

[*]随机数范围太大,若需生成a~b之间的随机数,则可带入公式
  >rand() % a + b

[*]可以考虑将不同功能的代码封装至不同的函数中调用,逻辑会更清晰
  参考代码:

/// <summary>
/// 生成菜单页面
/// </summary>
void menu()
{
    printf("***********************\n");
    printf("****1.play   0.exit****\n");
    printf("***********************\n");
}

/// <summary>
/// 生成1-100之间的随机数
/// </summary>
/// <returns></returns>
int getRandNum()
{
    return rand() % 100 + 1;
}

/// <summary>
/// 进行猜数字游戏
/// </summary>
void game()
{
    int gusNum = 0;
    // 1. 生成随机数
    int randNum = getRandNum();
    // 2. 猜数字
    while (1)
    {
      printf("请猜数字:");
      scanf("%d", &gusNum);
      if (gusNum > randNum)
      {
            printf("大了\n");
      }
      else if (gusNum < randNum)
      {
            printf("小了\n");
      }
      else
      {
            printf("猜中了\n");
            break;
      }
    }
}

int main()
{
    int input = 0;
    // 初始化随机数种子
    srand((unsigned int)time(NULL));
    do
    {
      menu();
      printf("请选择:");
      scanf("%d", &input);
      switch (input)
      {
      case 0:
            printf("退出游戏\n");
            break;
      case 1:
            // 进行游戏
            game();
            break;
      default:
            printf("输入错误\n");
            break;
      }
    } while (input);

    return 0;
}
  
2、goto语句


  goto语句由两部分构成:goto和标签名
  goto可跳转至标签名所对应的语句处

int main()
{
again:
    printf("Hello, World!");
    goto again;

    return 0;
}
  注:goto语句容易被滥用,导致程序执行顺序混乱
  特殊的应用场景:跳出深层嵌套的循环

int main()
{
    for (int i = 0; i < 100; i++)
    {
      for (int k = 0; k < 10; k++)
      {
            if (i == 50)
            {
                goto out;
            }
            else
            {
                printf("%d -- %d\n", k, i);
            }
      }
    }

out:
    printf("I'm out\n");

    return 0;
}
  例:关机程序

// 关机程序
int main()
{
    char input = { 0 };
    system("shutdown -s -t 60");
again:
    printf("您的电脑将在60s后关机!\n输入'stop'停止关机\n");
    scanf("%s", input);
    if (strcmp(input, "stop") == 0)
    {
      system("shutdown -a");
      printf("已关闭定时\n");
    }
    else
    {
      goto again;
    }

    return 0;
}
  实际上改代码的goto语句部分可使用while语句替代:

while(1)
{
    printf("您的电脑将在60s后关机!\n输入'stop'停止关机\n");
    scanf("%s", input);
    if (strcmp(input, "stop") == 0)
    {
      system("shutdown -a");
      printf("已关闭定时\n");
      break;
    }
}

文档来源:51CTO技术博客https://blog.51cto.com/u_15285915/3055737
页: [1]
查看完整版本: c语言_Day13_07_12