C语言_04 三种程序结构 顺序, 选择(分支), 循环结构

概念

在C语言程序中,一共有三种程序结构:顺序结构、选择结构(分支结构)、循环结构

顺序结构,从头到尾一句接着一句的执行下来,直到执行完最后一句;

选择结构,到某个节点后,会根据一次判断的结果来决定之后向哪一个分支方向执行;

循环结构,循环结构有一个循环体,循环体里是一段代码。对于循环结构来说,关键在于根据判断的结果,来决定循环体执行多少次。C语言循环控制语句是一个基于C语言的编程语句,该语句主要有while循环语句、do-while循环语句和for循环语句来实现循环结构。

 

但是三种结构并不是彼此孤立 循环中可以有顺序, 选择(分支).  顺序中可以有选择,可以有循环. 选择中也可以有顺序有循环. 一段程序代码往往是这三者相互结合组成的.

 

1.顺序结构

 C语言的顺序结构顾名思义, 就是程序自上而下执行, 没有分支,也没有循环.

 

#include <stdio.h>

int main(){
    int a = 3, b = 2;
    int sum = a+b;
    printf("a+b=%d\n", sum);    //输出a+b的和
    return 0;
}

像上述代码, 程序顺序执行求和a+b并输出, 没有循环也没有分支, 所以上述代码就是一个顺序结构.

 

《C语言_04 三种程序结构 顺序, 选择(分支), 循环结构》

2.选择(分支)结构

C语言选择结构用于判断给定的条件,根据判断的结果来控制程序的流程。

在C语言中, 选择结构有两种: 1. if-else语句,  2. switch-case语句;

1) if-else 语句

写法:

 

if(条件1){
    //满足条件1执行此代码块
    ...
}else if(条件2){
    //不满足条件1, 满足条件2执行此代码块
    ...
}else{
    //即不满足条件1也不满足条件2 执行此代码块
    ...
}

举个栗子, 成绩评级.

 

#include <stdio.h>

int main(){
    int score = 78; //模拟输入成绩

    if (score >= 90){  //成绩 大于90 A
        printf("A");
    }else if(score >= 80 && score < 90){ // 80-89 B
        printf("B");
    }else if(score >= 70 && score < 80){ // 70-79 C
        printf("C");
    }else if(score >= 60 && score < 70){ // 60-69 D
        printf("D");
    }else{  //小于60 E
        printf("E");
    }

    return 0;
}

 

else if 可以有0个或多个,  else 只能有0个或1个.

如果我们只需判断学生是否及各, 那么我们就可以这样写:

 

if (score >= 60){
    printf("及格");
}else{
    printf("不及格");
}

当然也可以只有if() 没有else ,  只有if() 和 else if ()没有else.

2)switch-case 语句

在C语言中, 第二种分支结构就是switch-case, 只是用的地方不太多, 因为if语句可以轻松替代switch语句, 只是结构上没switch那么清晰.

语法:

 

switch (变量或表达式){
    case 常量表达式1: 语句块1; break;
    case 常量表达式2: 语句块2; break;
    ......
    case 常量表达式n: 语句块n; break;
    default: 语句块n+1; break;
}

还是成绩评级的栗子:

 

#include <stdio.h>

int main(){
    int score = 78;  //模拟输入
    
    switch(score / 10){ //case匹配的数据就是score/10的结果  
        case 10: 
        case 9: printf("A"); break;
        case 8: printf("B"); break;
        case 7: printf("C"); break;
        case 6: printf("D"); break;
        default: printf("E"); break;
    }

    return 0;
}

score/10 得到的整数就是那个阶段的成绩, 我们会发现case 10: 也就是100分匹配后面没有任何的操作, 最主要的是, 没有break;

在switch语句中, 如果case匹配到了语句, 那么后面的语句都会执行知道出现第一个break, 或者执行完成.

如果我们将上面代码中的break全部去掉.score还是78, 那么输出就会变成 CDE, 也就是匹配到7 然后输出7之后的所有语句,知道碰到break;

default相当于else, 其他所有不匹配的情况, 因为一般是放在最下面, 所以default后面的break可以不写.

 

重点:switch的条件只能是整型和字符型(其实就是字符的ascii码)或者这些类型的表达式,case匹配的只能是整型或常量者这两个类型的常量表式, 也是case能匹配.

 

3.循环结构

循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件,判断继续执行某个功能还是退出循环。

在C语言中有三种循环结构: for循环, while循环, do-while循环.

1) for循环

写法:

 

for(表达式1; 表达式2; 表达式3){
    循环体;
}

