黑马程序员-C语言回顾-分支结构

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、if语句介绍及基本格式

if语句实现分支控制


一般形式(第一种形式):表示如果表达式为真,执行语句块1,否则不执行。

if(表达式)

{

     语句块1;

}

后续语句;

其中if后括号里可以是表达式、常量、变量。

原理:

1)先计算小括号中表达式的值

2)如果是真,执行大括号中的语句

3)如果是假,不会执行大括号中的语句。


思考&实现1:

猜数字游戏:

输入一个数字,判断是不是等于5?如果是打印“恭喜你”,如果不是打印“很可惜”。


#include <stdio.h>

int main(int argc, const char * argv[]) {
    int num = 0;
    printf("请输入一个数字:\n");
    scanf("%d",&num);
    if (num == 5) {
        printf("恭喜你!\n");
    }
    if (num != 5) {
        printf("很可惜!\n");
    }
    return 0;
}



二、if···else···语句


if···else···语句使用

如果表达式为真,则执行语句块1,否则执行语句块2 。

if(表达式)

{

     语句块1;

}else{


      语句块2;

}

注意:

不管表达式为真还是假,都会执行一个语句块。


猜数字游戏的改进:


#include <stdio.h>

int main(int argc, const char * argv[]) {
    int num = 0;
    printf("请输入一个数字:\n");
    scanf("%d",&num);
    if (num == 5) {
        printf("恭喜你!\n");
    } else {
        printf("很可惜!\n");
    }
    return 0;
}



三、if语句的高级用法


如果表达式1为真,则执行语句块1,否则判断表达式2,如果为真执行语句块2,否则再判断表达式3,如果为真执行语句块3,当表达式1、2、3都不满足,会执行最后一个else语句。

if(表达式1)

{

语句块1;

}else if(表达式2){

语句块2;

}else if(表达式3){

语句块3;

}else{

语句块4;

}


思考&实现:

输入一个数组0~100的成绩,按0~59(E),60~69(D),70~79(C),80~89(B),90~100(A)分成几等。


#include <stdio.h>

int main(int argc, const char * argv[]) {
    int score = 0;
    printf("请输入一个0~100之间的成绩:\n");
    scanf("%d",&score);
    if (score<0||score>100) {
        printf("你输入的成绩有误!\n");
    } else if(score>=90) {     //优化,可以只用一个条件判断
        printf("你的成绩是A\n"); //     score>=90&&score<=100
    } else if (score>=80){
        printf("你的成绩是B\n");
    } else if (score>=70){
        printf("你的成绩是C\n");
    } else if (score>=60){
        printf("你的成绩是D\n");
    } else{
        printf("你的成绩是E\n");
    }
    return 0;
}




四、if语句使用的注意点

1、if(条件)  可以直接写分号

   表示什么也不干,空语句


2、if(条件) return 0; 

   程序不会往下执行了,直接退出。

  在一个函数中,return语句之后的语句都不会执行


3、if(1)  表示永真

     if(0)   表示永假


4、如果if之后的代码块,只有一句话,可以省略大括号。

也可以理解为,if条件如果没有大括号,只会影响一句话。


5、if作用域的问题

在if代码块定义的变量在外部无法访问。


6、容易疑惑的地方 作用域紊乱。

if  (a==3)

int num = 10;

这样编译是报错的,因为num在if执行完后释放,没有用。


7、省略大括号的分析


从下往上if和else配对。


五、应用:剪刀石头布游戏

游戏分析:

实现步骤:

1、定义变量,保存计算机出的拳,保存用户输入的拳。

2、先让计算机出拳。

3、给一个提示,提示让玩家出拳。

4、开始比较


代码实现:

#include <stdio.h>
#include <stdlib.h> //随机数函数的头文件
int main(int argc, const char * argv[]) {
    int computer =-1,player = -1;
    computer = arc4random_uniform(3);
    printf("请出拳: 0代表剪刀,1代表石头,2代表布\n");
    scanf("%d",&player);
    if (player<0||player>2) {
        printf("请按套路出拳!\n");
        return 0;
    }
    if ((player==0&&computer==2)||
        (player==1&computer==0)||
        (player==2&&computer==1)) {
        printf("你很吊,你赢了!\n");
    } else if (player==computer){
        printf("平局,你居然和我一样吊!\n");
    } else{
        printf("你输了,你是逗比吗?!\n");
    }
    return 0;
}




六、switch语句基本格式

1、使用格式

