【C语言学习笔记】流程控制


第一部分 选择结构

选择结构,是对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。

一、if语句
1、第一种结构
如果条件成立,则执行代码块。
if(条件)
{
    语句1;
    语句2;
    ......
}
if (60 >= 50)
{
    printf("开班!!\n");
    printf("准备机器!!\n");
}
2、第二种结构
如果条件1成立,执行if后的代码块;否则执行else后面的代码块。
 if(条件1)
 {
    语句1;
    语句2;
    ......
 }
 else
 {

 }
if (40 >= 50)
    {
        printf("开班!!\n");
        printf("准备机器!!\n");
    }
    else
    {
        printf("不开班!!\n");
        printf("不准备机器!!\n");
    }
3、第三种结构
如果条件1成立,执行条件1后面的代码块,不成立则判断条件2是否成立,如果成立就执行条件2后面的代码块,不成立就继续往后判断......直到条件成立或代码结尾,其中只有一个条件成立,其后面的代码块能执行。
if(条件1)
 {
    语句1;
    语句2;
    ......
 }
 else if(条件2)
 {
 
 }
 else if(条件3)
 {
 
 }
 else
 {
 
 }
    int a = 6;
    
    if (a++ > 10)     //6不大于10,a==7
    {
        printf("A\n");
    }
    else if (a++ > 5)   // 7大于5,条件成立,输出B,后面的代码不再运行
    {                       
        printf("B\n");
    }
    else if (a++ > 3)   
    {
        printf("C\n");
    }
    else
    {
        printf("D\n");
    }
4、第四种结构(不建议写)
如果条件成立,则执行语句1;条件不成立,则执行语句2。
if(条件)
    语句1;
    语句2;
    int a = -10;
    
    if (a > 1)    //条件不成立
        printf("A\n");    //不执行代码
        printf("B\n");    //输出B
5、if使用注意
(1)陷阱1:==误写成=,导致程序不能实现。
    int a = 10;
    
    //if(a=0),编译器不会报错
    //比较大小时,常量写左边,变量写右边,如果少写=,会报错
    if (0 == a)
    {
        printf("a等于0\n");
    }
    else
    {
        printf("a不等于0\n");
    }
(2)陷阱2:=误写成==,导致赋值失败。
    int a = 10;
    a == 15;    //赋值失败,a的值还是10
    printf("%d\n", a);
(3)if的后面不要随便写;
    if (8 > 6) ;    //条件成立,执行了一条空语句
(4)作用域错误
if (10 > 6)
    {
        int a = 5;  
    }
    printf("%d\n", a);    //a的作用域超出
/*  错误代码
if (10 > 6)
    int a = 5;  
    //对于编译器,它认为a的作用域是从这行代码开始一直到代码块结束
    //而实际上,变量a是受if语句的限制,所以这就作用域出现矛盾,编译器报错
*/
如果在if后面的语句中定义新的变量,必须用大括号{}。
6、if课后练习
/*
 输入一个整数day代表星期几,根据day的值输出对应的星期几,比如day==1,就输出“星期一”
 */

#include <stdio.h>

int main (void)
{
    // 1.输入一个整数day
    printf ("请输入一个整数(1~7):\n");
    
    // 2.接收输入
    int day;
    scanf ("%d", &day);
    
    // 3.根据day的值输出对应的星期几
    if (1 == day)
    {
        printf ("星期一\n");
    }
    else if (2 == day)
    {
        printf ("星期二\n");
    }
    else if (3 == day)
    {
        printf ("星期三\n");
    }
    else if (4 == day)
    {
        printf ("星期四\n");
    }
    else if (5 == day)
    {
        printf ("星期五\n");
    }
    else if (6 == day)
    {
        printf ("星期六\n");
    }
    else
        printf ("星期日\n");

    return 0;
}

二、switch语句
1、结构
switch (数值)
{
    case 数值1:
        语句1;
        break;
    
    case 数值2:
        语句2;
        break;
    
    default:
        语句3;
        break;
}
switch (10)
    {
        case 10:
            printf("A\n");
   
        case 5:
            printf("B\n");

        case 0:
            printf("C\n");
            break;
            
        default:
            printf("D\n");
            break;
    }
输出结果:
A
B
C
2、使用注意
(1)如果case后面没有break,就会执行后面所有case中的语句,直到遇到break为止
(2)如果要在case后面定义新的变量,必须用大括号{}
    switch (-)
    {
        /* 错误代码,变量的作用域报错
        case '+':
            int sum = a + b;
            printf("和是%d\n", sum);
            break;
        */    
        case '-':
        {
            int minus = a - b;    //定义新变量
            printf("差是%d\n", minus);
            break;
        }
    }
3、switch练习
/*
 输入一个整数month代表月份,根据月份输出对应的季节。
 春季:3、4、5
 夏季:6、7、8
 秋季:9、10、11
 冬季:12、1、2
 */

#include <stdio.h>

int main (void)
{
    // 1.输入一个整数代表月份
    printf ("请输入月份(1~12):\n");
    
    // 2.接收输入
    int month;
    scanf ("%d", &month);
    
    // 3.根据月份输出对应的季节
    switch (month)
    {
        case 3:
        case 4:
        case 5:
            printf ("%d月是春季!\n", month);
            break;
        case 6:
        case 7:
        case 8:
            printf ("%d月是夏季!\n", month);
            break;
        case 9:
        case 10:
        case 11:
            printf ("%d月是秋季!\n", month);
            break;
            
        default:
            printf ("%d月是冬季!\n", month);
            break;
    }
    
    return 0;
}

三、if语句和switch语句比较
1、需要判断时,if语句能完成,switch不一定完成
if (10 > 8)
{
     printf("A\n");
}
//用switch语句无法完成
2、switch能完成的功能,if语句都能完成

                 
第二部分 循环结构

