6.郝斌C语言笔记——流程控制

1.表达式与语句的区别

    > 不含有分号的是表达式
    > 含有分号的是语句

2.什么是流程控制

    程序代码执行的顺序

3.流程控制的分类

顺序
选择
    > 定义:
        某些代码可能执行,也可能不执行,有选择的执行某些代码
    >分类:
        - if
            · if最简单的用法
                格式:
                    if (表达式)
                        语句;
                功能:
                    如果表达式为真,执行语句
                    如果表达式为假,语句不执行

            · if的范围问题
                if (表达式)
                    语句A;
                    语句B;
                解释:
                    if默认只能控制语句A的执行或不执行
                    if无法控制语句B的执行或不执行

                if (表达式)
                {
                    语句A;
                    语句B;
                }
                此时if可以控制语句A和语句B
                /*
                    由此可见:
                        if默认只能控制一个语句的执行或不执行
                        如果想控制多个语句的执行或不执行,就必须把这些语句用{}括起来
                */

            · if ... else ... 的用法

            · if ... else if ... else ...的用法
                格式:
                    if (1)
                        A;
                    else if (2)
                        B;
                    else if (3)
                        C;
                    else
                        D;
            · C语言对真假的处理
                非零是真
                零就是假

                真用1表示
                假用0表示
            · if举例 —— 求分数的等级
                /*
                    时间:2020年2月13日
                    功能:求分数的等级
                    目的:举例
                */
                #include <stdio.h>

                int main(void)
                {
                    float score;

                    printf("请输入您的考试成绩:");
                    scanf("%f", &score);

                    if (score > 100)
                        printf("这是做梦!\n");
                    else if (score >= 90 && score <= 100)
                        printf("优秀!\n");
                    else if (score >= 80 && score <= 90)
                        printf("良好!\n");
                    else if (score >= 60 && score < 80)
                        printf("不及格!继续努力!\n");
                    else
                        printf("输入的分数过低,不要如此自卑!\n");

                    return 0;
                }
                /*
                    在Microsoft Visual Studio 2010的过程:
                    -----------------------------------
                        请输入您的考试成绩:88
                        良好!
                        请按任意键继续. . .
                    -----------------------------------
                */
            · if的常见问题解析
            
                空语句的问题
                    if (3 > 2);
                等价于
                    if (3 > 2)
                        ;//这是一个空语句
                

                if (表达式1)
                    A;
                else
                    B;
                是正确的


                if (表达式1);
                    A;
                else
                    B;
                是错误的


                if (表达式1)
                    A;
                else if (表达式2)
                    B;
                else if (表达式3)
                    C;
                else
                    D;
                即便表达式12都成立,也只会执行A语句


                if (表达式1)
                    A;
                else if (表达式2)
                    B;
                else if (表达式3)
                    C;
                这样写语句不会出错,但逻辑上有漏洞


                if (表达式1)
                    A;
                else if (表达式2)
                    B;
                else if (表达式3)
                    C;
                else (表达式4)  //50行
                    D;
                这样写是不对的,正确的写法是:
                    要么去掉50行的(表达式4)
                    要么在50行的else后面加if
                

                if (表达式1)
                    A;
                else if (表达式2)
                    B;
                else if (表达式3)
                    C;
                else (表达式4);
                    D;
                这样写语法不会出错,但逻辑上是错误的
                    else (表达式4);
                        D;
                等价于
                    else
                        (表达式4);
                    D;
        - switch
            · 格式:
                switch (表达式)
                {
                    case 常量表达式1:
                        语句1;
                    break;

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

                    case 常量表达式... ...:
                        语句... ...;
                    break;

                    default:
                        语句4;
                    break;    
                }
            ·注意:
                所有case后面的常量表达式为便于描述我们姑且称之为标签,这些标签都只能是:
                    枚举常量(有些书称之为枚举元素)
                    数值常量
                    字符常量
                    常变量
                    宏名中的一种,注意普通变量,枚举变量是不能作为标签使用的
                    
                switch后面括号里面的"表达式"允许是任何类型,但在VC++中只允许为intchar类型
                    
                执行完一个case语句后,流程控制就转移到下一个case字句继续执行。"case"常量表达式只是起语句标点的作用,并不是在该处进行条件判断。在执行switch语句时,根据switch()中表达式的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断

                switch是选择不是循环,如果在switch中出现了break语句。该语句的功能只是退出switch语句转去执行它下面的语句。在switch中出现continue是错误的,除非switch本身就属于forwhile循环的一部分
            · 例子 —— 电梯程序:
                /*
                    时间:2020年2月14日
                    功能:电梯程序
                    目的:举例
                */
                #include <stdio.h>

                int main(void)
                {
                    int val;

                    printf("请输入您要进入的楼层:");
                    scanf("%d", &val);

                    switch (val)
                    {
                        case 1:
                            printf("1层开!\n");
                            break;
                        case 2:
                            printf("2层开!\n");
                            break;
                        case 3:
                            printf("3层开!\n");
                            break;
                        default:
                            printf("没有盖到这一层!\n");
                            break;
                    }

                    return 0;
                }
                /*
                    在Microsoft Visual Studio 2010的过程:
                    -----------------------------------
                        请输入您要进入的楼层:3
                        3层开!
                        请按任意键继续. . .
                    -----------------------------------

                    总结:
                        ... ...
                */
