C语言(20250716) - 教程

C语言

内容提要

  • 循环结构
    • break与continue
  • 综合案例《猜拳游戏》

流程控制

break与continue

break

功能:

①用在switch中,用来跳出switch中的case语句;如果case没有break,可能会产生case穿透。

②用在循环中(while…,for…,do…while),提前结束循环,也就是结束整个循环。

说明:

①break不能用于循环语句和switch语句之外的任何其他语句中。

②break只能终止并跳出最近的一层循环结构,简而言之,就是只能跳出一层循环。

图示:

在这里插入图片描述

案例:

  • 需求:小明同学参加考试,如果及格,就跳出循环,否则就一直考

  • 代码:

    /*************************************************************************
    > File Name: demo01.c
    > Author: 朱旭博
    > Description:
    > Created Time: 2025年07月16日 星期三 09时28分44秒
    ************************************************************************/
    #include <stdio.h>
      int main(int argc,char *argv[])
      {
      printf("---分支结构测试---\n");
      //创建一个变量,用来存储成绩
      int score;
      //创建一个循环,实现重复考试
      do
      {
      printf("小明开始考试...\n");
      scanf("%d",&score);
      //考试及格,就终止循环
      if (score >= 60) break;
      //break执行后,下面的printf语句不会执行
      printf("很遗憾,没有及格,再考一次!\n");
      }while(1);
      //可控死循环
      printf("成绩合格,考试结束!\n");
      return 0;
      }
  • 运行结果

    在这里插入图片描述

continue

**功能:**continue语句不会结束整个循环,而是跳过本次循环尚未执行的语句,进入下一次循环。

说明:

①仅用于循环语句中。

②在嵌套循环的情况下,continue语句只对包含他的最近一层起循环作用,简而言之,只能作用于单层循环。

图示:

在这里插入图片描述

案例:

  • 需求:求1~100以内的偶数和

  • 代码:

    /*************************************************************************
    > File Name: demo02.c
    > Author: 朱旭博
    > Description:
    > Created Time: 2025年07月16日 星期三 09时52分45秒
    ************************************************************************/
    #include <stdio.h>
      //不使用continue
      int for_test1()
      {
      int sum = 0;
      for (int i = 2;i <= 100; i++)
      {
      if (i % 2 == 0) sum += i;
      }
      printf("1~100以内的偶数和是%d\n",sum);
      }
      //使用continue
      int for_test2()
      {
      int sum = 0;
      for (int i = 2; i <= 100; i++)
      {
      //跳过奇数
      if (i % 2 != 0) continue;
      //执行continue之后,下面的sum += i不再执行
      sum += i;
      }
      printf("1~100以内的偶数和是%d\n",sum);
      return 0;
      }
      int main(int argc,char *argv[])
      {
      for_test1();
      for_test2();
      return 0;
      }
  • 运行结果:

    在这里插入图片描述

跳出嵌套循环(扩展)

**说明:**跳出多层循环是不能直接使用break和continue实现的,因为它们只能跳出单层循环,跳出多层循环,需要我们自定义标志位进行跳出(标志位也可以配合break使用)。

案例:

#include <stdio.h>
  /**
  * 方式1
  */
  int func0()
  {
  // 定义一个标志位
  int is_flag = 1;
  // 默认循环成立
  // 定义一个变量,接收控制台输入
  char op;
  // 循环
  while (is_flag)
  {
  printf("外层循环执行的内容..\n");
  while (is_flag)
  {
  printf("内层循环执行的内容..\n");
  scanf("%c", &op);
  if (op == 'Y' || op == 'y')
  {
  // 退出参与嵌套的所有循环
  is_flag = 0;
  }
  }
  }
  }
  /**
  * 方式2
  */
  int func1()
  {
  // 定义一个标志位
  int is_flag = 1;
  // 默认循环成立
  // 定义一个变量,接收控制台输入
  char op;
  // 循环
  while (is_flag)
  {
  printf("外层循环执行的内容..\n");
  while (1)
  {
  printf("内层循环执行的内容..\n");
  scanf("%c", &op);
  if (op == 'Y' || op == 'y')
  {
  // 退出参与嵌套的所有循环
  is_flag = 0;
  break;
  }
  }
  }
  }
  int main(int argc, char **argv)
  {
  func0();
  printf("-------\n");
  func1();
  }

注意:如果是多层循环(嵌套循环),进的时候是从外到内,跳出的时候是从内到外。

