Day 7-C语言
流程控制
break与continue
break
功能:
①用在switch中,用来跳出case语句;无break,switch会执行多条语句,case穿透
②在循环中(while…,for…,do…while),提前结束循环
说明:
①break不能用于循环语句和switch语句之外的任何其他语句中
②break只能终止并跳出最近的一层循环结构
案例
- 需求:参与考试,及格跳出循环,否则一直考
- 代码
#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("很遗憾,没有及格,再考一次!\n");
}
while(1); //可控死循环
printf("考试及格,结束!\n");
return 0;
}
continue
功能:continue语句不会结束整个循环,而是跳过本次循环,进入下一次循环
说明:
①仅用于循环语句中
②在嵌套循环中,continue语句只能跳出最近的一层循环结构,即单层循环
案例:
- 需求:1~100内的偶数和
- 代码
#include <stdio.h>
int main(int argc,char *argv[])
{
int sum=0;
for(int i=2;i <= 100;i++)
{
//跳过奇数
if(i % 2 != 0) continue;//执行了continue后,下面一条语句不执行
sum += i;
}
printf("1~100内的偶数和为%d\n",sum);
return 0;
}
跳出嵌套循环(扩展)
说明:不可用break和continue,因为二者只可用于单层循环。可以自定义标志位跳出(标志位可搭配break使用)
案例:
#include <stdio.h>
int test_1()
{
int flag=1;
char op;
while(flag)
{
printf("1外层循环\n");
while(flag)
{
printf("1内层循环\n");
scanf("%c",&op);
if(op == 'Y' || op == 'y')
flag = 0;
}
}
}
int test_2()
{
int flag=1;
char op;
while(flag)
{
printf("2外层循环\n");
while(1)
{
printf("2内层循环\n");
scanf("%c",&op);
if(op == 'Y' || op == 'y')
{
flag = 0;
break;
}
}
}
}
int main(int argc,char *argv[])
{
test_1();
test_2();
return 0;
}
注意:如果是多层循环(嵌套循环),进的时候是从外到内,跳出的时候是从内到外。
综合案例《猜拳游戏》
需求
- 单机游戏,人机交互
规则:
- 需要双方出拳:石头、剪刀、布
- 赢:
- 石头 → 剪刀
- 剪刀 → 布
- 布 → 石头
- 平:
- 两边出拳相等
- 输:
- …
实现:
- 选择对手
- 玩家出拳
- 对手出拳
- 判断胜负
- 游戏退出
代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc,char *argv[])
{
//初始化随机种子
srand((unsigned)time(NULL));
//游戏主控循环,变量等于1,可重复玩
int game = 1;
//游戏头设置
printf("================\n");
printf("|= 猜拳游戏 =|\n");
printf("|= 作者:fjyy =|\n");
printf("================\n");
//主循环
while(game)
{
//1.选择对手
//创建变量,存储对手序号
int peopnum;
printf("\n|==选择对手==|\n");
while(1)
{
printf("[1]小明 [2]小文 [3]小云\n");
//处理非法输入
if(scanf("%d",&peopnum) == 0)
{
//清空输入缓冲区非法字符
while(getchar() != '\n');
printf("请输入数字!\n");
continue;
}
//验证输入范围
if(peopnum >= 1 || peopnum <= 3 ) break;
printf("无效,请重新输入");
}
//显示对手信息,const修饰变量,变量不能再次改变
const char *peopnum_name = peopnum==1 ? "小明" : peopnum ==2 ? "小文" : "小云";
printf("您已选择对手:%s\n",peopnum_name);
//2.玩家出拳
//创建一个变量,存储玩家自己的出拳序号
int player_part;
printf("\n|==请您出拳==|\n");
while(1)
{
printf("[1]石头 [2]剪刀 [3]布\n");
//非法校验
if(scanf("%d",&player_part) == 0)
{
while(getchar() != '\n');
printf("请输入数字!\n");
continue;
}
//验证输入范围
if(player_part >= 1 || player_part<= 3 ) break;
printf("无效,请重新输入");
//清空缓冲区字符
}
//显示玩家出拳信息
const char* player_part_name=player_part ==1 ? "石头" : player_part==2 ? "剪刀" : "布";
printf("您出了%s\n",player_part_name);
//3.PC出拳
printf("\n|==对手出拳==|\n");
//pc随机出数字0~2,+1,为1~3
int computer_part = rand() % 3 + 1;
//pc出拳
const char *computer_part_name=computer_part==1 ? "石头":computer_part==2 ? "剪刀" : "布";
printf("%s出%s\n",peopnum_name,computer_part_name);
//判断胜负
printf("\n|==判断胜负==|\n");
int result =(player_part - computer_part + 3) % 3;
if(result == 2) printf("恭喜您,获得胜利!\n");
else if (result == 0) printf("打成平局!\n");
else printf("很遗憾,您失败了!");
//游戏退出
printf("\n|==是否继续==|\n");
printf("\n是否继续游戏?[Y/N]");
//清除缓冲区
while(getchar() != '\n');
//检测控制台输入(字符串),等价于scanf
char quit = getchar();
game=quit=='Y' || quit=='y' ? 1 : 0;
}
printf("\n退出游戏!\n");
return 0;
}
这里的综合案例,大家可以多练习一下