循环
    >定义:
        某些代码会被重复执行
    >分类:
        - for
            · 格式:
                for (1; 2; 3)
                    语句A;
            · 执行的流程【重点】
                单个for循环的使用
                    for (1; 2; 3)
                        语句A;
                    执行顺序:
                                    ______________________________
                                    |                            |
                                    v                            |
                        1 -> (判断2是否为真) —— () ——> 语句A; -> 3
                                            —— () ——> 结束for循环
                    

                多个for循环的嵌套使用
                    for (1; 2; 3)   //1行
                        for(1; 2; 3)    //2行
                            A;  //3行
                            B;  //4行
                    整体是两个语句,123行是第一语句,4行是第二语句


                    for (1; 2; 3)
                        for (4; 5; 6)
                        {
                            A;
                            B;
                        }
                    整体是一个语句


                    for (7; 8; 9)
                        for (1; 2; 3)
                        {
                            A;
                            B;
                            for (4; 5; 6)
                                C;
                        }
                    整体是一个语句


            · 范围问题
            · 举例:
                例子 —— 1 + 2 + 3 + ... ... +100
                    /*
                        时间:2020年2月14日
                        功能:1 + 2 + 3 + ... ... +100
                        目的:举例
                    */
                    #include <stdio.h>

                    int main(void)
                    {
                        int val = 0;
                        int i;

                        for (i = 1; i <= 100; ++i)
                        {
                            val += i;	//等价于 val = val + i;
                        }
                        printf("1 + 2 + 3 + ... ... +100 = %d\n", val);

                        return 0;
                    }
                    /*
                        在Microsoft Visual Studio 2010的过程:
                        -----------------------------------
                            1 + 2 + 3 + ... ... +100 = 5050
                            请按任意键继续. . .
                        -----------------------------------

                        总结:
                            ... ...
                    */
                例子 —— 1 + 1/2 + 1/3 + ... ... + 1/100
                    /*
                        时间:2020年2月14日
                        功能:1 + 1/2 + 1/3 + ... ... + 1/100
                        目的:举例
                    */
                    #include <stdio.h>

                    int main(void)
                    {
                        double val = 0.0;
                        int i;

                        for (i = 1; i <= 100; ++i)
                        {
                            val += (1 / (double)(i));	//等价于 val = val + (1 / (double)(i));
                        }
                        printf("1 + 1/2 + 1/3 + ... ... + 1/100 = %lf\n", val);

                        return 0;
                    }
                    /*
                        在Microsoft Visual Studio 2010的过程:
                        -----------------------------------
                            1 + 1/2 + 1/3 + ... ... + 1/100 = 5.187378
                            请按任意键继续. . .
                        -----------------------------------

                        总结:
                            ... ...
                    */
        - while
            · 执行顺序
                格式:
                    while (表达式)
                        语句;
                顺序:
                    先判断表达式是否为真,
                    真就执行语句,语句执行完再判断表达式是否继续为真,
                    直到判断表达式为假,循环结束
            · 与for的相互比较
                for (1; 2; 3)
                    A;
            等价于
                1;
                while (2)
                {
                    A;
                    3;
                }
            whilefor可以相互转化,for的逻辑性更强,更不容易出错,推荐多使用for
            · 例子 —— 从键盘输入一个数字,如果该数字是回文数,则返回yes,否则返回no
                回文数: 正着写和倒着写都一样,:121 12321 都是回文数
                /*
                    时间:2020年2月14日
                    功能:判断回文数
                    目的:举例
                */
                #include <stdio.h>

                int main(void)
                {
                    int val;
                    int m;
                    int sum = 0;

                    printf("请输入您需要判断的数字:");
                    scanf("%d", &val);

                    m = val;
                    while (m)
                    {
                        sum = sum * 10 + (m % 10);
                        m /= 10;
                    }

                    if (sum == val)
                        printf("yes!\n");
                    else
                        printf("no!\n");

                    return 0;
                }
                /*
                    在Microsoft Visual Studio 2010的过程:
                    -----------------------------------
                        请输入您需要判断的数字:12321
                        yes!
                        请按任意键继续. . .
                    -----------------------------------

                    总结:
                        ... ...
                */
            · 什么时候使用while,什么时候使用for
                没法说,用多了自然而然就知道了
        - do ... while
            · 执行顺序:
                格式:
                    do
                    {
                        语句;
                    }while (表达式);
                顺序:
                    先执行语句,再判断表达式是否为真,
                    真执行语句,执行完语句,再判断表达式是否为真,
                    直到判断表达式为假,循环结束
                
            · do ... while并不等价于for,当然也不等价于while

            · do ... while主要用于人机交互
            · 例子 —— 一元二次方程
                /*
                    时间:2020年2月14日
                    功能:一元二次方程
                    目的:举例
                */
                #include <stdio.h>
                #include <math.h>

                int main(void)
                {
                    double a, b, c;
                    double delta;
                    double x1, x2;
                    char ch;

                    do
                    {
                        printf("请输入一元二次方程的三个系数:\n");
                        printf("a = ");
                        scanf("%lf", &a);

                        printf("b = ");
                        scanf("%lf", &b);

                        printf("c = ");
                        scanf("%lf", &c);
                        
                        delta = b * b - 4 * a * c;

                        if (delta > 0)
                        {
                            x1 = (-b + sqrt(delta) / (2 * a));
                            x2 = (-b - sqrt(delta) / (2 * a));
                            printf("有两个解;x1 = %f, x2 = %f\n", x1, x2);
                        }
                        else if (0 == delta)
                        {
                            x1 = x2 = (-b) / (2*a);
                            printf("有一个解;x1 = x2 = %f\n", x1);
                        }
                        else
                        {
                            printf("无解\n");
                        }

                        printf("您想继续么(Y/N):");
                        scanf(" %c", &ch);
                        //注意%c前必须得加一个空格
                        //原因:
                        //	空白符的问题
                    }while('y' == ch || 'Y' == ch);

                    return 0;
                }
                /*
                    在Microsoft Visual Studio 2010的过程:
                    -----------------------------------
                        请输入一元二次方程的三个系数:
                        a = 1
                        b = 9
                        c = 5
                        有两个解;x1 = -5.094875, x2 = -12.905125
                        您想继续么(Y/N):n
                        请按任意键继续. . .
                    -----------------------------------

                    总结:
                        ... ...
                */
        - breakcontinue
            · break:
                break如果用于循环是用来终止循环

                break如果用于switch,则是用于终止switch

                break不能直接用于if,除非if属于内部的一个句子                
                    例子:
                        for (i = 0; i < 3; ++i)
                        {
                            if (3 > 2)
                                break;//break虽然是if内部的语句,
                                    //但break终止的确是外部的for循环
                                printf("嘿嘿!\n");//永远不会输出
                        }
                
                在多层循环中,break只能终止最里面包裹它的那个循环
                    例子:
                        for (i = 0; i < 3; ++i)
                        {
                            for (j = 1; j < 4; ++j)
                                break; //break只能终止距离它最近的循环
                            printf("同志们好!\n");
                        }

                在多层switch嵌套中,break只能终止距离它最近的switch
                    例子:
                        int x = 1, y = 0, a = 0, b = 0;
                        switch (x)
                        {
                            case 1:
                                switch (y)//第二个switch
                                {
                                    case 0:
                                        a++;
                                        break;//终止的是第二个switch
                                    case 1:
                                        b++;
                                        break;
                                }
                                b = 100;
                                break; //终止的是第一个switch
                            case 2:
                                a++;
                                b++;
                                break;
                        }
                        printf("%d %d\n", a, b);
                        最终输出结果是: 1 100
            · continue:
                用于跳过本次循环余下的语句,转去判断是否需要执行下次循环
                    例子:
                        for (1; 2; 3)
                        {
                            A;
                            B;
                            continue;//如果执行该语句,则执行完该语句后,会执行语句3,C和D都会被跳过去,C和D不会被执行
                            C;
                            D;
                        }

                        while (表达式)
                        {
                            A;
                            B;
                            continue;//如果执行该语句,则执行完该语句后,会执行表达式,C和D都会被跳过去,C和D不会被执行
                            C;
                            D;
                        }

如有不对或者疏漏的地方,请多多指出。谢谢(⁄ ⁄•⁄ω⁄•⁄ ⁄)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值