循环结构,在给定条件成立的情况下,反复执行某一段代码

一、while语句
1、结构
while(条件)
 {
    循环体
 }
(1)如果开始条件不成立,那么就永远不会执行循环体。
(2)如果条件成立,执行一次循环体;然后再次重新判断条件是否成立。
2、使用注意
(1)while语句后面不要随便写分号";",如果造成死循环。
    int a = 10;
    while (a>0);   //会引发死循环
    {
        a--;
        printf("哈哈");
    }
    //循环体无法执行
(2)在while语句后面如果新定义变量时,必须把变量括在大括号里{}。
3、小练习
/*
 提示用户输入一个正整数n,计算1-2+3-4+5-6+…+n的和
 */

#include <stdio.h>

int main(void)
{
    // 1.定义变量保存用户输入
    int n = 0;
    
    // 2.确认用户输入符合要求
    while (n <= 0)
    {
        // 2.1提示用户输入
        printf("请用户输入一个正整数:\n");
        
        // 2.2接收输入
        scanf("%d", &n);
    }
    
    // 3.1定义变量保存和
    int sum = 0;
    
    // 3.2当前计算的值
    int number = 1;
    
    while (number <= n)
    {
        //如果是奇数就相加
        if (number % 2)
        {
            sum += number;
        }
        //如果是偶数就相减
        else
        {
            sum -= number;
        }
        number++;
    }
    
    // 4.输出结果
    printf("和是%d\n", sum);
 
    return 0;
}
二、do while语句
1、结构
do{
    循环体
} while(条件);
2、注意点
(1)do while语句后面一定要加分号。
(2)不管条件成立与否,都是先执行一次循环体,之后再判断条件是否成立。如果成立,再一次执行循环体;如果不成立,退出循环语句。
(3)如果条件成立的情况下,while语句和do while语句是一样的,可以替换。如果条件不成立,那么就有区别了。
    int i = 0;
    while (i < 0)
    {
        i++;
    }
    printf("i=%d\n", i);    //i=0
    int i = 0;
    do{
        i++;
    } while (i < 0)
    printf("i=%d\n", i);    //i=1
三、for语句
1、结构
    for (语句1; 条件; 语句2)
#include <stdio.h>

int main(void)
{
    for (int count = 0; count < 50; count++)
    {
        printf("做俯卧撑第%d次\n", count + 1);
    }
    
    return 0;
}
(1)语句1:初始化语句
(2)语句2:增量语句
(3)运行原理:
1> for开始就会执行一次语句1,整个for循环只会执行一次语句1。
2> 判断条件是否成立,如果条件成立,就会执行一次循环体,然后就会执行语句2,再次判断条件是否成立。
2、使用注意
(1)随便在for语句后面加分号,容易造成不必要的死循环
    for (int i = 0; i < 5; i++);
    //直接执行了空语句,之后执行一次下面的代码,没有循环输出5次
    {
        printf("haha\n");
    }
    //有时候我们又需要死循环,最简单的利用for循环实现死循环
    for (; ; );    //没有条件语句,默认条件成立
(2)for语句中变量的作用域
1> 作用域不明确,编译器报错。
// 如果想在循环体中定义新的变量时,必须用大括号{}
    for (int i = 0; i < 5; i++)
        int a = 10;
2> 作用域错误,使用了未定义的标识符
    for (int i = 0; i<10; i++, a++)
    {
        int a = 10;
    }
    // 执行循环体时,定义了a,循环体结束,释放了a的内存,之后执行语句2时a++,编译器报错
3、for循环嵌套
(1)如果要用到for循环的嵌套,首先要先观察重复循环输出的内容。
(2)再确定外部循环的行数。
(3)之后确定内部循环和外部循环之间的关联,写出合理的代码。
4、for循环练习
/*
 输出九九乘法表
 1x1=1
 2x1=2 2x2=4
 3x1=3 3x2=6  3x3=9
 4x1=4 4x2=8  4x3=12 4x4=16
 5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
 6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
 7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
 8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=56
 9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
 */

#include <stdio.h>

int main(void)
{
    //输出乘法表
    printf("九九乘法表\n");
    
    for (int i = 1; i <= 9; i++)    //输出的行数
    {
        for (int j = 1; j <= i; j++)    //每行输出的次数
        {
            printf("%dx%d=%-2d ", i, j, i*j);   //输出的内容
        }
        printf("\n");
    }
   
    return 0;
}

四、continue和break
1、关键字continue
(1)使用场合
循环结构:while、do while、for
(2)注意点
退出当前循环体,如果是for循环嵌套的话,也只是退出包含它的那一层循环。
2、关键字break
(1)使用场合
1> switch语句
2> 循环结构:while、do while、for
(2)注意点
退出整个switch语句或退出整个循环结构,也是只对包含它的那一层循环起作用。
3、练习
#include <stdio.h>
int main()
{
    for (int i = 0; i<10; i++) {
        if (i % 2) continue;    //如果i是奇数,直接退出这一次循环体。执行i++,然后判断条件是否成立
        if (i == 8) break;
        printf("i=%d\n", i);       //i=2
    }                              //i=4
    return 0;                      //i=6
}
#include <stdio.h>
int main()
{
    for (int i = 0; i<5; i++) {                 //外部循环5次
        for (int j = 0; j<5; j++) {             //内部循环5次
            printf("i=%d, j=%d\n", i, j);
            if (j == 1) {                       //当j==1时,退出内部循环
                break;
            }
        }
        if (i == 2) {                          //当i==2时,退出外部循环
            break;
        }
    }
    return 0;
}
结果:i=0. j=0
     i=0, j=1
     i=1, j=0
     i=1, j=1
     i=2, j=0
     i=2, j=1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值