【03 分支和循环】

目录

  1. if语句
  2. 关系操作符
  3. 条件操作符
  4. 逻辑操作符
  5. switch语句
  6. while语句
  7. for循环
  8. do while循环
  9. break和continue
  10. 循环的嵌套
  11. goto语句
  12. 综合-猜数游戏

1. if语句

语法格式:

if (表达式)
 语句

0为假,非0表示真。如果是真,语句执行,否则不执行

流程:
在这里插入图片描述

else

else表示if条件不满足的另一个分支,如年龄小于18未成年的写法:

 int age = 0;
 scanf("%d", &age);
 if(age>=18)
 printf("成年\n");
 else
 printf("未成年\n");

悬空esle的问题

if语句里面可以同时嵌套if语句,嵌套的else默认和最近的一个if匹配

 int a = 0;
 int b = 2;
 if(a == 1)
      if(b == 2)
 printf("hehe\n");
 else
 printf("haha\n");

上代码输出结果空,下面的else虽然和第一个if格式相对,但仍匹配的是最近的if,当a==1不满足时,不会执行下面的if,也不会走对应的else

书写if时尽量带上大括号,方便查看if的范围

2. 关系操作符

 用于比较的表达式叫关系表达式,运算符称为关系运算符

  • > 大于运算符
  • < 小于运算符
  • >= 大于等于运算符
  • <= 小于等于运算符
  • == 相等运算符
  • != 不相等运算符

关系表达式通常返回0表示假,1表示真

3. 条件操作符

三目操作符,格式:

exp1?exp2:exp3

exp1为真,exp2计算,否则exp3计算

4. 逻辑操作符: && || !

逻辑操作符提供逻辑判断功能,用于构建更复杂的表达式

&&: 与运算符,就是并且的意思 (两侧表达式都为真,则为真,否则为假)
||: 或运算符,或者的意思 (两侧至少有一个为真,则为真,否则为假)
!: 逻辑取反运算符 (改变单个表达式的真假)

逻辑取反运算符
非0取反为0,0取反为非0

练习. 闰年的判断

闰年的两个条件:

  1. 能被4整除不能被100整除
  2. 能被400整除
 int year = 0;
 scanf("%d", &year);
 if((year%4==0 && year%100!=0) || (year%400==0))
               printf("是闰年\n");

短路

c语言逻辑运算符的特点,先对左侧的表达式求值,如果左边的都不满足,就不会对右边的再计算,这种情况称为短路

if (3>5 && 4>2)

上面语句,首先3不大于5,左边不满足,就不会看右边,直接跳过

5. swithch语句

除过if,还有switch来实现分支结构

注:

  1. switch后的判断必须是整形表达式
  2. case后的值,必须是整形常量表达式

break

 switch语句的分支只有遇到break才能跳出switch语句,如果case后没有break,代码会继续向下执行,知道遇到break或语句结尾

switch (1) {
case 1:
    printf("1");
case 2:
    printf("2");
default:
    printf("3");
}

switch里面值为1,进入1的分支,没有break会继续进入下面分支,最后输出123

break也不是必须有,如果多种case都是同一种结果,没必要break

switch(day){
case 1:
case 2:
case 3:
case 4:
case 5:
	printf("工作日");
}

default

 所有case条件不能满足,就会进入default,这两个并没有顺序要求,但一般将default放在最后

6. while

c语言提供了3种循环方式,while是其中一种

流程:
在这里插入图片描述
执行判断表达式,表达式的值为0,循环直接结束;表达式不为0,继续执行循环语句,语句结束后再判断

7. for循环

for循环是使用最多的

for (表达式1,表达式2,表达式3)

表达式1,用于循环变量的初始化
表达式2,循环条件结束的判断
表达式3,循环变量的调整

执行流程:
在这里插入图片描述
首先1,初始化循环变量,接下来是表达式2的判断部分,结果为0,则循环结束。不等于0执行循环语句,循环结束后,再执行3,调整循环变量,,然后再去2的地方判断

while和for的对比

在这里插入图片描述

8. do while循环

do
 语句
while (表达式);

使用最少,先进入循环体,执行语句,然后再进行判断,为真才继续,结尾有分号
流程:
在这里插入图片描述

练习

输入一个正整数,计算是几位数

参考代码:


//输入一个数,计算是几位数
int input;
int cnt = 0;
scanf("%d", &input);
do
{
    input /= 10;
    cnt++;
} while (input);
printf("%d", cnt);

9. break和continue语句

 break的作用是永久终止循环,只要遇到break,就会跳出循环
 continue的作用是跳过本次循环continue之后的代码,for和while中有所差异

