流程控制(重要)--c语言个人笔记【四】

c语言个人笔记

E.menos

代码规范性!!!

  • 如何看懂一个程序?
    1. 流程
    2. 每个语句的功能
    3. 试数

四. 流程控制(重要)

  • 什么是流程控制
    程序代码执行的顺序

四. 流程控制(重要)

  • 什么是流程控制
    程序代码执行的顺序

4.1 流程控制的分类

  • 顺序执行

  • 选择执行

    • 定义:
      有选择执行某些代码

    • 分类:

      • if
        1. if最简单的用法
        2. if的范围问题
        3. if…else…的用法
        4. if…elseif…else…的用法
        5. c语言对真假的处理
        6. if举例–取分数的处理
        7. if的常见问题解析
      • switch
  • 循环执行

    • 定义:
      某些代码会被重复执行

    • 分类:

      • for: 【重点:流程】
      • while
      • do…while
      • break与continue

4.2 if

  1. if最简单的用法

    • 格式:

          if (表达式)
              语句;
          ```
      
      
    • 功能:
      如果表达式为真,语句执行;
      如果表达式为假,语句不执行;

  2. if的范围问题

            if(表达式)
                语句A;
                语句B;
    
     **if默认只能控制语句A的执行与不执行,无法控制语句B.**
    
                #include <stdio.h>
                
                int main(void)
                {
                    if(1>2)
                        printf("AAAA\n");
                        printf("BBBB\n");
    
                    return 0;
                }
                //输出结果是BBBB
    
            if(表达式)
            {
                语句A;
                语句B;
            }
    

    此时if可以控制语句A和语句B.

    if默认只能控制一个语句的执行或者不执行,如果想要控制多个语句的执行,就要用{}将这些语句括起来

  3. if…else…的用法

  4. if…elseif…else…的用法

  5. c语言对真假的处理

  6. if举例–取分数的处理

  7. if的常见问题解析

    1. 空语句的问题

          if(3>2);
          等价于
          if(3>2)
          ;//这是一个空语句
      
          if (3>2)        //第4行,如果加;会导致程序运行到都6行结束
              printf("A");
          else if ()      //第6行
              printf("B");
      
    2. elseif

          if (表达式1)
              printf(A);
          else if (表达式2)
              printf(B);
          else if (表达式3)
              printf(C);
         //这样写语法没有问题,但逻辑有漏洞
      
          if (表达式1)
              printf(A);
          else if (表达式2)
              printf(B);
          else if (表达式3)
              printf(C);
          else (表达式4)//7行
              printf(D);
          //程序错误,去掉7行的表达式4,或将7行改为else if
      
          if (表达式1)
              printf("A");
          else if (表达式2)
              printf("B");
          else if (表达式3)
              printf("C");
          else (表达式4)//(表达式5);为无实际意义语句
              printf("D");
      
          //语法不会出错,但逻辑有错误
      
           else (表达式4)printf("D");
          相当于
          else
          (表达式4)//无意义语句
          printf("D");    //输出语句
      

4.3 for

  1. 程序

        for (1,2,3)
            语句A;
        //同if,执行多个语句时用{}括起来
    
  2. 【重点】执行的流程

    1. 单个for循环的使用

      for(1;2;3)
          语句A;
      
      //顺序:1- (2)- A- 3- (2)- A- 3-.....- 3- (2)不成立退出循环
      
    2. 多个for循环的嵌套使用

          for(1;2;3)      //1
              for(4;5;6)  //2
                  A;      //3
                  B;      //4
          
          //执行顺序:1- (2)- 4- (5)- A- 6- (5)-...-(5)不成立执行3- (2)- 4- (5)- A- 6-...-(2)不成立退出循环-执行B
          //共有两个语句;123为第一个语句,4位第二个语句;B在循环外
      
  3. 范围问题

  4. 做题

    • 强制类型转化:
      • 格式:
        (数据类型)(表达式)
      • 功能:
        把表达式的值强制转化为前面所执行的数据类型
      #include <stdio.h>
      
      int main(void)
      {
          int i;
          float sum = 0;
      
          for (i=1; i<=100; ++i>)
          {
              sum = sum + 1/i;
          }
          printf("sum = %f\n", sum);
      }
      //该程序运行结果为1.000000,程序错误。
      //因为1是整型,i是整型,1/i结果没有小数位。
      
      处理方法:强制类型转化
      #include <stdio.h>
      
      int main(void)
      {
          int i;
          float sum = 0;
      
          for (i=1; i<=100; ++i>)
          {
              sum = sum + 1/(float)(i);
          }
          printf("sum = %f\n", sum);
      }
      

4.4 while

  1. 执行顺序

    • 格式:
          while (表达式)
              语句;
      
  2. 与for的相互比较

    • 例子

          for (i=1; i<101; ++i)
          {
           sum = sum + 1;
          }
      
          i = 1;
      
          while (i < 101)
          {
              sum = sum + i;
              ++i;
          }
      
    • 结论:

    for (1; 2; 3)
        A;
    

    等价于

    while (2)
    {
        A;
        3;
    }
    

    while和for可以相互转换,但for的逻辑性更强,不容易出错.

  3. 举例
    (斐波那契数列)

  4. 什么时候使用while,什么时候使用for
    (多做题自己感觉)
    while有时候很简单,大多数时候用for比较清晰

4.5 do…while【人机交互】

  1. 格式:

     do
     {
         ...
     } while (表达式)
    

    主要用于人机交互

  2. do…while与while与for

    do…while并不等价于for,也不等价于while
    (do…while必会执行一次,而for和while可以一次都不执行)

  3. 举例:

    #include <stdio.h>
    
    int main(void)
    {
        double a, b, c;
        double delta;
        double x1,x2;
    
        do
        {
    
            printf("请输入一元二次方程的三个系数\n");
            printf("a = ");
            scanf("%d",&a);
    
            printf("b = ");
            scanf("%d",&b);
    
            printf("c = ");
            scanf("%d",&c);
    
            delta = b*b - 4*a*c;
    
            if(delta > 0)
            {
                x1 = (-b + sqrt(delta)) / (2*a);
                x2 = (-b - sqrt(delta)) / (2*a);
                printf("有两个解,x1 = %lf, x2 = %lf\n",x1,x2);
            }
            else if (0 == delta)
            {
                x1 = x2 = (-b) / (2*a);
                printf("有一个解,x1 = x2 = %lf\n",x1,x2);
            }
            else
            (
                printf("无实数解!\n")
            )
    
            printf("您想继续吗(Y/N):");
            scanf(" %c", &ch);   //前面必须加一个空格符,原因略
        } while ('y' == ch || 'Y' == ch);   //y和Y写前面为了代码美观
    
        return 0;
    }
    

4.6 switch【电梯程序】

  1. 举例:

    
        #include <stdio.h>
    
        int main (void)
        {
            int val;
    
            printf("请输入您要到达的楼层:")scanf("%d%", &val);
    
            switch(val)
            {
                case 1;
                    printf("1层开!\n");
                    break;  //如果没有这个break,输入1时运行结果为“1层开!  2层开!”(见程序最后的解释)
                case 2;
                    printf("2层开\n:");
                    break;
                case 2;
                    printf("3层开\n");
                    break;
                default:
                    printf("没有该层\n");
                    break;
            }
        }
    
    \\case为程序的入口,val判断入口;入口确认后从上往下顺序执行,所以要有break停止程序。
    
    
  2. 格式

         switch(表达式)
         {
             case 常量表达式1:   语句1case 常量表达式2:   语句2case 常量表达式3:   语句3...
             case 常量表达式n:   语句n;
             default:           语句n+1}
    
      1. 所有case后面的常量表达式为便于描述我们姑且称之为标签,这些标签都只能是(1)枚举常量(有些书称之为枚举元素),(2)数值常量,(3)字符常量,(4)常变量,(5)宏名中的一种,注意普通变量,枚举变量是不能作为标签使用的。
      1. witch后面括号里的“表达式”允许是任何类型。但是Vc++中只允许为int或char类型(1)
      1. 执行完一个case语句后,流程控制就转移到下一个case字句继续执行。 case常量表达式只是起语句标号的作用,并不是在该处进行条件判断。在执行 swtich语句时,根据switch()中表达式的值找到与之匹配的case子句,就从此case子句开始执行下去,不再进行判断。
    • 当i == 1时,从case1处开始往下一个不落的执行,当i == 2时从case2处开始往下个不落的执行,当i3时,只执行case3一句,当i == 4时,从default处开始往下个不落的执行,当i == 0时执行情况同i==4.
      1. switch是选择不是循环,如果在switch中出现了berak语句。该语句的功能只是退出switch语句转去执行它下面的语句。在switch中出现continue是错误的,除非switch本身就属于for或while循环的一部分。

4.7 break和continue

  1. break

    1. break如果用于循环:终止循环

    2. break如果用于switch:终止switch

    3. break不能用于if,除非if是循环内的一个语句

          for (i=0; i<3; ++i)
          {
              if(3>2)
                  break;  //break虽然是if内部的语句,但却是用来终止外面的for循环;
              printf("hello world\n");
          }
      
          return 0;
          //验证方法:看输出个数,如果输出只有一个,那么终止的是for循环
      
    4. 在多重循环中,break只能终止离它最近的循环

          for (i=0; i<3; ++i)
          {
              for(j=0; j<3; ++j)
                  break;  //break只能终止距离它最近的循环
              printf("hello world\n");
          }
          //输出结果为三个,故终止的是内部的for。
      
    5. 在多重switch嵌套中,break只能终止的是离它最近的

          switch(x)   //第一个switch
          {
          case 1:
              switch(y)   //第二个switch
              {
              case 0:
                  a++;
                  break;  //终止第二个switch
              case 1:
                  b++;
                  break;  //终止第一个switch
              }
              breakcase 2:
              a++;
              b++;
              break;
          }
      
  2. continue

    • 用以跳过本次循环余下的语句,转去判断是否需要执行下次循环

          for (1; 2; 3)
          {
              A;
              B;
              continue;   //如果执行该语句,则执行完该语句后会执行3;C D 会被跳过
              C;
              D;
          }
      
          while (表达式)
          {
              A;
              B;
              continue;   //如果执行该语句,则执行完该语句后会执行表达式;C D 会被跳过
              C;
              D;
          }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值