【C 语言入门】控制语句与结构化

结构化程序设计

结构化程序:采用结构化算法化繁为简地把一个复杂问题的求解过程分成可控、易理解和易处理的阶段进行,实现一个便于编写、阅读、修改和维护的程序。

三种基本结构:1966 年,Bohra 和 Jacopini 提出顺序结构、选择结构和循环结构三种基本结构,用这三种基本结构作为表示一个良好算法的基本单元。

  • 顺序结构:按顺序执行各个操作。
  • 选择结构:又称为选取结构或分支结构,依据不同的条件选择执行不同的操作。
  • 循环结构:又称重复结构,反复执行某一部分的操作。

下面按照如何使用控制语句实现三种基本结构。

顺序结构

顺序结构程序:是由一组顺序执行的程序块组成。程序按照语句书写的顺序一步一步顺序执行,没有任何的跳转。

Example :通过键入 a 和 b 的值,输出 a 与 b 的四则运算结果。

int main()
{
    int a = 0, b = 0;

    printf("Enter a and b :\r\n");
    scanf_s("%d%d", &a, &b);

    printf("a + b = %d\r\n", a + b);
    printf("a - b = %d\r\n", a - b);
    printf("a * b = %d\r\n", a * b);
    printf("a / b = %d\r\n", a / b);

    return 0;
}

运行结果
这里写图片描述

选择结构

选择结构程序:依据不同的条件选择执行不同的处理块。可以采用条件语句、分支语句,还有条件运算符来实现选择结构。

if 语句实现选择结构

if 语句:又称条件语句,用来判定所给定的条件是否成立,依据判定的结果(真或假)决定执行处理块。 if 语句有以下三种常见的形式:

形式 1

if (表达式 1)
{
    语句 1
}

执行过程

  • 首先计算表达式 1 的值。
  • 若表达式 1 的值不为真(非 0) ,则执行语句 1;
    若表达式 1 的值为假(0),则不执行语句 1。
    这里写图片描述

Example:仅当键入 a 值大于 b 值时,才打印信息“a > b”。

int main()
{
    int a = 0, b = 0;

    printf("Enter a and b :\r\n");
    scanf_s("%d%d", &a, &b);

    if (a > b)
    {
        printf("a > b");
    }
    return 0;
}

形式 2

if(表达式 1)
    语句 1
else
    语句 2

执行过程·

  • 首先计算表达式 1 的值。
  • 若表达式 1 的值为真(非 0),则执行语句 1;
    若表达式 1 的值为假(0),则执行语句 2。
    这里写图片描述

Example:当键入 a 的值大于 b 时,输出 “a > b”,否则输出 “a <= b”。

int main()
{
    int a = 0, b = 0;

    printf("Enter a and b :\r\n");
    scanf_s("%d%d", &a, &b);

    if (a > b)
    {
        printf("a > b");
    }
    else
    {
        printf("a <= b");
    }

    return 0;
}

形式 3

if(表达式 1)
    语句 1
else if(表达式 2)
    语句 2
else if(表达式 3)
    语句 3
   ...
else if(表达式 n)
    语句 n
else
    语句 n + 1

执行过程

  • 首先计算表达式 1 的值。
  • 判断表达式 1 的值是否为真(非 0)。
    若表达式 1 为真(非 0),执行语句 1;
    若表达式 1 的值为假(0),则计算表达式 2 的值。
  • 判断表达式 2 的值是否为真(非 0)。
    若表达式 2 的值为真(非 0),执行语句 2;
    若表达式 2 的值为假(0),则计算表达式 3 的值。
  • 依次类推,依次计算第 n 个表达式的值。
  • 当表达式 n 的值为真(非 0),执行语句 n,
    若表达式 n 的值为假(0),执行语句 n + 1。
    这里写图片描述

Example:键入 a 和 b 的值,输出其大小判断关系。

int main()
{
    int a = 0, b = 0;

    printf("Enter a and b :\r\n");
    scanf_s("%d%d", &a, &b);

    if (a > b)
    {
        printf("a > b");
    }
    else if(a = b)
    {
        printf("a = b");
    }
    else
    {
        printf("a < b");
    }

    return 0;
}

switch 实现多分支选择语句

一般形式

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

执行过程

  • 先计算表达式 1 的值。
  • 然后依次把表达式 1 的值与常量表达式的值进行比较。
  • 一旦发现表达式 1 的值能够与某个常量表达式配对,
    则以此为入口号,由此开始顺序执行语句。
  • 若表达式 1 的值与所有的 case 中的常量表达式均无法匹配,
    则执行 default 后的语句组 n + 1。

NOTE:default 是一个可选项,如果 switch 语句中没有 default 分支,则当 switch 后的表达式与所有的常量表达式都不匹配时,将不执行任何操作。

这里写图片描述

Example:依据运算符 oper 输出运算结果。

int main()
{
    int a = 0, b = 0;
    char oper = 0;

    printf("Enter a,operator, b :\r\n");
    scanf("%d%c%d", &a, &oper, &b);

    switch (oper)
    {
        case '+' :
            printf("a + b = %d\r\n", a + b);
        case '-' :
            printf("a - b = %d\r\n", a - b);
        case '*':
            printf("a * b = %d\r\n", a * b);
        case '/':
            if (b != 0)
            {
                printf("a / b = %d\r\n", a / b);
            }
            else
            {
                printf("Error: b = 0");
            }
        default:
            printf("End.\r\n");
    }

    return 0;
}