break举例

 int i = 1;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 break;
 printf("%d ", i);
 }

执行结果:
在这里插入图片描述
i值加到5时,会直接跳出循环,后面的代码也不执行

continue举例

 int i = 1;
 for(i=1; i<=10; i++)
 {
 if(i == 5)
 continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
 printf("%d ", i);
 }

结果:
在这里插入图片描述
i=5时会跳过下面代码,继续循环,所以不输出5

10. 循环的嵌套

练习

找出100-200之间的素数,并打印在屏幕上
注:素数是只能被1和本身整除的数

解析

  1. 首先生成100-200之间的数,使用循环
  2. 判断该数字是不是素数,需要和2-该数字-1的值取模,如果结果为0,则不是素数,生成这个数字需要嵌套循环

参考代码:

//生成100-200的素数
for (int i = 100; i <= 200; i++)
{
    int flag = 1;
    for (int j = 2; j <= i - 1; j++) {

        if (i % j == 0) {
            flag = 0;
            break;
        }
    }
    if(flag)
    printf("%d ", i);
}

结果:
在这里插入图片描述

优化方案:

  1. 100不是素数,从101开始判断,偶数肯定不是素数,所以i值每次+2
  2. 如果一个数n可以拆分成a*b的形式,那么肯定有一个因子是小于√n,只需要判断√n范围,只要有一个因子,就说明该数不是素数
for (int i = 101; i <= 200; i+=2)
{
    int flag = 1;
    for (int j = 2; j <= sqrt(i); j++) {

        if (i % j == 0) {
            flag = 0;
            break;
        }
    }
    if(flag)
    printf("%d ", i);
}

10. goto语句

goto语句和跳转标号,可以在同一函数内跳转到设置好的标号

printf("hehe\n");
 goto next:
 printf("haha\n");
 
next:
 printf("跳过了haha的打印\n");

got语句会打乱程序的执行流程,尽量少用。但在多层循环的情况下跳出,会非常方便

猜数游戏

要求:

  1. 游戏界面
  2. 生成1-100随机数
  3. 玩猜字游戏,大了或是小了给出对应提示,限定5次机会,猜对游戏结束,回到游戏界面

解析

  1. 随机数的产生
    rand()函数会返回一个伪随机数,范围是0-RAND_MAX之间,大部分编译器的大小是32767
    头文件是stdlib.h
    伪随机数,即每次启动程序生成的随机数和上一次是一样的,因为rand是根据一个固定的"种子"为基准计算的
  2. 初始化随机数
    srand()可以设置随机数种子,不设置rand的种子默认为1,可以用时间来作为随机数种子,因为时间是每时每刻都在变化的,time函数可以返回1970年1月1日0时0分0秒到程序运行的时间差值,单位秒。返回类型是time_t,本质是32位或64位整形,返回一个时间戳,可以转化为对应的时间
  3. 1-100的随机数,用rand生成数再模100,值为0-99,最后加1
    在这里插入图片描述在这里插入图片描述vs2022 time_t的说明:
//VS2022 上time_t类型的说明
 #ifndef _CRT_NO_TIME_T
 #ifdef _USE_32BIT_TIME_T
 typedef __time32_t    time_t;
 #else
 typedef __time64_t    time_t;
 #endif
 #endif
 typedef long        __time32_t;
 typedef __int64     __time64_t;

32位time_t本质是long类型
srand的参数是unsinged int类型,所以需要转换。srand只需要生成一次

代码:

//主界面
void show() {
    printf("********************\r\n");
    printf("*****1.开始游戏*****\r\n");
    printf("*****0.退出游戏*****\r\n");
    printf("********************\r\n");
}
//游戏循环
void game() {
    //生成1-100随机数
    int number = rand() % 100 + 1;
    int innumber = 0;     //用户输入
    int cnt = 1;          //记录次数
    printf("猜一个数\r\n");
    while (1)
    {
        if (cnt > 5) {
            printf("猜数失败\r\n");
            break;
        }
        scanf("%d",&innumber);
        if (innumber == number) {
            printf("猜对了\r\n");
            break;
        }
        if (innumber > number)
            printf("猜大了\r\n");
        if (innumber < number)
            printf("猜小了\r\n");
        cnt++;
    }
}

int main()
{
	 int input=0;
//生成随机数
srand((unsigned int)time(NULL));
do
{
    show();
    //用户选择游戏或退出
    scanf("%d", &input);
    switch (input)
    {
    case 1:
        game();
        break;
    case 0:
        break;
    default:
        printf("输入错误\r\n");
        break;
    }

} while (input);;
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值