五、流程控制

一、顺序结构

c语言本质上的执行顺序是顺序结构,代码按照从上往下的顺序依次执行。选择语句,循环语句,goto语句是在顺序执行的过程中出现的语句,其根本还是顺序结构。

二、选择结构

2.1 if语句

2.1.1 单行格式if语句

if(条件)  
{ 
    条件满足执行的语句 (当执行的语句只有一条语句的时候, {}可以不用写)
}

// 条件内可以是: 数字(非0即真), 字符(非null即真), 表达式(正确是真(true), 错误为(false)) 
#include<stdio.h>
int main()
{
    int a = 3;
    if(a>1)  //注意事项,在if判断语句后面,不要加分号,加了分号代表语句结束,{}内的代码一定会执行。
    {
        printf("高数满分苗子");
    }    
    return 0;
} 

2.1.2 多行格式if语句

if(条件)
{ 
    条件满足执行的语句 
}
else
{ 
    条件不满足执行的语句 
};
#include<stdio.h>
int main()
{
    int math;
    printf("请输入数学成绩\n");
    scanf("%d", &math); 
    if(math >= 60)
    {    
        printf("高数满分苗子\n");
    }
    else
    {
        printf("高数再努力就是满分了\n");
    }
    return 0;
} 
// 当所给的条件既满足条件1,又满足条件2的时候。条件被条件1执行,就不会再继续执行条件2的语句。

2.1.3 多条件的if语句

if(条件1)
{ 
    条件1满足执行的语句 
}
else if(条件2)
{
    条件2满足执行的语句
}
... 
else
{ 
    都不满足执行的语句
}
#include<stdio.h>
int main()
{
    int math;
    printf("请输入数学成绩\n");
    scanf("%d", &math); 
    if(math >= 90)
    {    
        printf("优秀\n");
    }
    else if(math >= 80) 
    {
        printf("不错\n");
    }
    else if(math >= 70) 
    {
        printf("还行\n");
    }
    else if(math >= 60) 
    {
        printf("及格\n");
    }
    else
    {
        printf("找不到优点,就只能夸你聪明了\n");    
    } 
    return 0;
} 

2.1.4 嵌套if语句

if嵌套的意思就是在if语句中还可以存在if语句。

if(A)
{
    if(B)
    {
        C
    }
    else if ( D)
    {
        E
    }
    else
    {
        F
    }
}
else
{
    if(G)
    {
        H
    }
    else 
    {
        I
    }
}

// 高数 分数如果大于80分视及格,大于60分为及格,否则不及格
// 大于80分钟,当大于90分视为优秀,大于80分视为聪明
#include<stdio.h>

int main(void)
{
    int score;
    printf("请输入分数:");
    scanf("%d", &score);
    if(score >= 80)
    {
        if(score >= 90)
        {
            printf("优秀\n");
        }
        else
        {
            printf("聪明\n");
         } 
    }
    else if(score >= 60)
    {
        printf("及格\n");
    }
    else
    {
        printf("不及格\n");
    }
    
    return 0;
 } 

2.2 三目运算符

三目运算符又称为三元运算符

作用: 通过三目运算符实现简单的判断,简化if-else的写法

语法:表达式1 ? 表达式2 :表达式3

如果表达式1的值为真,执行表达式2,并返回表达式2的结果;

如果表达式1的值为假,执行表达式3,并返回表达式3的结果。

#include<stdio.h>

int main(void)
{
    int a = 10;
    int b = 20;
    int c = 0;
    c = a > b ? a : b;
    printf("c = %d\n", c); // c = 20
    return 0;
} 
/*
c = a > b ? a : b
等价于
if(a>b)
{
    c = a;
}
else
{
    c = b;
}
*/

2.3 逗号运算符

逗号运算符又称为 二元运算符

先计算左边的操作数,再计算右边的操作数。右操作数的类型和值作为整个表达式的结果。左操作数只是为了副作用需要而被计算,它其值会被丢弃。

#include<stdio.h>

int main(void)
{
    int a = 10;
    int b = 20;
    int c = (0,20,30);
    int d;
    printf("c = %d\n", c); // c = 30
    c = (d = 20, d*d);
    printf("c = %d\n", c); // c = 400
    return 0;
} 

2.4 switch语句

switch在现实生活中类似于打电话咨询: 有人卖车请按1,有人卖拐请按2,有人出脑筋急转弯请按110。

