• 《手把手教你学C语言》学习笔记(9)--- 程序的选择控制


      C语言是面向过程编程语言的主要代表,其特征就是严格控制程序的执行语句顺序,因此,C程序的主要结构控制就是顺序控制,以main函数为入口函数,根据控制,一条一条地执行语句。由于实际需求是很复杂的,只用顺序结构不能表示现实事物的执行流程,图灵提出了三种控制--顺序执行、选择执行和循环执行,只要合理运用这三种流程控制,可以解决世界上的任何流程控制的问题。

      所谓的选择执行就是被选中的代码被执行,没有选中的代码就不被执行。选中与否根据选择的条件来决定,主要使用前面讲解过的条件表达式,如果条件成立,对应的代码块就被执行。

      一、if选择语句:

        1、基本格式为:if(关系表达式或逻辑表达式){

                执行语句1;

                ……

                执行语句n;

              }

        语句块功能:如果括号中的关系表达式或逻辑表达式的结果为真,程序就会执行大括号中的执行语句,可以是多条也可以是一条语句

      例子中如果输入的是8 9,那么执行结果为:

      Please input two numbers splite by space: 8 9
      程序运行结束 

      如果输入的是9 8,那么执行结果为: 

      Please input two numbers splite by space: 9 8
      你输入的第一个数9大于第二个数8!
      程序运行结束
      例子的代码:

     1 #include <stdio.h>
     2 
     3 int main(int argc, char **argv)
     4 {
     5     int var1 = 0;
     6     int var2 = 0;
     7     printf("Please input two numbers splite by space: ");
     8     scanf("%d %d", &var1, &var2);
     9     if(var1 >= var2){
    10         printf("你输入的第一个数%d大于第二个数%d!
    ", var1, var2);
    11     }
    12 
    13     printf("程序运行结束
    ");                                            
    14 
    15     return 0;
    16 }     

      同一段代码,由于输入数据的次序不同,当输入的8 9时,此时var1为8, var2为9;由于关系表达式var1 >= var2的条件不成立,第10行的代码没有被执行,直接被忽略过了,直接执行了第13行的代码,屏幕输出“程序运行结束”的提示信息,程序就运行结束了。

      当输入的9 8时,此时var1为9, var2为8;由于关系表达式var1 >= var2的条件成立,第10行的代码就被执行,屏幕输出“你输入的第一个数%d大于第二个数%d!”,由于占位符%d的存在,依次使用后面的两个变量var1和var2的值填充到对应的位置,结果就变成了“你输入的第一个数9大于第二个数8!” ,随后执行了第13行的代码,屏幕输出“程序运行结束”提示信息,程序运行结束并退出。

      2、扩展格式为:if(关系表达式或逻辑表达式){

                执行语句1;

                ……

                执行语句n;

              }else{

                执行语句1;

                ……

                执行语句n;

              }

        语句块功能:如果括号中的关系表达式或逻辑表达式的结果为真,程序就会执行紧接者大括号中的执行语句,否则就执行else后大括号中的语句块。特别注意的是:else只能和if搭配使用,不能单独使用。

      例子中如果输入的是8 9,那么执行结果为:

      Please input two numbers splite by space: 8 9
      你输入的第一个数8小于第二个数9!
      程序运行结束  

      如果输入的是9 8,那么执行结果为: 

      Please input two numbers splite by space: 9 8
      你输入的第一个数9大于第二个数8!
      程序运行结束

      例子的代码:

     1 #include <stdio.h>
     2 
     3 int main(int argc, char **argv)
     4 {
     5     int var1 = 0;
     6     int var2 = 0;
     7     printf("Please input two numbers splite by space: ");
     8     scanf("%d %d", &var1, &var2);
     9     if(var1 >= var2){
    10         printf("你输入的第一个数%d大于第二个数%d!
    ", var1, var2);
    11     }else{
    12         printf("你输入的第一个数%d小于第二个数%d!
    ", var1, var2);       
    13     }
    14 
    15     printf("程序运行结束
    ");
    16 
    17     return 0;
    18 }

      同一段代码,由于输入数据的次序不同,当输入的8 9时,此时var1为8, var2为9;由于关系表达式var1 >= var2的条件不成立,第10行的代码没有被执行,执行了else后的代码第12行的代码,屏幕输出“屏幕输出你输入的第一个数%d小于第二个数%d!”,由于占位符%d的存在,依次使用后面的两个变量var1和var2的值填充到对应的位置,结果就变成了“你输入的第一个数9小于第二个数8!”,接着执行第15行,输出“程序运行结束”的提示信息,程序就运行结束了。

      当输入的9 8时,此时var1为9, var2为8;由于关系表达式var1 >= var2的条件成立,执行if后的代码第10行的代码就被执行,屏幕输出“你输入的第一个数%d大于第二个数%d!”,由于占位符%d的存在,依次使用后面的两个变量var1和var2的值填充到对应的位置,结果就变成了“你输入的第一个数9大于第二个数8!” ,随后执行了第15行的代码,屏幕输出“程序运行结束”提示信息,程序运行结束并退出。

      C语言中的唯一的三目运算符条件表达式1?表达式2:表达式3就等效为if(条件表达式1){表达式2}else{表达式3},也就是说当条件表达式1成立时,执行表达式2,否则执行表达式3,常常用三目运算符完成简单的选择问题。

      3、嵌套格式为:if(关系表达式或逻辑表达式){

                执行语句1;

                ……

                执行语句n;

              }else{

                if(关系表达式或逻辑表达式){

                    执行语句1;

                    ……

                    执行语句n;

                }else{

                    执行语句1;

                    ……

                    执行语句n;

                }

              }

        语句块功能:如果括号中的关系表达式或逻辑表达式的结果为真,程序就会执行紧接者大括号中的执行语句,否则就执行else后大括号中的语句块。特别注意的是:else总是和同一代码块中离得最近的if搭配使用,不能单独使用。

      例子的执行结果当分别输入90、82、65和54时,输出对应的提示信息:

      Please input a number range 0 ~ 100: 90
      成绩为90,优秀太好了,努力没有白费!
      程序运行结束

      Please input a number range 0 ~ 100: 82
      成绩为82,怎么只是个良好,要继续努力!
      程序运行结束
      
      Please input a number range 0 ~ 100: 65
      成绩为65,好险总算是及格了!
      程序运行结束

      Please input a number range 0 ~ 100: 54
      成绩为54,天那,竟然没有及格,完蛋了!
      程序运行结束

      例子的代码:  

     1 #include <stdio.h>
     2 
     3 int main(int argc, char **argv)
     4 {
     5     int var1 = 0;
     6                                                                          
     7     printf("Please input a number range 0 ~ 100: ");
     8     scanf("%d", &var1);
     9     if(var1 >= 85){
    10         printf("成绩为%d,优秀太好了,努力没有白费!
    ", var1);
    11     }else{
    12         if(var1 >= 70){
    13             printf("成绩为%d,怎么只是个良好,要继续努力!
    ", var1);
    14         }else{
    15             if(var1 > 60){
    16                 printf("成绩为%d,好险总算是及格了!
    ", var1);
    17             }else{
    18                 printf("成绩为%d,天那,竟然没有及格,完蛋了!
    ", var1);
    19             }
    20         }
    21     }
    22 
    23     printf("程序运行结束
    ");
    24 
    25     return 0;
    26 }

      代码执行过程,当输入90时,第9行代码中的if中的条件语句成立,执行对应的第10行的代码,输出结果:“成绩为90,优秀太好了,努力没有白费!”第11行到21行的代码都属于else代码块内容,直接忽略跳过,接着执行23行,输出“程序运行结束”,程序退出。

      当输入82时,第9行代码中的if中的条件语句不成立,略过第10行代码,进入else代码块,第12行代码中if的条件语句成立,执行对应的第13行的代码,输出结果:“成绩为82,怎么只是个良好,要继续努力!”第14行到21行的代码都属于else代码块内容,直接忽略跳过,接着执行23行,输出“程序运行结束”,程序退出。

      当输入65时,第9行代码中的if中的条件语句不成立,略过第10行代码,进入else代码块,第12行代码中if的条件语句不成立,略过第13行代码,进入对应的else代码块,第15行代码中的if条件语句成立,执行对应的第16行的代码,输出结果:“成绩为65,好险总算是及格了!”第17行到21行的代码都属于else代码块内容,直接忽略跳过,接着执行23行,输出“程序运行结束”,程序退出。

      当输入54时,第9行代码中的if中的条件语句不成立,略过第10行代码,进入else代码块,第12行代码中if的条件语句不成立,略过第13行代码,进入对应的else代码块,第15行代码中的if条件语句不成立,略过第16行的代码,进入else代码块,执行第18行代码输出结果:“成绩为54,天那,竟然没有及格,完蛋了!”,接着执行23行,输出“程序运行结束”,程序退出。  

      以上代码虽然在逻辑上没有问题,但是针对这种多条件的选择,往往使用switch,代码逻辑会更清晰。

      二、switch选择语句:

        1、基本格式为:switch(变量){

                  case 条件语句1:

                    执行语句1;

                    ……

                    执行语句n;

                    break;

                  case 条件语句2:

                    执行语句1;

                    ……

                    执行语句n;

                    break;

            

                  …………

     

                  case 条件语句n:

                    执行语句1;

                    ……

                    执行语句n;

                    break;

                  default:

                    执行语句;            

              }

        语句块功能:如果括号中的变量与case后的条件语句对应,则对应的case后的执行语句都会被执行;如果都没有对应起来,则执行defalut后的执行语句。特别注意,不要在case语句后添加break语句。

      例子的执行结果当分别输入90、82、65和54时,输出对应的提示信息:  Please input a number range 0 ~ 100: 90
      成绩为90,优秀太好了,努力没有白费!
      程序运行结束

      Please input a number range 0 ~ 100: 82
      成绩为82,怎么只是个良好,要继续努力!
      程序运行结束
      
      Please input a number range 0 ~ 100: 65
      成绩为65,好险总算是及格了!
      程序运行结束

      Please input a number range 0 ~ 100: 54
      成绩为54,天那,竟然没有及格,完蛋了!
      程序运行结束

      代码如下:

     1 #include <stdio.h>                                                       
     2 
     3 int main(int argc, char **argv)
     4 {
     5     int var1 = 0;
     6 
     7     printf("Please input a number range 0 ~ 100: ");
     8     scanf("%d", &var1);
     9     int temp = var1 / 10;
    10 
    11     switch(temp){
    12         case 10:
    13         case 9:
    14             printf("成绩为%d,优秀太好了,努力没有白费!
    ", var1);
    15             break;
    16         case 8:
    17         case 7: 
    18             printf("成绩为%d,怎么只是个良好,要继续努力!
    ", var1);
    19             break;
    20         case 6:
    21             printf("成绩为%d,好险总算是及格了!
    ", var1);
    22             break;
    23         case 5:
    24         case 4:
    25         case 3:
    26         case 2:
    27         case 1:
    28         case 0:
    29             printf("成绩为%d,天那,竟然没有及格,完蛋了!
    ", var1);
    30             break;
    31         defalut:
    32             printf("成绩非法,请重新输入!");
    33     }
    34 
    35     printf("程序运行结束
    ");
    36 
    37     return 0;
    38 }

      简单比较,发现使用switch语句替代复杂的if…else嵌套时,代码逻辑更加清晰。当if…else很简单时,也可以使用条件运算符?:来取代,因此这样来看,if…else貌似用处不大,实际上包括linux之父都觉得代码不需要太多的条件判断才行。

  • 相关阅读:
    普通网站迁移
    小程序注册流程
    批量抓取微信公众号的文章
    uniapp 开发踩坑记录
    微信扫码支付精简版
    QueryList The received content is empty!
    阿里云视频点播sdk封装 php
    我的大伯
    tp5分页携带原有参数
    爬虫项目:破解极验滑动验证码
  • 原文地址:https://www.cnblogs.com/guochaoxxl/p/6890884.html
Copyright © 2020-2023  润新知