语句1:初值表达式,常用于在循环开始前为循环变量赋初值
语句2:循环控制逻辑表达式,控制循环执行和结束的条件
语句3:循环变量修改表达式,常用于修改循环变量,使得结果趋向于循环结束条件.

举个栗子:

循环输出10个”hello world!!!”

 

#include <stdio.h>

int main(){
    int i;
    for (i = 1; i <= 10; i++){ //循环10次, i++为 i自增长1
        printf("hello world!!!\n");
    }
    return 0;
}

上诉for循环的执行过程:

1.执行表达式1, i = 1, 只执行一遍.

2. 执行表达式2, 判断 i <=10

3.如果表达式2成立, 执行循环体  { printf(“hello world!!!\n”); } 否则执行退出循环, 后续步骤都不执行.

4.执行完成循环体后,执行表达式3, i++, i的值自动增长1. 回到步骤2去判断.

 

for循环中的三个表达式都可以为空, 但是一定要写两个分号也就是 for( ; ; ) 这样就代表无限循环, 也就是死循环.不过一般不会这样用.

 

而for循环常用的是对数组的操作,所以初始值一般是0.

 

int i;
int Stu[10] = {99, 87, 76, 59, 73, 45, 99, 39, 88, 19}; //班级10个学生的成绩

for(i = 0; i < 10; i++){    //循环10次, 0~9
    printf("学号为:%d, 成绩为: %d\n", i+1, Stu[i]);   //数组下标从0开始
}

其实可以发现, 正常的for循环可以很清晰的明白for循环的循环次数.

 

所以在你很清晰明白这次循环需要循环多少次的时候推荐使用for循环.

 

2)  while 循环

while循环的语法简单易懂

 

 while(表达式){
        语句块
    }

执行过程: 执行表达式, 如果成立执行语句块, 否则退出循环.

 

while循环也可以和for循环互换.

 

//for -> while
int i = 0;
while (i < 10){
    //循环体
    i++;
}
//while -> for
for (;l < r;){
}

for->while: 没有for循环那么清晰明了的知道循环次数.

while->for: 没有while循环那么简单易懂了.

所以while循环的一般用法是我们不太清楚循环在什么时候结束, 并且我们也不关心具体的循环次数的时候使用.

举个例子: 二分查找

 

#include <stdio.h> 
 
int main(){  
    int a[10] = {12, 32, 34, 55, 76, 89, 99, 123, 345, 1234}; //递增的数组 
    int l = 0, r = 9, mid; 
    int res = 345;  //查找的目标 
    //二分查找位置 
    while(l <= r){ 
        mid = (l+r)/2; 
        if (res == a[mid]){  //找到了输出位置, 并退出循环. 
            printf("位置: %d\n", mid+1); break; 
        }else if(res < a[mid]){  
            r = mid-1; 
        }else{   
            l = mid+1; 
        } 
    } 
    return 0; 
} 

我们只看while循环的内容, while(l<=r)  也就是当l>r时循环退出.

 

 

 

和for循环不同的是, 我们并不清楚程序在什么时候会退出, l和r在循环中是在不断变换的.这种情况使用while循环是个不错的选择.

 

3) do-while循环

 

do{
    循环体
}while(表达式);

和while循环不同的是,do-while循环是先执行一遍循环体,再判断是否满足表达式.

 

注意: do-while循环最后是有一个分号结尾的.

do-while循环的用处也就在先执行一遍循环体再判断, 那么如果我们需要判断的内容必须要执行一遍循环体才能知道的话,那么就可以使用do-while循环.

举个例子:

 

#include <stdio.h>

int main(){
    int t;
    int res = 89;
    do{
        printf("请输入一个数字,输入0退出游戏:");
        scanf("%d", &t);
        if(t == res){
            printf("猜对了!\n");
        }else if (t > res){
            printf("太大\n");
        }else{
            printf("太小\n");
        }

    }while(t != 0);
    return 0;
}

虽然这个例子bug很多, 但是我们可以清晰的理解do-while循环的不同, 我们一开始并不清楚t的值, 当我们执行完循环体后才知道t的值,然后做判断.

 

 

三大循环总结:

for 循环: 在你很清晰明白这次循环需要循环多少次的时候推荐使用.

while循环: 在我们不太清楚循环在什么时候结束, 并且我们也不关心具体的循环次数的时候推荐使用.

do-while循环: 如果我们需要判断的内容必须要执行一遍循环体才能知道的话推荐使用.

 

 

 

    原文作者:__飘过
    原文地址: https://blog.csdn.net/qq908821304/article/details/79273428
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