switch(表达式)                    // switch后面没分号, 表达式的结果都是整型数字或者字符型, 浮点型是不行滴
{
    case 结果1: 执行语句;break;   // case后面是冒号, break跳出switch。如果break没有的话,会继续往下执行,即使匹配不成功,也照样执行,直至遇到break程序才会终止运行
    case 结果2: 执行语句;break;
    ...
    default: 执行语句;break;     // default也可以不写,那就没有默认处理

}

// 注意1:switch语句中表达式类型只能是整型或者字符型
// 注意2:case里如果没有break,那么程序会一直向下执行
// 总结:与if语句比,对于多条件判断时,switch的结构清晰,执行效率高,缺点是switch不可以判断区间
// 请给电影评分 
    //10 ~ 9   经典   
    // 8 ~ 7   非常好
    // 6 ~ 5   一般
    // 5分以下 烂片
    
    #include<stdio.h>

int main(void)
{
    int film;
    printf("请输入电影的分数\n");
    scanf("%d", &film);
    switch (film)
    {
        case 10: // 输入10,没有遇到break,程序会继续往下执行,直至遇到第一个break程序才会终止运行。
        case 9:
            printf("经典\n");
            break;
        
        case 8:
        case 7:
            printf("非常好\n");
            break;
        case 6:
        case 5:
            printf("一般\n");
            break;
        default:
            printf("烂片\n");
            break;
    }
    return 0;     
} 

三、循环结构

3.1 while 循环

作用:满足循环条件,执行循环语句

语法:while(循环条件){ 循环语句 }

解释:只要循环条件的结果为真,就执行循环语句。每执行完成一次循环语句的时候,会再次判断循环条件是否依然成立,如果成立,则继续执行循环语句,不成立,则会跳出循环。

死循环: 循环条件一直满足的循环成为死循环。所以一般在循环语句中都会存在改变循环条件中变量的值来使循环最终终止。

// 当num>3的时候跳出循环
#include<stdio.h>

int main(void)
{
    int num = 0;
    while (num <= 3)
    {
        printf("num = %d\n", num);
        num++;
    }
    return 0; 
    
} 
/*
num = 0
num = 1
num = 2
num = 3 

输出num=3的时候,执行num++,此时num=4,因为4<=3不成立,所以循环的判断条件失效,循环结束。
*/

3.2 do - while 循环

作用: 满足循环条件,执行循环语句

语法: do{ 循环语句 } while(循环条件);

注意:与while的区别在于 do...while 会先执行一次循环语句,再判断循环条件。当循环条件满足的时候,会再次执行循环语句,所以循环语句中一般存在会修改循环条件中变量的值来终止循环。

死循环: 当while中从循环条件一直成立的时候,do中的循环语句会一直执行。

// 当num>3的时候跳出循环

#include<stdio.h>

int main(void)
{
    int num = 0;
    do
    {
        printf("num = %d\n", num);
        num++;
    }while (num <= 3);
    return 0; 
} 
/*
num = 0
num = 1
num = 2
num = 3 
输出num=3的时候,执行num++,此时num=4,因为4<=3不成立,所以循环的判断条件失效,循环结束。
*/

3.3 for循环

作用: 满足循环条件,执行循环语句

语法:for(起始表达式①;判断条件②;循环控制条件③) { 循环语句④; }

解释: 先执行其实表达式①, 再执行判断条件②,当②满足条件的时,执行循环体④, 循环体执行结束,再执行循环控制条件③。然后再判断判断条件②,再④,再③......直到②不再满足条件,循环结束。

for (语句1; 语句2; 语句3);  // 后面的这个分号会造成执行结果不对,即循环代码块只有一个空语句

语句1:
    1、通常是做循环控制变量的初始值
    2、可以写多条赋值语句,之间用逗号分隔
    3、可以什么都不写, 分号一定不能丢
    4、可以写其他表达式,甚至写个函数调用都行
    综合:只要是合法语句都能写,通常用来循环控制变量的初始值

语句2:
    1、一般必须写条件,甚至可以加个函数, 什么都不写,表示真,死循环。
    综合:只要是合法语句都能写,通常作为条件
 
语句3:
    1、一般写循环控制变量的变化
    2、可以写多个变化,逗号隔开
    3、可以啥都不写, 变化可以放在代码块内
    综合:只要是合法语句都能写,通常用来循环控制变量的变化
  
