[编程笔记]第四章 流程控制

 1.流程控制? 【是我们学习C语言的第一个重点】   ***
      1). 什么是流程控制
          程序代码执行的顺序。
      2). 流程控制的分类
          【顺序执行】 —— 正常情况        
          【选择执行】 —— 
             定义: 某些代码可能执行,也可能不执行,
                 有选择地执行某些代码
               分类:if switch
              if
                  1. if最简单的用法
                  格式:
                     if(表达式)
                          语句 ;
                  功能:
                      如果表达式为真,则执行语句 ;
                      如果表达式为假,则不执行 ;
 
                      #include<stdio.h>
                      int main(void)
                      {
                          int x = 10 ;
                          if (x>8)
                              printf("x = %d",x) ;
                          return 0 ;
                      }
  
                  2. if的范围问题
                      if(表达式)
                          语句A ;
                          语句B ;
                      解释:if默认只能控制语句A的执行或不执行
                      而无法控制语句B的执行或不执行 
                      换言之,语句B一定会执行
  
                      if(表达式)
                      {
                          语句A ;
                          语句B ;
                      }
                      //此时if可以控制语句A和语句B
                      由此可见,if默认只能控制一个语句的执行或不执行
                      如果想控制多个语句的执行或不执行就必须用{}括起来。
                  //实例
                      #include<stdio.h>
                      int main(void)
                      {
                          if (3>2)
                              printf("AAAA\n") ;
                              printf("BBBB\n") ; //BBBB仍然输出
                              return 0 ;
                      }
  
                  3. if..else..的用法
                  格式:
                      if(表达式)
                          语句A ;
                      else
                          语句B;
  
                   #include<stdio.h>
                      int main(void)
                      {
                          int i,j ;
                          scanf("%d %d",&i,&j) ;
                          if(i > j)
                              printf("i大于j\n") ;
                          else
                              printf("i小于j\n") ;
                          return 0 ;
                      }
  
                  4. if..else if...else的用法
                  格式:
                      if(表达式1)
                          语句A ;
                      else if(表达式2)
                          语句B ;
                      else if(表达式3)
                          语句C ;
                      else
                          语句D ;
  
                      解释:若表达式1成立,执行语句A ;
                           若1不成立,2成立,执行B ;
                           若1,2不成立,3成立,执行C ;
                           若1,2,3,都不成立,执行D ;
              //例
                  #include<stdio.h>
                  int main(void)
                  {
                      double delta = 3 ;
                      if(delta > 0)
                          printf("有两个解") ;
                      else if(delta == 0)
                          printf("有一个唯一解") ;
                      else
                          printf("无解") ;
  
                 }
 /*
                 5. C语言对真假的处理
                     非零是真,零就是假
 */
                 6. 程序实例
                 //if举例 —— 求分数的等级
                     #include <stdio.h>
                     int main(void)
                     {
                         float score ; //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 if (score >= 0 && score <= 60)
                             printf("不及格!继续努力!\n") ;
                         else
                             printf("输入成绩过低!") ; 
 
                         return 0;        
                     }
                 //互换两个数字
                     #include<stdio.h>
                     int main(void)
                     {   
                         int k ;
                         int i = 3 ; //i = 5 ,j = 5
                         int j = 5 ; //i = 5 ,j = 5 
                         k = j ;
                         i = j ;
                         j = k ;
                         
                         printf("i = %d,j = %d\n",i,j) ;
                         
                         return 0 ;
                     }
                 //三个数排序
                     #include <stdio.h>
                     int main(void)
                     {
                         int a , b , c ;
                         int t ;
                         printf("请输入三个整数,中间以空格分隔");
                         scanf("%d %d %d",&a,&b,&c) ;
                         if (a < b)
                         {
                             t = a ;
                             a = b ;
                             b = t ;
                         }  
                         if (b < c)
                         {
                             t = b ;
                             b = c ;
                             c = t ;
                         }
                         if(a < c)
                         {
                             t = a ;
                             a = c ;
                             c = t ;
                         }
                     //编写代码,完成a是最大值,b是中间值,c是最小值
                         printf("%d %d %d\n",a,b,c) ;
 
                         return 0 ;
                     }
 
                 7. if的常见问题解析
                     1.空语句的问题:if (3 > 2) ;
                         等价于 if (3 > 2)
                                 ;
 
                         #include <stdio.h>
                         int main(void)
                         {
                             if (1 > 2) ;//";"本行语句结束,跳转下一条
                                 printf("AAAA\n") ;
                             printf("BBBB\n") ;
                         
                         return 0 ;
                         }
 
                     2.if..else问题 
                     if(表达式1) //if后不能加;,否则else后出错
                         A ;
                     else 
                         B ;
 
                     3.if..else if问题
                     if (表达式1)
                         A ;
                     else if (表达式2)
                         B ;
                     else if (表达式3) 
                         C ;
                     else 
                         D ;
                 //实例
                     #include<stdio.h>
                     int main(void)
                     {
                         if (3 > 2)
                             printf("AAAA\n") ;
                         else if (3 > 1)
                             printf("BBBB\n") ;
                         else 
                             printf("CCCC\n") ;
 
                     return 0 ;
                     }
                                       
                     4.if (表达式1)
                         A ;
                       else if (表达式2)
                         B ;
                       else if (表达式3) 
                         C ;
                     //这样写不会出错,但是逻辑上有漏洞
                     5.if (表达式1)                                                                                                                                                                                                                                  
                              A ;
                       else if (表达式2)
                             B ;
                       else if (表达式3) 
                             C ;
                       else (表达式4) 
                             D ;
                     ///这样写是不对的正确的写法是
                     //要么去掉(表达式4) ;
                     //要么去掉,else后面加if ;
                     //else(表达式4) ;语法上正确,但逻辑出错
                     
 
             switch
                 用的很少,后面再讲
 
         【循环执行】
             定义:某些代码会被重复执行
 
             分类:for、while、do..while 
            
             for
                 1. 格式:for(1 ; 2 ; 3)
                         4 ;
                     5 ;
 
                 2. 执行的流程【重点】
                 【单个for循环的使用】
                     /*执行顺序:先执行1,判断2是否成立    
                         2成立,执行循环,先执行4再执行3
                             3执行结束,标志着循环一次结束
                         2不成立,终止循环                       */
                     
                     //实例                                
                         #include<stdio.h>
                         int main(void)
                         {
                             int i ;
                             for(i=1; i<=10; ++i)
                                 sum = sum + i ;
                             printf("sum = %d\n",sum) ;
                             return 0 ;
                         }
                     /*执行流程:
                         1) i = 1 ; 1 <= 4 ;
                                 sum = 1; i= 2 ;
                         2) i = 2 ; 2 <= 4 ;
                                 sum = 3 ; i = 3 ;
                         3) i = 3 ; 3 <= 4 ;
                                 sum = 6 ; i = 4
                         4) i = 4 ; 4 <= 4 ;
                                 sum = 10 ; i = 10 ;
                         print("sum  = %d\n",sum) ;   */
                 
 
                     for 和 if 的嵌套使用
                     //例1
                         #include <stdio.h>
                         int main(void)
                         {
                             int i ;
 
                             for (i=5; i<4; ++i)
                             {
                                 printf("AAAA\n") ;
                                 printf("BBBB\n") ;
 
                                 return 0 ;
                             }
                         }
 
                     //例2 求1到100之间所有的能被3整除的数字之和
                         #include<stdio.h>
                         int main(void)
                         {
                             int i ;
                             int sum = 0 ; 
                             for (i=3; i<=100; ++i)
                             {
                                 if (i%3==0) //如果i能够被3整除
                                     sum = sum + i ;
                                 printf("sum = %d\n",sum) ;
                             }
 
                             return 0 ;
                         }
                     
                 
                 
                 
                     //例1 —— 求1到100之间的奇数之和
                         #include <stdio.h>
                         int main(void)
                         {
                             int i ;
                             int sum = 0 ;
 
                             for (i=1; i<101; ++i)
                             {
                                 if (i%2==1)
                                     sum += i ; //sum = sum + i ;
                             }
                             printf("sum = %d\n",sum) ;
                             return 0 ;
                         }
 
                     //例2 —— 求1到100之间的奇数的个数
                         #include <stdio.h>
                         int main(void)
                         {
                             int i ;
                             int cnt = 0 ; //个数一般用cnt表示
 
                             for (i=1; i<101; ++i)
                             {
                                 if (i%2==1)
                                     ++cnt ;
                             }
                             printf("cnt = %d\n",cnt) ;
 
                             return 0 ;
                         }
 
 
                     //例3 —— 求1到100之间的奇数的平均值
                         #include <stdio.h>
                         int main(void)
                         {
                             int i ;
                             int sum = 0 ;
                             int cnt = 0 ;
                             float avg ; //average 缩写
 
                             for (i=1; i<101; ++i)
                             {
                                 if (i%2==1)
                                     {
                                         sum += 1 ;
                                         ++cnt ;
                                     }
                             }
                             avg = 1.0*sum / cnt ; //1.0默认是double类型
 
                             printf("sum = %d\n",sum) ;
                             printf("cnt = %d\n",cnt) ;
                             printf("avg = %f\n",avg) ;
 
                             return 0 ;
                         }
 
                     //例4 —— 求1到100之间的奇数之和,
                     再求1到100之间的偶数之和
 
                         #include <stdio.h>
                         int main(void)
                         {
                             int i ;
                             int sum1 = 0 ; //奇数和
                             int sum2 = 0 ; //偶数和
 
                             for (i=1; i<101; ++i)
                             {
                                 if (i%2==1)
                                 {
                                     sum1 += i ;
                                 }
                                 else
                                 {
                                     sum2 += i ;
                                 }
                             }
                             printf("sum1 = %d\n",sum1) ;
                             printf("sum2 = %d\n",sum2) ;
                         
                             return 0 ;
                         }
 
 
                 
                 【多个for循环的嵌套使用】**
                     1.结构1
                         for (1 ; 2 ; 3) //1
                             for (4 ; 5 ; 6) //2
                                 A ;  //3
                                 B ;  //4
                             /*整体是两个语句,1 2 3是一个语句
                             4 是一个语句  */ 
                         /*执行顺序:
                         1 -> 2 -> 4 -> 5 -> A -> 6 -> 3   */
 
                     2.结构2
                         for (1 ; 2 ; 3) 
                                 for (4 ; 5 ; 6)
                                 {
                                     A ;
                                     B ;
                                 }    //整体是一个语句
 
                     3.结构3
                         for (7 ; 8 ; 9)
                             for (1 ; 2 ; 3)
                             {
                                 A ;
                                 B ;
                                 for (4 ; 5 ; 6)
                                     C ;
                             }  //整体是一个语句
 
                 3. 范围问题
                 4. 举例
                     1+2+3+...+100
                     1+1/2+1/3+...+1/100
 
                     //例2 1+1/2+1/3+...+1/100
                             #include<stdio.h>
                             int main(void)
                             {
                                 int i ;
                                 float sum ;
 
                                 for (i=1; i<=100; ++i)
                                 {
                                     sum = sum + 1/i ; //error
                                     sum = sum + 1 / (float)(i)  //ture
                                     //sum = sum + (float)(1/i) ;是错的
                                     //更简单的写法是 sum = sum + 1.0/i ;
                                 }
                                 printf("sum = %d\n",sum) ;
 
                                 return 0 ;
                             }
                     //总结:强制类型转化对初学者很重要
 
                     //强制类型转化
                     格式: (数据类型)(表达式)
                     功能: 把表达式的值强制转化为前面所执行的数据类型
                     例子: (int)(4.5+2.2) 最终值是 6
                         (float)(5) 最终值是 5.000000
 
                     //浮点数的存错所带来的问题
              float 和 double 都不能保证可以把所有的实数都准确的
              保存在计算机中
                         例子:float i = 99.9 ;
                             printf("%f\n",i) ;
                         最终在Vc++6.0中的输出结果是:99.900002
                        因为浮点数无法准确存储,所以就衍生出来两个编程问题;
                         有一个浮点型变量x,如果判断x的值是否为零
                             if (|x-0.000001|<=0.000001)
                                是零
                             else
                                 不是零
 
                         为什么循环中更新的变量不能定义成浮点型
 
                 //实例
                     #include<stdio.h>
                     int main(void)
                     {
                         float i ;
                         float sum = 0 ;
 
                         for (i=1; i<=100; ++i)
                         {
                             sum = sum + 1/i ;
                         }
                         printf("sum = %f\n",sum) ;
 
                         return 0 ;
                     }
             
             while
                 1.执行问题
                     格式:
                         while (表达式)
                             语句 ;
                 2. 与for的相互比较
                     for与while可以相互转换
                         for (1 ; 2 ; 3)
                             A ;
                         等价于 
                         1 ;
                         while (2)
                         {
                             A ;
                             3 ;
                         }
                     //while和for可以相互转换
                     //但for的逻辑性更强,更不容易出错,推荐多使用for
                 3. 举例
                     从键盘输入一个数字,如果该数字是回文数
                     则返回yes,否则返回no 
                 4. 什么时候使用while和for
                     无法具体说明情况,用多了自然就能感受到。
 
 
             do..while
                 格式:
                     do 
                     {
                         ....
                     }while(表达式) ;
                 do...while并不等价于for,当然也不等价于while
                 //主要用于人机交互
 
             break 和 continue 
                 break : 
                     break 如果用于循环是用来终止循环的
                     break 如果用于 switch,则是用于终止 switch
                     break 不能直接用于 if,除非 if 属于循环内部的一个子句。
                 //例1:
                 for (i=0; i<3; ++i)
                 {
                     if (3 > 2)
                         break ;
                         //break虽然是if内部的语句,但break终止
                         //的却是外部for的循环
                     printf("嘿嘿!\n") ;
                 }
                 /*在多层循环中,break只能终止最里面包裹它的那个循环*/
                 //例2:
                 for (i=0; i<3; ++i)
                     {
                         for (j=1; j<4; ++j)
                             break ;
                         //break只能种植距离它最近的循环
                         printf("同志们好\n") ;
                     }
                 //在多层switch嵌套中,break只能终止距离它最近的switch
             //例3
                 int x=1,y=0,a=0,b=0 ;
                 switch(x) // 第一个switch
                 {
                 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) ; //26行
 
             continue
                 功能:用于跳过本次循环余下的语句
                       转去判断是否需要执行下次循环
                     例子:
                     1.
                         for (1; 2; 3)
                         {
                             A ;
                             B ;
                             continue ; 
                         //如果执行该语句,则执行后,C和D不会被执行
                             C ;
                             D ;
                         }
                     2.
                         while (表达式)
                         {
                             A ;
                             B ;
                             continue ;
                         //如果执行该语句,则执行完该语句后,
                         //会执行表达式,C和D都会被跳过去,C和D不执行
                             C ;
                             D ;
                         }
                         
             2. 流程控制的重要性
                 1.随着c语言发展,流程控制可被其他语言继承
                 C-> C++ -> java /C#
                 2.流程控制体现了软件工程的思想
                 3.看懂一个程序的前提是学会流程控制
              
posted @ 2019-01-03 18:51  Xu_Lin  阅读(387)  评论(0编辑  收藏  举报