综合案例《猜拳游戏》

  • 需求:

    • 本游戏是一款单机游戏,人机交互
  • 规则:

    • 需要双方出拳:石头、剪刀、布
    • 赢:
      • 石头→剪刀
      • 剪刀→布
      • 布→石头
    • 平:
      • 两边出拳相等
    • 输:
      • 。。。
  • 实现:

    • 选择对手
    • 玩家出拳
    • 对手出拳
    • 判断胜负
    • 游戏退出
  • 代码:

    /*************************************************************************
    > File Name: CaiQuan.c
    > Author: 朱旭博
    > Description: 综合案例:猜拳游戏v1.0
    > Created Time: 2025年07月16日 星期三 14时15分21秒
    ************************************************************************/
    #include <stdio.h>
      #include <stdlib.h>
        #include <time.h>
          int main(int argc,char *argv[])
          {
          //初始化随机种子
          srand((unsigned)time(NULL));
          //游戏主循环控制(默认可以重复玩)
          int game_running = 1;
          //游戏头设置
          printf("===================================\n");
          printf("= 猜拳游戏v1.0 =\n");
          printf("= 作者:zxb =\n");
          printf("===================================\n");
          //主循环
          while (game_running)
          {
          //1.选择对手
          printf("\n-------------选择对手--------------\n");
          //创建一个变量,用来存储对手对应的序号
          int opponent;
          while (1)
          {
          printf("[1]哪吒 [2]敖丙 [3]敖闰:\n");
          //处理非法输入
          if (scanf("%d",&opponent) != 1)
          {
          //清空输入缓冲区非法字符
          while (getchar() != '\n');
          printf("请输入数字1~3!\n");
          continue;
          }
          //验证输入范围
          if (opponent >= 1 && opponent <= 3) break;
          printf("选择无效,请重新输入!\n");
          }
          //显示对手信息,使用const修饰的变量还是变量,只不过不能再次改变
          const char *opponent_name = opponent ==1 ? "哪吒" : opponent == 2 ? "敖丙" : "敖闰";
          printf("对手:%s\n",opponent_name);
          //2.玩家出拳
          printf("-------------玩家出拳--------------\n");
          //创建一个变量,用来存储玩家自己出拳的序号
          int player_gesture;
          while (1)
          {
          printf("请出拳:[1] 石头 [2] 剪刀 [3] 布:\n");
          //非法输入校验
          if (scanf("%d", &player_gesture) != 1)
          {
          //清空输入缓冲区所有字符
          while (getchar() != 'n');
          printf("请输入数字1~3!\n");
          continue;
          }
          //输入范围校验
          if (player_gesture >= 1 && player_gesture <= 3) break;
          printf("无效输入,请重新输入!\n");
          }
          //显示玩家出拳信息
          const char* player_gesture_name = player_gesture == 1 ? "石头" : player_gesture == 2 ? "剪刀" : "布";
          printf("您出:%s\n",player_gesture_name);
          //3.对手出拳
          printf("-------------对手出拳--------------\n");
          //创建一个变量,作为对手出拳序号,这个序列需要随机生成1~3
          int computer_gesture = rand() % 3 + 1;
          const char* computer_gesture_name = computer_gesture == 1 ? "石头" : computer_gesture == 2 ? "剪刀" : "布";
          //显示对手出拳信息
          printf("%s出:%s\n",opponent_name,computer_gesture_name);
          //4.判断胜负
          printf("\n-------------判断胜负--------------\n");
          //创建一个变量,用来存储比较的结果
          int result = (player_gesture - computer_gesture + 3) % 3;
          printf("\n战况:\n");
          //比较
          if (result == 0) printf("平局!\n");
          else if (result == 2) printf("您赢了!\n");
          else printf("您输了!\n");
          //游戏退出
          printf("\n--------------游戏退出-------------\n");
          printf("继续游戏? [Y/N]");
          //清空输入缓冲区
          while (getchar() != '\n');
          //获取控制台输入
          char choice = getchar();
          //等价于 char choice;scanf("%c",&choice);
          //修改循环状态
          game_running = choice == 'Y' || choice == 'y' ? 1 : 0;
          }
          printf("\n游戏结束!\n");
          return 0;
          }
  • 执行结果:

    在这里插入图片描述

posted @ 2025-07-27 18:54  yjbjingcha  阅读(10)  评论(0)    收藏  举报