switch(表达式){

case 常量表达式1:   语句1;

case 常量表达式2:   语句2;

···

case 常量表达式n;  语句n;

default:      语句n+1;

}


其语义是:计算表达式的值。并逐个与气候的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。


思考&实现

接受用户输入,控制台打印菜名。


#include <stdio.h>

int main(int argc, const char * argv[]) {
    int num = 0;
    printf("请输入一个数字:\n");
    scanf("%d",&num);
    if (num<1||num>7) {
        printf("你输入的信息有误!\n");
    }
    switch (num) {
        case 1:
            printf("玉米炒葡萄\n");
            break;
        case 2:
            printf("月饼炒辣椒\n");
            break;
        case 3:
            printf("爆炒妙脆角\n");
            break;
        case 4:
            printf("番茄炒卤蛋\n");
            break;
        case 5:
            printf("南瓜炒猪肝\n");
            break;
        case 6:
            printf("苹果炒西瓜\n");
            break;
            
        case 7:
            printf("天极无极\n");
            break;
    }
    return 0;
}



七、case语句穿透问题


case语句执行的过程中,一旦进入某个分支后就会一直执行到switch结束。

为了避免上述情况,C语言还提供了一种break语句,专用于跳出switch语句,break语句只有关键字break,没有参数。在每一个case语句之后增加break语句,使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。


八、if语句和switch语句选择


1、分支比较多且无法穷尽或进行大量列举时最好用if。

2、如果分支数量不是很多,但是使用if代码量比较大的时候,可以选用switch。


九、switch使用注意事项(一)


1、表达式的类型(case语句后的值)必须是整形或可以转变为整形的值

  (byte、short、char、int类型)。

   1)整型的变量     num=10;switch(num)

   2)整型常量     10

   3)返回值是整型的表达式   5+5

   4)可以转换为int类型的表达式   ‘a’


2、功能代码部分可以有多行语句。

3、case语句后,可以有多行语句,可以加括号也可以省略括号。

4、break关键字的意思是中断,指结束switch语句,break语句为可选。



十、switch使用注意事项(二)


case值的规定

case语句的格式:

case  常理表达式:

1、case的值只能为常量。   case 10;

2、如果放表达式,那么只可以是常量表达式   case 5+5;

3、default语句的位置可以任意放。

4、case的穿呕吐问题,同样适用于default。

5、如果default语句放到switch语句的最后,可以不加break。

      如果不放到最后,是必须加break的。

6、case后面不能是实型数,单精度,双精度都不可以。

7、case语句之后,默认的第一句话不能定义变量。

    如果第一句话非要定义,应该加上大括号{ }

8、编译器的bug


应用:判断季节

练习1(主要是练习switch的用法,合理利用case穿透)

从键盘输入一个月份,输出对应季节

12~2 冬季

3~5 春季

6~8  夏季

9~11  秋季


#include <stdio.h>

int main(int argc, const char * argv[]) {
    int m=0;
    printf("请输入一个月份!\n");
    scanf("%d",&m);
    if (m<0||m>12) {
        printf("你输入的月份有误!\n");
        return 0;
    }
    switch (m) {
        case 1:
        case 2:
        case 12:
            printf("%d月是冬季!\n",m);
            break;
        case 3:
        case 4:
        case 5:
            printf("%d月是春季!\n",m);
            break;
        case 6:
        case 7:
        case 8:
            printf("%d月是夏季!\n",m);
            break;
        case 9:
        case 10:
        case 11:
            printf("%d月是秋季!\n",m);
            break;
        default:
            break;
    }
    return 0;
}



应用:实现计算器

使用switch实现简单的计算器


思路:

1、让用户输入一个数

2、让用户再输入一个符号

3、让用户输入另外一个数

4、计算结果


#include <stdio.h>

int main(int argc, const char * argv[]) {
    int num1 =0,num2 = 0,op = 0;
    float result = 0.0f;
    printf("请输入第一个操作数:\n");
    scanf("%d",&num1);
    printf("请输入运算符:0.+,  1.-, 2.*, 3./ \n");
    scanf("%d",&op);
    if (op<0||op>3) {
        printf("你输入的符号有误!\n");
        return 0;
    }
    printf("请输入第二个操作数:\n");
    scanf("%d",&num2);
    switch (op) {
        case 0:
            result = num1 + num2;
            break;
        case 1:
            result = num1 - num2;
            break;
        case 2:
            result = num1 *num2;
            break;
        case 3:
            result = num1/(float)num2;
            break;
    }
    printf("%d和%d的运算结果是%.3f\n",num1,num2,result);
    return 0;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值