简介:流程控制语句

1.分支语句(条件语句)

 if/else(重点)

 switch/case

2.循环语句

 for(重点)

 while

 do while

  1. 分支语句

    1> if/else

    按照一定的条件执行不同的代码,可以使用分支语句。

    if(逻辑表达式条件1){   //如果 必须出现1次

        满足条件1时执行的语句;

    }

    else if(逻辑表达式条件2){  //或者  出现0-n次

        满足条件2时执行的语句;

    }

    else{  //否则   出现0-1次

        以上条件都不满足时执行的语句

    }

    练习:输入一个整数,判断 是正数、负数、零。


    int a;
     if(a>0){
        printf("%d是正数\n",a);
     }else if(a==0){
        printf("%d是零\n",a);
     }else{
        printf("%d是负数\n",a);
     }

    注:

     a> if/else 只会执行一个分支,因此,如果第一个分支满足条件了,不再执行后面的分支。-> 如果执行到了第n个分支,前面n-1个分支一定不成立。

     b> 有else的分支语句必选其一执行,没有else的分支语句可选其一执行。

     c> 如果分支内部只有一条语句,{}可以省略。一般执行:break/continue/return 语句时,{}通常省略。

     d> 流程控制语句 需要 注意临界点的处理。

     e> 经常 用于 处理 业务的需求。

    #include <stdio.h>
    /*
      使用if语句来判断输入输入 某年某月 有几天
    */
    int main()
    {
        printf("请输入年月\n");
        int y,m,maxDay=31;
        scanf("%d%d",&y,&m);
        if(m<1 || m>12){
            printf("输入非法\n");
            return -1;
        }
        if(m==4||m==6||m==9||m==11){
            maxDay = 30;
        }
        else if(m==2){
          maxDay=28+
          (y%4==0 && y%100!=0 || y%400==0);
         /*if((y%4==0 && y%100!=0)||y%400==0)
                maxDay = 29;
           else
                maxDay = 28;*/
        }
        printf("%d\n",maxDay);
        return 0;
    }

    注:

     a> if/else 只会执行一个分支,因此,如果第一个分支满足条件了,不再执行后面的分支。-> 如果执行到了第n个分支,前面n-1个分支一定不成立。

     b> 有else的分支语句必选其一执行,没有else的分支语句可选其一执行。

     c> 如果分支内部只有一条语句,{}可以省略。一般执行:break/continue/return 语句时,{}通常省略。

     d> 流程控制语句 需要 注意临界点的处理。

     e> 经常 用于 处理 业务的需求。


    #include <stdio.h>
    /*
      使用if语句来判断输入输入 某年某月 有几天
    */
    int main()
    {
        printf("请输入年月\n");
        int y,m,maxDay=31;
        scanf("%d%d",&y,&m);
        if(m<1 || m>12){
            printf("输入非法\n");
            return -1;
        }
        if(m==4||m==6||m==9||m==11){
            maxDay = 30;
        }
        else if(m==2){
          maxDay=28+
          (y%4==0 && y%100!=0 || y%400==0); 
         /*if((y%4==0 && y%100!=0)||y%400==0)
                maxDay = 29;
           else
                maxDay = 28;*/
        }
        printf("%d\n",maxDay);
        return 0;
    }

    2> switch/case

      格式:  

       switch(控制表达式){

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

           …

           default: 语句;

       }

      控制表达式被当做整数处理,可以是字符,不能是浮点数或字符串

      常量表达式必须是常量,如: 3   ‘A’   2+5  

      语句 可以是 零到多条

      不允许重复分支(值不能相同)

      default不一定在最后(但一般都在最后)

      switch的执行机制,语句只有遇到break或者结束才能退出,否则会一直向下执行下去。      

switch(a){
   case 1:
     printf("1\n");
     break;
   case 2:
     printf("2\n");
     break;
   case 3:
     printf("3\n");
     break;
   default:
     printf("d\n");
 }

2. 循环语句

1> for循环

     循环语句 用于 反复执行某段代码,直到满足某些条件(退出条件而非循环条件)后退出。

     for 循环的语法结构:

     for(循环变量的初始化1;循环条件2;步进语句3){

         需要反复执行的代码段 //循环体4

     }

int i;
 for(i=0;i<10;i++){
    printf("%d\n",i);
 }

     如果退出条件永远不能满足,叫 死循环(无限循环),ctrl+c可以退出死循环。

     无限循环最简单写法: for(;;){  }

     在C99中,支持:for(int i=0;i<10;i++){ },但是编译时要使用std=c99