输出结果 1:当键入 1+1 时,输出了全部的四则运算结果
这里写图片描述
输出结果 2: 当键入 1-1 时,输出了减法、乘法和除法的运算结果
这里写图片描述
输出结果 3:当键入 1*1 时,输出了乘法和除法的运算结果
这里写图片描述
输出结果 4:当键入 1/1 时,输出了除法的运算结果
这里写图片描述

NOTE:可以注意到,每当表达式 oper 找到匹配的常量表达式时,会把顺序执行剩余的语句组。这并不是 Example 所设想的结果,我们的目的只是需要特定的运算结果,这时,我们可以采用 break 语句退出 switch 结构。

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

执行过程

  • 先计算表达式 1 的值。
  • 然后依次把表达式 1 的值与常量表达式的值进行比较。
  • 一旦发现表达式 1 的值能够与某个常量表达式配对,
    则以此为入口号,由此开始顺序执行语句。
  • 直到执行到 break 语句,退出 switch 语句。
  • 若表达式 1 的值与所有的 case 中的常量表达式均无法匹配,
    则执行 default 后的语句组 n + 1。

NOTE:break 语句在 switch 语句中的作用为退出 switch 语句。

这里写图片描述

Example:实现上一个 Example ,依据运算符 oper 输出运算结果。

int main()
{
    int a = 0, b = 0;
    char oper = 0;

    printf("Enter a,operator, b :\r\n");
    scanf("%d%c%d", &a, &oper, &b);

    switch (oper)
    {
        case '+' :
            printf("a + b = %d\r\n", a + b);
            break;
        case '-' :
            printf("a - b = %d\r\n", a - b);
            break;
        case '*':
            printf("a * b = %d\r\n", a * b);
            break;
        case '/':
            if (b != 0)
            {
                printf("a / b = %d\r\n", a / b);
            }
            else
            {
                printf("Error: b = 0");
            }
            break;
        default:
            printf("End.\r\n");
            break;
    }

    return 0;
}

输出结果 1: 键入 1+1,输出 1+1 的运算结果
这里写图片描述
输出结果 2: 键入 1-1,输出 1-1 的运算结果
这里写图片描述
输出结果 3: 键入 1*1,输出 1*1 的运算结果
这里写图片描述
输出结果 4:键入 1/1,输出1/1的运算结果
这里写图片描述

条件表达式实现选择结构

一般形式

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

执行过程

  • 首先计算表达式 1 的值。
  • 若表达式 1 的值为真(非 0), 则条件表达式的值为表达式 2 的值;
    若表达式 1 的值为假(0),则条件表达式的值为表达式 3 的值。

Example:键入 a、b 值,输出最大值。

int main()
{
    int a = 0, b = 0, max = 0;

    scanf("%d %d", &a, &b); // 注意:键入时中间有个空格

    max = (a > b) ? a : b;
    printf("max is %d\r\n", max);

    return 0;
}

输出结果 1 :键入 1 3,输出 最大值为 3
这里写图片描述
键入结果 2: 键入 3 1,输出最大值为 3
这里写图片描述

循环结构

循环结构:用来处理需要的重复操作。

while 语句实现循环结构

一般形式

while(循环条件表达式)
{
    循环体语句;
}

执行过程
当循环条件表达式的值为真(非 0),则执行循环体语句。

这里写图片描述

EXAMPLE:使用 while 语句实现计算 1 + 2 + 3 + … + 99 + 100 的结果

int main(void)
{
    int i = 1;
    int sum = 0;

    while (i <= 100)
    {
        sum += i;
        i++;
    }
    printf("sum = %d", sum);
    return 0;
}

输出结果
这里写图片描述

do…while 语句实现循环结构

一般形式

do
{
    循环体语句;
}while(循环条件表达式)

执行过程

  • 先执行循环体语句。
  • 然后检查循环表达式的值是否为真(非 0)。
    若循环表达式的值为真(非 0),执行循环体语句;
    若循环表达式的值为假( 0),退出循环。

这里写图片描述
Example:使用 do - while 语句计算 1 + 2 + 3 + … + 99 + 100 的结果

int main(void)
{
    int i = 1;
    int sum = 0;

    do 
    {
        sum += i;
        i++;
    } while (i < 101);

    printf("sum = %d", sum);
    return 0;
}

输出结果
这里写图片描述

for 语句实现循环过程

一般形式

// 表达式1:设置初始条件,只执行一次。
// 表达式2:循环条件表达式,用于判断是否继续循环。在每次执行循环体语句前先执行此表达式。
// 表达式3:循环的调整,在执行完循环体后才进行。
for(表达式1; 表达式2; 表达式3)
{
    循环体语句;
}

//即可以理解为
for(循环变量赋初值; 循环条件; 循环变量增值)
{
    循环体语句;
}

这里写图片描述

Example:for 循环方式计算 1 + 2 + 3 + … + 99 + 100 的结果

int main(void)
{
    int i = 1;
    int sum = 0;

    for (i = 1, sum = 0; i <= 100; i++)
    {
        sum += i;
    }

    printf("sum = %d", sum);
    return 0;
}

输出结果
这里写图片描述

改变循环状态的两种方式

  • break:提前终止循环。使流程跳出循环体之外,接着接着执行循环体下面的语句。
  • continue:提前结束本次循环。跳过循环体中下面尚未执行的语句,转到循环体结束点之前。
版权声明:本文为XiuHua_Wu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/XiuHua_Wu/article/details/79981899