所以:
    for(;;)  // 也是可以的
// for循环打印 1,2,3
#include<stdio.h>

int main(void)
{
    int i;
    for (i=1;i<4;i++)
    {
        printf("%d\n", i);
    }
    return 0;
} 
// 输出100-1000中的所有的水仙花数
/* 
输出所有的“水仙花数”,所谓的“水仙花数”是指一个三位数其各位数字的立方和等于该数本身,
例如153是“水仙花数”, 因为:153 = 1…^3 + 5^3 + 3^3。
*/

#include<stdio.h>

int main(void)
{
    int hun,ten,ind; // hun,ten,ind依次代表百十个位的数字
    int num;
    for(num=100; num<1000;num++)
    {
        // 分别求出num的百十个位数字是多少
        hun = num / 100; // 求出百位数字 
        ten = num%100/10;//求出十位数字 
        ind = num % 10;//求出个位数字 
        if(num == hun*hun*hun + ten*ten*ten + ind*ind*ind)  /*各位上的立方和是否与原数n相等*/
        {
            printf("%d\n", num); // 153,370,371,407
        }
    }
    return 0;
}

3.4 嵌套循环

在循环体中再嵌套一层循环

嵌套的话,for循环的结构比while会更清晰。
嵌套循环,两层循环用一个循环控制变量可能会出问题,所以一般情况下,内层循环与外层循环所用的变量不一样

//九九乘法表
#include<stdio.h>

int main(void)
{
    int i, j;
    for (i=1;i<10;i++)
    {
        for (j=1;j<=i;j++)
        {
            printf("%d * %d = %d\t",i,j,i*j);
        }
        printf("\n");
    }
} 

四、跳转语句

4.1 break

作用: 用于跳出 选择结构 或者 循环结构

break使用的时机:
1、出现在switch条件语句中,作用是终止case并跳出switch
2、出现在循环语句中,作用是跳出当前的循环语句
3、出现在嵌套循环中,跳出最近的内层循环语句

// 1,使用switch-case操作。当输入1的时候,玩"和平精英",输入2玩"王者荣耀",输入3表示"最爱学习",其余输如表示"抖音"
#include<stdio.h>

int main(void)
{
    int a;
    printf("请输入你的选择\n");
    scanf("%d", &a);
    switch(a)
    {
        case 1:
            printf("玩和平精英\n");
            break;
        case 2:
            printf("玩王者荣耀\n");
            break;
        case 3:
            printf("最爱学习\n");
            break;
        default:
            printf("玩抖音\n");
            break;    
    }
    
    return 0;
}
// 2. i循环递增取值从0-10的时候,当i>6的时候,跳出循环,并输出0,1,2,3,4,5,6

// 1)for循环
#include<stdio.h>

int main(void)
{
    int i;
    for(i=0;i<=10;i++)
    {
        if(i>6)
        {
            break;
        }
        printf("%d\n", i);
    }
    return 0;
}


// 2)do-while循环
#include<stdio.h>

int main(void)
{
    int i = 0;
    do
    {
        printf("%d\n", i);
        i++;
        if (i>6)
        {
            break;
        }
    }while(i<=10);    
    return 0;
}

// 3)while循环
#include<stdio.h>

int main(void)
{
    int i = 0;
    while(i<=10)
    {
        printf("%d\n",i);
        i++;
        if(i>6)
        {
            break;
        }
    }    
    return 0;
}

4.2 continue

作用:在 循环语句中,跳过本次循环中余下尚未执行的语句,继续执行下一次循环

// 打印0-10中除了5的其余的数字
#include<stdio.h>

int main(void)
{
    for(int i=0; i<=10; i++)
    {
        if (i==5)
        {
            continue;
        }
        printf("%d\n", i);
    }
    return 0;
}

五、goto语句

可以无条件跳转语句

goto 标记;

如果标记的名称存在,执行到goto语句时,会跳转到标记的位置.。如果不存在,则没有操作。

#include<stdio.h>

int main(void)
{
    int a = 3;
    printf("goto语句准备开始\n");
    goto FLAG;
    printf("这里不会执行\n");
    FLAG:
        printf("直接执行到这里了\n");
    return 0;
}

 

posted on 2021-03-25 19:54  软饭攻城狮  阅读(189)  评论(0编辑  收藏  举报

导航