#include <stdio.h>
/*
   练习:计算某班学生的总分、平均分和最高分。
    分数需要输入,无需保存分数。
    人数的问题:
     1 先输入人数,在输入分数。(用这个)
     2 可以用 -1 做退出的条件。
*/
int main()
{
    int sum=0,max=0x80000000;//表示最小的int型整数1000...0000
    double avg;
    int i,num=0;
    /*printf("请输入人数\n");
    scanf("%d",&num);
    if(num<1){
        printf("非法人数\n");
        return -1;
    }
    for(i=0;i<num;i++){
        int temp;
        scanf("%d",&temp);
        sum = sum+temp;
        if(max<temp) max = temp;
    }*///次数在循环前确定
    for(;;){//循环次数不能确定,输入-1表示输入结束
        int temp;
        scanf("%d",&temp);
        if(temp == -1) break;//退出循环
        sum = sum+temp;
        if(max<temp) max = temp;
        num++;
    }
    printf("sum=%d,avg=%lf,max=%d\n",
        sum,1.0*sum/num,max);
    return 0;
}

   break 可以退出 循环/switch,退出函数用return。

    循环可以分为:次数确定、次数不确定、无限循环。

    次数确定的: int i; for(i=0;i<num;i++){...}

    次数不确定:  for(;;){...if(条件) break; ...}

    无限循环:   for(;;){...}

    循环中经常嵌套另外的循环,叫多重循环,最常用的是二重循环

   二重循环的难点在于内层循环次数的控制,具体公式如下:

    i如果递增1,那么

    j< m*i + n ;j++

     m 是 内层循环递增的次数,如果递减取负数

     n 是 内层循环第一次循环的次数

    前提:i和j的初始值保持一致,最好都为0。

#include <stdio.h>
/*
  使用双重for循环打印
  *
  ***
  *****
  *******
  *********
*/
int main()
{
    int i,j;//i控制行,j控制列
    for(i=0;i<5;i++){
        for(j=0;j<2*i+1;j++){
            printf("*");
        }
        printf("\n");
    }
    return 0;
}
#include <stdio.h>
/*
  使用双重for循环
  打印9*9乘法表
     j*i      
     1*1=1
     1*2=2 2*2=4
     ......
*/
int main()
{
    int i,j;
    for(i=1;i<10;i++){
        for(j=1;j<i+1;j++){
            printf("%d*%d=%d ",j,i,j*i);
        }
        printf("\n");
    }
    return 0;
}

  2> while循环

    while循环和for循环 除了语法不同,其他都可以互通。

    语法:

    循环变量的声明和初始化;

    while(条件){

       循环体;

       步进语句;

    }

#include <stdio.h>
int main()
{
    int sum=0;
    while(1){
        int temp;
        printf("请输入数字(0退出)\n");
        scanf("%d",&temp);
        if(temp == 0) break;
        sum += temp;
    }
    printf("sum = %d\n",sum);
    return 0;
}
int i=0;
   while(i<10){
       printf("%d\n",i);
       i++;
   }

    while(1){} // 死循环

3> do-while循环

     do while循环

     语法:

     循环变量的声明和初始化;

     do{

        循环体;

        步进语句;

     }while(条件);

     do-while 循环 先do 后判断条件,所以 至少执行一次。

int i=10,j=10;
   do{
       printf("%d\n",i);
       i++;
   }while(i<10);
   while(j<10){
       printf("%d\n",j);
       j++;
   }
  // 当i,j 初始 不满足条件时,do循环打印i,while不打印j。
  // 当i,j 初始 满足条件时,无区别。
  // 很多情况下,do循环和while(1){ ...if() break; }可以互通。
#include <stdio.h>
/*
    使用do-while来计算输入数字的位数
    注意:do-while();分号结束
*/
int main()
{
    int num,count=0;
    printf("请输入一个整数\n");
    scanf("%d",&num);
    do{
        num = num/10;
        count++;
        if(num==0) break;
    }while(1/*num!=0*/);
    printf("%d\n",count);
    return 0;
}

   注:

break和continue

    continue用于循环内部,结束本次循环,继续下一次循环,如果下一次循环条件不成立,也会退出。

    break 用于循环内部,中断所有循环,结束整个循环(如果是嵌套循环,break只是退出本层循环)。