美文网首页C语言
07-流程控制

07-流程控制

作者: Andy_Livings | 来源:发表于2020-05-29 10:24 被阅读0次

    一、流程控制

    • 顺序结构:默认的流程结构。按照书写顺序执行每一条语句。
    • 选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。
    • 循环结构:在给定条件成立的情况下,反复执行某一段代码。


      流程控制

    二、选择结构-if

    1.简单使用
     if (表达式)  语句1; 
     if(count>50)  开班;  上课;
    
    if(表达式)  语句1;  else 语句2;
    if(count>50)  开班;  else 不开班;
    
    if(表达式)  {  }
    if(count>50)  {开班; 布置课室;}  else {}
    { }的作用域
    
    if -else if-else
    if(a==0) else if (a>0)  else 
    
    • 特点:只有一个括号会被执行

    • 复合条件

    • 上课时间的取值范围(9~12 || 14 ~17)

    • 陷阱

    if(a!=0)  { a不是0;} else {a是0;}
    if (a); {  }
    if (a=0)  
    a == 0;
    if (10) int a = 9;
    
    2.习题

    1>输入一个整数day代表星期几,根据day的值输出对应的星期几,比如day==1,就输出“星期一”

    2>输入一个整数month代表月份,根据月份输出对应的季节。
    春季:3、4、5
    夏季:6、7、8
    秋季:9、10、11
    冬季:12、1、2

    3>输入一个整数score代表分数,根据分数输出等级(A-E)(用两种方式)
    A:90~100
    B:80~89
    C:70~79
    D:60~69
    E:0~60

    三、选择结构-switch

    1.简单使用
    switch(表达式) { case 数值1: break; … default: break;}
    
    • 举例
    int a = 10;
     switch (a) {
         case 0:
             printf("这是一个0");
             break;
         case 5:
             printf("这是一个5");
             break;
         case 10:
             printf("这是一个10");
             break;
         default:
             printf("什么也不是");
             break;
     }
    
    • 简述break的作用
    • 在case中定义变量
    2.if和switch的对比
    • 很多情况可以互换
    • if用得比较多,比较灵活,switch只能某个单值
    3.习题

    用switch替代if实现if中的习题

    四、循环结构-while

    1.简单使用
    连续printf(“俯卧撑”)20次;
    while(表达式) { }
    continue:输出5次休息一下
    break的使用:某次的时候停止循环
    
    2.特点

    只有条件成立才会执行循环体

    3.陷阱
    while(条件);
    

    五、循环结构-do while

    • 特点:一定会执行一次循环体
    • while和do while循环对比
    int i=0;
    while(i<0){
     i++;
    }
    
    int i=0;
    do{
     i++;
    } while(i<0);
    

    六、循环结构-for

    1.简单实用
    • 运行过程
    • 初始化语句等可以是多句(把printf放到for的括号中)
    2.for循环嵌套

    好友列表1
    好友1
    好友2
    好友列表2
    好友1
    好友2
    好友列表3
    好友1
    好友2

    3.陷阱

    1>死循环 for(;;);
    2>for循环体内部变量的作用域
    3>作用域混淆

    for (int i = 0; i<5; i++)  int a = 10;
    
    4.while循环和for循环的比较
    • 可以互换
    • for循环的变量可以及时回收

    七、break和continue

    1.break
    • 使用场合:switch\循环结构
    • 循环嵌套下的break
    2.continue
    • 使用场合:循环结构
    • 循环嵌套下的continue

    八、总结

    一、选择结构
    1.if
    1> 结构
    if (条件) {
    
    } else if (条件2) {
    
    } else if (条件3) {
    
    } else {
        
    }
    
    2> 特点
    * 同一时刻,只有一个大括号里面的代码会被执行
    
    2.switch
    1> 结构
    switch (数值) {
        case 数值1:
            break;
        
        case 数值2:
            break;
        
        case 数值3:
            break;
        
        default:
            break;
    }
    2> 特点
    1> 默认情况下,只有一个case后面的代码会被执行
    2> 如果一个case后面没有break,而且这个case成立,就会按顺序执行后面所有case中的语句,直到遇到break为止
    3> 如果要在case后面定义一个新的变量,必须用大括号{}包住
    
    二、循环结构
    1.while
    1> 特点:如果一开始条件不成立,永远不会执行循环体
    2.do while
    1> 特点:不管条件是否成立,至少会执行一次循环体
    3.for
    4.选择
    1> 一般优先使用for循环
    2> 然后再考虑while
    3> 最后再考虑do while
    



    九、程序实现

    01- if

    void if_practice(void) {
        
        /*
         1.if的第1种结构
         if(条件) {
         语句1;
         语句2;
         ......
         }
         
         2.if的第2种结构
         if(条件1) {
         语句1;
         语句2;
         ......
         } else {
         
         }
         
         3.if的第3种结构
         if(条件1) {
         语句1;
         语句2;
         ......
         } else if (条件2) {
         
         } else if(条件3) {
         
         } else if(条件4) {
         
         }  else
         {
         
         }
         
         4.if的第4种结构
         if (条件)
         语句1;
         */
        
        int a = -10;
        
        if (a>1)
            printf("A\n");
        
        printf("B\n");
    }
    

    02-if使用注意

    void note_if_usage(void) {
        
        /*
         if (0) {
         printf("A\n");
         } else {
         printf("B\n");
         }
         */
        
        /*
         int a = 1044343;
         比较大小时,常量值放左边,变量放右边
         //if (a = 0)
         if (0 == a) {
         printf("a等于0\n");
         } else {
         printf("a不等于0\n");
         }
         */
        
        /*
         int a = 10;
         // 注意赋值运算符,不要写成两个=
         a = 15;
         printf("%d\n", a);
         */
        
        /* if语句后面不要写;
         if ( 5>6 );
         {
         printf("A\n");
         }
         */
        
        /*
         if (10 > 6) {
         int a = 5;
         }
         printf("%d\n", a);
         */
        
        /*
        // 下面的代码是错误的:作用域不明确
        if (10 > 6)
            int a = 5;
        // 如果要在if后面的语句中定义新的变量,必须用大括号{}
        //printf("%d\n", a);
         */
        
        /*
         书写格式
         int a = 10;
         if (a>10) {
         
         } else if (a>5) {
         
         } else {
         
         }
         
         if () {
         
         } else if ()
         {
         
         } else {
         
         }
         */
    }
    

    03-if练习

    void if_practice_practice(void) {
        
        /*
         输入一个整数score代表分数,根据分数输出等级(A-E)(用两种方式)
         A:90~100
         B:80~89
         C:70~79
         D:60~69
         E:0~60
         */
        
        // 1.提示输入
        printf("请输入分数值:\n");
        
        // 2.接收输入
        int score;
        scanf("%d", &score);
        
        // 3.判断等级 (性能最高)
        if (score >= 90 && score <= 100) { // [90, 100]
            printf("A\n");
        } else if (score >= 80) { // [80, 89]
            printf("B\n");
        } else if (score >= 70) { // [70, 79]
            printf("C\n");
        } else if (score >= 60) { // [60, 69]
            printf("D\n");
        } else { // (-∞, 59]
            printf("E\n");
        }
        
        /* 性能中等
         if (score >= 90 && score <= 100) { // [90, 100]
         printf("A\n");
         } else if (score >= 80 && score <= 89) { // [80, 89]
         printf("B\n");
         } else if (score >= 70 && score <= 79) { // [70, 79]
         printf("C\n");
         } else if (score >= 60 && score <= 69) { // [60, 69]
         printf("D\n");
         } else { // (-∞, 59]
         printf("E\n");
         }
         */
        
        /* 性能最差
         if (score >= 90 && score <= 100) { // [90, 100]
         printf("A\n");
         }
         
         if (score >= 80 && score <= 89) { // [80, 89]
         printf("B\n");
         }
         
         if (score >= 70 && score <= 79) { // [70, 79]
         printf("C\n");
         }
         
         if (score >= 60 && score <= 69) { // [60, 69]
         printf("D\n");
         }
         
         if (score <= 59) { // (-∞, 59]
         printf("E\n");
         }
         */
    }
    

    04-switch

    void switch_practice(void) {
        
        /*
         if (条件) {
         
         }
         
         switch (数值) {
         case 数值1:
         语句1;
         break;
         
         case 数值2:
         语句2;
         break;
         
         default :
         语句3;
         break;
         }
         */
        
        //int a = 10;
        // break:退出整个switch语句
        // 如果case后面没有break,就会执行后面所有case中的语句,直到遇到break为止
        /*
         int b = 10;
         
         switch (a) {
         case 10:
         printf("A\n");
         b++;
         case 5:
         printf("B\n");
         b++;
         case 0:
         printf("C\n");
         b++;
         break;
         default:
         printf("D\n");
         break;
         }
         
         printf("b的值是%d\n", b);*/
        
        char c = '+';
        int a = 10;
        int b = 20;
        // 如果要在case后面定义新的变量,必须用大括号{}包住
        switch (c) {
            case '+':
            {
                int sum = a + b;
                printf("和是%d\n", sum);
                break;
            }
                
            case '-':
            {
                int minus = a - b;
                printf("差是%d\n", minus);
                break;
            }
        }
    }
    

    05-switch练习

    void switch_practice_practice(void) {
        
        /*
         输入一个整数score代表分数,根据分数输出等级(A-E)(用两种方式)
         A:90~100 score/10 == 9、10
         B:80~89  score/10 == 8
         C:70~79  score/10 == 7
         D:60~69  score/10 == 6
         E:0~60
         */
        
        int score = 100;
        
        switch (score/10) {
            case 10: // 100
            case 9: // 90+
                printf("A\n");
                break;
            case 8: // 80+
                printf("B\n");
                break;
            case 7: // 70+
                printf("C\n");
                break;
            case 6: // 60+
                printf("D\n");
                break;
            default:
                printf("E\n");
                break;
        }
        
        
        /*
         if和switch
         1> if语句能完成的功能,switch并不一定能完成
         int a = 10;
         if (a>100) {
         
         }
         
         2> 在有些情况下,if语句和switch语句可以互换
         3> switch能完成的功能,if语句都能完成
         */
    }
    

    06-while

    void while_practice(void) {
        
        /*
         if (条件) {
         
         }
         
         while (条件) {
         循环体
         }
         
         运行原理
         1.如果一开始条件就不成立,永远不会执行循环体
         2.如果条件成立,就会执行一次循环体,执行完毕,再次判断条件是否成立......
         
         break
         直接结束整个while循环
         
         continue
         结束当前的循环体,进入下一次循环体的执行
         */
        
        
        // 1.先确定需要重复执行的操作
        // 2.再确定约束条件
        
        // 定义一个变量记录做的次数
        int count = 0;
        
        /*
        while (count < 50) {
            ++count;
            
            if (count%10 != 0) {
                printf("执行第%d次循环操作\n", count);
            }
        }
         */
        
        /*
        while (count < 50) {
            ++count;
            
            if (count%10 == 0) {
                // 直接结束这一次循环体,进入下一次循环
                continue;
            }
            
            printf("执行第%d次循环操作\n", count);
        }
         */
        
        while (count < 50) {
            ++count;
            
            printf("执行第%d次循环操作\n", count);
            
            if (count == 20) {
                break;
            }
        }
        
    }
    

    07-while练习_01

    int while_practice_01(void) {
        
        // 提示用户输入一个正整数n,计算1+2+3+…+n的和
        
        // 1.提示输入
        printf("请输入一个正整数:\n");
        
        // 2.接收输入
        // 定义变量保存用户输入的整数
        int n;
        scanf("%d", &n);
        
        if (n <= 0) {
            printf("非法输入\n");
            return 0;
        }
        
        // 3.计算
        // (1 + n) * n / 2;
        // 定义变量保存和
        int sum = 0;
        int number = 0; // 默认被加的数值
        
        while (number < n) {
            number++;
            sum += number; // 累加
        }
        
        printf("%d\n", sum);
        
        return 0;
    }
    

    08-while练习_02

    int while_practice_02(void) {
        
        // 提示用户输入一个正整数n,计算1+2+3+…+n的和
        
        // 定义变量保存用户输入的整数
        int n = 0; // 一定要初始化
        
        while (n <= 0) {
            // 1.提示输入
            printf("请输入一个正整数:\n");
            
            // 2.接收输入
            scanf("%d", &n);
        }
        
        // 3.计算
        // (1 + n) * n / 2;
        // 定义变量保存和
        int sum = 0;
        int number = 0; // 默认被加的数值
        while (number < n) {
            number++;
            sum += number; // 累加
        }
        
        printf("%d\n", sum);
        return 0;
    }
    

    09-while练习_03

    void while_practice_03(void) {
        
        // 计算1~100中所有3的倍数的个数
        // 记录3的倍数的个数
        int count = 0;
        
        // 记录当前检查的数值
        int number = 0;
        
        while (number < 100) {
            number++;
            
            // 说明number是3的倍数
            if (number%3 == 0) {
                count++;
            }
        }
        
        printf("1~100内3的倍数的个数:%d\n", count);
    }
    

    10-while注意点

    void while_attention(void) {
        
        /*
         while (10) {
         printf("哈哈哈哈\n");
         }
         */
        
        /*
         int a = 10;
         // while (a > 0); 死循环
         while (a>0) {
         a--;
         printf("哈哈哈\n");
         }
         */
        
        // 最简单的死循环
        //while(1);
    }
    

    11-do-while

    void do_while_practice(void) {
        
        /*
         while (条件) {
         
         }
         
         do {
         
         } while(条件);
         
         while和do-while的区别
         1.很多情况下,while和do while可以互换
         
         2.while特点:如果一开始的条件不成立,永远不会执行循环体
         do while特点:不管一开始的条件是否成立,至少会执行一次循环体
         
         3.最好使用while
         */
        
        int i = 0;
        
        /*
         while (i<0) {
         i++;
         }
         */
        
        do {
            i++;
        } while (i < 0);
        
        printf("i = %d\n", i);
    }
    

    12-for

    void for_practice(void) {
        
        /*
         for (语句1; 条件; 语句2) {
         循环体
         }
         
         语句1:初始化语句
         语句2:增量语句(执行完循环体后再执行的语句)
         
         1.for一开始就会执行一次语句1(整个for循环只会执行一次)
         2.判断条件是否成立,如果条件成立,就会执行一次循环体,然后就会执行语句2,再次判断条件是否成立
         */
        
        /*
         "做俯卧撑"50次
         */
        /*
         int count = 0;
         
         for ( ; count < 50; ) {
         printf("做俯卧撑\n");
         count++;
         }
         */
        
        /*
         for (int count = 0; count < 50; ) {
         printf("做俯卧撑\n");
         count++;
         }
         */
        
        /*
         for (int count = 0; count < 50; count++) {
         printf("做俯卧撑\n");
         }
         */
        
        /*
         for (int count = 0; count < 50; printf("做俯卧撑\n"),printf("哈哈哈\n"),count++) {
         
         }
         */
    }
    

    13-for使用注意

    void for_usage_note(void) {
        
        /* 不要随便在for()后面写分号
         for (int i=0; i<5; i++);
         {
         printf("哈哈\n");
         }
         */
        
        /* 错误:变量a的作用域不明确
         如果要在循环体中定义新的变量,必须用大括号{}包住
         for (int i=0; i<5; i++)
         
         int a = 10;
         */
        
        /* 错误
         for (int i = 0; i < 10; i++, a++)
         {
         // a只能用在循环体{}中
         int a = 10;
         }
         */
        
        /*
         int a = 10;
         
         for (int i=0, a= 9; i<5; i++) {
         //int i = 10;
         int a = 11;
         
         printf("a = %d\n", a);
         }
         */
        
        // 最简单的利用for循环实现死循环
        // for(;;);
    }
    

    14-for循环嵌套

    void for_loops_nested(void) {
        
        /*
         好友列表1
         好友1
         好友2
         好友列表2
         好友1
         好友2
         好友列表3
         好友1
         好友2
         */
        
        for (int i = 1; i <= 4; i++) {
            //printf("好友列表%d\n", i + 1);
            printf("好友列表%d\n", i);
            
            /*
             printf("    好友1\n");
             printf("    好友2\n");
             printf("    好友3\n");
             printf("    好友4\n");
             printf("    好友5\n");*/
            
            for (int j = 1; j <= 7; j++) {
                printf("    好友%d\n", j);
            }
        }
    }
    

    15-for循环嵌套练习

    void for_loops_nested_practice(void) {
        
        /*
         提示用户输入一个正整数n,如果n=5,就输出下列图形,其他n值以此类推
         *****
         ****
         ***
         **
         *
         */
        
        // 1.定义一个变量存储用户输入的值
        int n = 0; // 一定要初始化
        
        // 2.判断n值合不合理
        while (n <= 0) {
            // 2.1 提示用户输入正整数
            printf("请输入一个正整数:\n");
            
            // 2.2 接收输入的数据
            scanf("%d", &n);
        }
        
        // 3.输出图形
        for (int i = 0; i < n; i++) { // 有多少行
            //printf("*****\n");
            for (int j = 0; j < n-i; j++) { // 每一行有多少个
                printf("*");
            }
            
            printf("\n");
        }
    }
    

    16-输出九九乘法表

    void output_multiplication_table(void) {
        
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                
                printf("%d * %d = %2d  ", i, j, i * j);
            }
            printf("\n");
        }
    }
    

    17-break和continue

    void break_and_continue(void) {
        
        /*
         break:
         1.使用场合
         1> switch语句:退出整个switch语句
         2> 循环结构:退出整个循环语句
         * while
         * do while
         * for
         2.注意点
         只对最近的循环结构有效
         
         continue:
         1.使用场合
         循环结构:结束当前这次的循环体,进入下一次循环体
         * while
         * do while
         * for
         2.注意点
         只对最近的循环结构有效
         */
        
        /*
        for (int i = 0; i < 5; i++) {
    //        printf("%d\n", i);
            
            if (i % 2) {
                // i为奇数:1、3
                printf("奇数:%d\n", i);
                continue;
            }
        }
         */
        
        /*
        for (int i = 0; i < 5; i++) {
            
            printf("哈哈哈\n");
            continue;
            printf("哈哈哈23\n");
        }
         */
        
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 2; j++) {
                if (j == 1) {
                    break;
                }
                
                printf("A\n");
            }
            
            break;
            
            printf("B\n");
        }
        
    }
    

    18-提示用户输入一个正整数n,利用while循环计算并输出:1-2+3-4+5-6+7…+n的和

    void while_loop_to_calculate_and_output(void) {
        
        // 1.定义变量存储用户输入的整数
        int n = 0;
        
        // 2.判断n是否为正整数
        while (n <= 0) {
            // 2.1 提示输入
            printf("输入一个正整数:\n");
            
            // 2.2 让用户输入
            scanf("%d", &n);
        }
        
        // 3.计算阶乘
        int sum = 0; // 存储计算结果
        int current = 0; // 当前要累加的数值
        while (current < n) {
            current++;
            
            // 如果是偶数,就减
            if (current % 2 == 0) {
                sum -= current;
            } else { // 如果是奇数,就加
                sum += current;
            }
        }
        
        // 4.输出结果
        printf("%d\n", sum);
    }
    

    19-提示用户输入一个正整数n,计算并输出n的阶乘结果:123n

    void calculate_and_output_n_factorial_results(void) {
        
        // 1.定义变量存储用户输入的整数
        int n = 0;
        
        // 2.判断n是否为正整数
        while (n <= 0) {
            // 2.1 提示输入
            printf("输入一个正整数:\n");
            
            // 2.2 让用户输入
            scanf("%d", &n);
        }
        
        // 3.计算阶乘
        int result = 1; // 存储计算结果
        int current = 1; // 当前的乘数
        while (current <= n) {
            result *= current; // 累乘每次的乘数
            current++; // 乘完一次就++
        }
        
        // 4.输出阶乘结果
        printf("%d! = %d\n", n, result);
    }
    

    20-提示用户输入一个正整数n,如果n是5,就输出下列图形,其他n值以此类推

    /*
     *
     **
     ***
     ****
     *****
     */
    void following_graph_is_output(void) {
        
        // 1.定义变量存储用户输入的整数
        int n = 0;
        
        // 2.判断n是否为正整数
        while (n <= 0) {
            // 2.1 提示输入
            printf("输入一个正整数:\n");
            
            // 2.2 让用户输入
            scanf("%d", &n);
        }
        
        // 3.输出一条分隔线(跟用户的输入隔开)
        printf("-----------------\n");
        
        // 4.输出*
        for (int row = 1; row <= n; row++) { // 有多少行
            for (int col = 1; col <= row; col++) { // 每行多少个(每行的个数跟行号一样)
                printf("*");
            }
            // 输完一行后换行
            printf("\n");
        }
    }
    

    21-提示用户输入一个小于10的正整数n,如果n是5,就输出下列图形,其他n值以此类推

    /*
     1
     22
     333
     4444
     55555
     */
    void positive_integer_n_less_than_10_1(void) {
        
        // 1.定义变量存储用户输入的整数
        int n = 0;
        
        // 2.判断n是否为1~9的正整数
        while (n <= 0 || n >= 10) {
            // 2.1 提示输入
            printf("输入一个1~9的正整数:\n");
            
            // 2.2 让用户输入
            scanf("%d", &n);
        }
        
        // 3.输出一条分隔线(跟用户的输入隔开)
        printf("-----------------\n");
        
        // 4.输出
        for (int row = 1; row<=n; row++) { // 有多少行
            for (int col = 1; col<=row; col++) { // 每行多少个
                printf("%d", row); // 输出行号
            }
            printf("\n");
        }
    }
    

    22-提示用户输入一个小于10的正整数n,如果n是5,就输出下列图形,其他n值以此类推

    /*
     54321
     5432
     543
     54
     5
     */
    void positive_integer_n_less_than_10_2(void) {
        
        // 1.定义变量存储用户输入的整数
        int n = 0;
        
        // 2.判断n是否为1~9的正整数
        while (n <= 0 || n >= 10) {
            // 2.1 提示输入
            printf("输入一个1~9的正整数:\n");
            
            // 2.2 让用户输入
            scanf("%d", &n);
        }
        
        // 3.输出一条分隔线(跟用户的输入隔开)
        printf("-----------------\n");
        
        // 4.输出
        for (int row = 1; row <= n; row++) { // 有多少行
            for (int col = n; col >= row; col--) { // 每行多少个
                printf("%d", col);
            }
            printf("\n");
        }
    }
    

    23-编写一个函数int pieAdd(int n),计算1!+2!+3!+……+n!的值(n >= 1)。

    // 比如pieAdd(3)的返回值是1! + 2! + 3! = 1 + 1*2 + 1*2*3 = 9
    
    // 声明函数
    int pieAdd(int n);
    
    void function_int_pie_add(void) {
        
        int result = pieAdd(3);
        
        printf("%d\n", result);
    }
    
    // 定义函数
    int pieAdd(int n) {
        /*
         解题思路:先计算出每个数字的阶乘,再把所有的阶乘加起来
         */
        
        // 1.如果传入的n值不合理,直接返回0
        if (n < 1) return 0;
        
        // 2.定义一个变量,用来记录每次阶乘相加的结果
        int sum = 0;
        
        for (int i = 1; i <= n; i++) { // 一共有多少个数字
            
            // 3.定义一个变量,记录当前数字对应的阶乘
            int multi = 1;
            for (int j = 1; j <= i; j++) {
                multi *= j;
            }
            
            // 4.累加每次的阶乘
            sum += multi;
        }
        
        return sum;
    }
    

    相关文章

      网友评论

        本文标题:07-流程控制

        本文链接:https://www.haomeiwen.com/subject/sqhgahtx.html