第六单元 流程控制

C# 流程语句分为:顺序结构,选择结构,循环结构。

1. 顺序结构

顺序结构指的是程序一步步向下执行。

int a =10;
int b =a;
a++;

2. 选择结构

C# 提供以下类型的选择语句。

声明描述
if声明 一个if语句包含一个布尔表达式后跟一个或多个语句。
if...else声明 一个if语句可以跟着一个可选的else语句,当布尔表达式是假的,其执行。
嵌套if语句 您可以在另一个if or else if语句中使用一个if or else if语句。
switch语句 switch语句允许一个变量来针对值的列表平等进行测试。
嵌套的switch语句 您可以在另一个switch语句中使用一个switch语句。

if ... else

condition1

if .. else 语法

if(bool 表达式)
{
    ... 
}
else if(bool 表达式) // 可选的
{
    ...
}
else  // 可选的
{
    ...
}

例1:

int score =90;
if(score >= 60)
{
    Console.WriteLine("及格");
}
else
{
    Console.WriteLine("不及格");
}

例2:

static void Main(string[] args)
{
    int a = 90;
    Console.WriteLine(GetGrade(a));
}
​
public static string GetGrade(int score)
{
    if (score>=60)
    {
        return "及格";
    }
    else
    {
        return "不及格";
    }
}
// 简写
public static string GetGrade(int score)
{
    if (score>=60)
    {
        return "及格";
    }
    return "不及格";
}

 

例3:

static void Main(string[] args)
{
    int a = 90;
    Console.WriteLine(GetGrade(a));
}

public static string GetGrade(int score)
{
    if (score<60)
    {
        return "不及格";
    }
    else if(score>=60 && score<=70)
    {
        return "一般";
    }
    else if (score > 70 && score <= 80)
    {
        return "良好";
    }
    else
    {
        return "优秀";
    }
}

 

如果if 或者 else 后面 只有一条语句,则 “{}” 可以省略,但一般不建议省略

if (score<60)
     return "不及格";

? : 运算符

我们已经在前面的章节中讲解了 条件运算符 ? :,可以用来替代 if...else 语句。它的一般形式如下:

Exp1 ? Exp2 : Exp3;

其中,Exp1、Exp2 和 Exp3 是表达式。请注意,冒号的使用和位置。

? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个 ? 表达式的值。

switch...case

一个 switch 语句允许测试一个变量等于多个值时的情况。每个值称为一个 case,且被测试的变量会对每个 switch case 进行检查。

C# 中 switch 语句的语法:

switch(expression){
    case constant-expression  :
       statement(s);
       break; 
    case constant-expression  :
       statement(s);
       break; 
  
    /* 您可以有任意数量的 case 语句 */
    default : /* 可选的 */
       statement(s);
       break; 
}

switch 语句必须遵循下面的规则:

  • switch 语句中的 expression 必须是一个整型或枚举类型,或者是一个 class 类型,其中 class 有一个单一的转换函数将其转换为整型或枚举类型。

  • 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号。

  • case 的 constant-expression 必须与 switch 中的变量具有相同的数据类型,且必须是一个常量。

  • 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。

  • 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。

  • 不是每一个 case 都需要包含 break。如果 case 语句为空,则可以不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。

  • C# 不允许从一个 case 部分继续执行到下一个 case 部分。如果 case 语句中有已经执行,则必须包含 break 或其他跳转语句。

  • 一个 switch 语句可以有一个可选的 default 语句,在 switch 的结尾。default 语句用于在上面所有 case 都不为 true 时执行的一个任务。default 也需要包含 break 语句,这是一个良好的习惯。

  • C# 不支持从一个 case 标签显式贯穿到另一个 case 标签。如果要使 C# 支持从一个 case 标签显式贯穿到另一个 case 标签,可以使用 goto 一个 switch-case 或 goto default。

C# 中的 switch 语句

实例

以下实例用于判断当前是星期几:

static void Main(string[] args)
{
    int day = 4;
    switch (day) // 数字,字符串,枚举
    {
        case 1:  // 只能写常量 
            Console.WriteLine("Monday");
            break;
        case 2:
            Console.WriteLine("Tuesday");
            break;
        case 3:
            Console.WriteLine("Wednesday");
            break;
        case 4:
            Console.WriteLine("Thursday");
            break;
        case 5:
            Console.WriteLine("Friday");
            break;
        case 6:
            Console.WriteLine("Saturday");
            break;
        case 7:
            Console.WriteLine("Sunday");
            break;
        default:
            Console.WriteLine("Sunday");
            break;
    }    
}

C# 8.0 可将switch 进行优化:

static void Main(string[] args)
{
    int day =4;
    string week = day switch
    {
            1=>"Monday",
            2=>"Tuesday",
            3=>"Wednesday",
            4=>"Thursday",
            5=>"Friday",
            6=>"Saturday",
            7=>"Sunday",
            _=>"Sunday" // 默认
    };
    Console.WriteLine(week);
}

 

执行结果根据当天日期有所不同,我这里执行这天的结果为:

Thursday

C# 9.0 借助于模式匹配

// c# 9.0 : 模式匹配,结合switch
int score = 88;
string result = score switch
{
    >0 and <60 => "不及格",
    >=60 and <=69 => "合格",
    >=70 and <=79 => "中等",
    >=80 and <=89 => "",
    _ => "优秀"
};
Console.WriteLine(result);

以下实例判断学生的成绩,包含了 default 语句:

static void Main(string[] args)
{
    /* 局部变量定义 */
    char grade = 'B';

    switch (grade)
    {
        case 'A':
            Console.WriteLine("很棒!");
            break;
        case 'B':
        case 'C':
            Console.WriteLine("做得好");
            break;
        case 'D':
            Console.WriteLine("您通过了");
            break;
        case 'F':
            Console.WriteLine("最好再试一下");
            break;
        default:
            Console.WriteLine("无效的成绩");
            break;
    }
    Console.WriteLine("您的成绩是 {0}", grade);
    Console.ReadLine();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

做得好
您的成绩是 B

if 与 switch 的区别

一:从“优缺点”分析 if…else 优点:使用灵活,代码空间小 ;

缺点:效率低,因为 if else 必须遍历所有的可能值;

switch…case 优点:代码结构清晰,效率高;

C# 9.0 以后,已经完全可以代替if else 结构了。

 

强化练习

  1. 业务场景:消费者在图书商城购买图书,下单后需要在支付页面显示订单优惠后的价格。具体优惠规则如下:

规则编号规则名称描述
1 规则一 所购图书总价在100元以下的没有优惠
2 规则二 所购图书总价在100到200元的优惠20元
3 规则三 所购图书总价在200到300元的优惠50元
4 规则四 所购图书总价在300元以上的优惠100元

现在需要根据上面的规则计算优惠后的价格。

// 表示购物金额
int money = 666;
// 所购图书总价在100元以下的没有优惠
if (money < 100)
{
    money = money;
}
else if (money >= 100 && money <= 200)
{
    //所购图书总价在100到200元的优惠20元
    money -= 20;
}
else if (money>200 && money<=300)
{
    money -= 50;
}
else
{
    money -= 100;
}

Console.WriteLine(money);

// switch 精简代码 
// ...大家自行补上

3. 循环结构

1. 为什么需要循环结构

例如:求1-10之间的和

int sum = 1+2+3+4+5+6+7+8+9+10;

如是让你:求 1-1000之间的和。你该怎么办?此时就需要用到循环结构来解决这个问题。

2. 什么是循环结构

有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。

编程语言提供了允许更为复杂的执行路径的多种控制结构。

循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的一般形式:

循环结构

3. 循环类型

C# 提供了以下几种循环类型。点击链接查看每个类型的细节。

循环类型描述
while 循环 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。
for 多次执行一个语句序列,简化管理循环变量的代码。
do...while 循环 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。
嵌套循环 您可以在 while、for 或 do..while 循环内使用一个或多个循环。
foreach 循环 对一个集合或者数组进行循环遍历

4. 循环控制语句

循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建的自动对象都会被销毁。

C# 提供了下列的控制语句。点击链接查看每个语句的细节。

控制语句描述
break 语句 终止 loopswitch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。
continue 语句 引起循环跳过主体的剩余部分,立即重新开始测试条件。

5. while 循环

只要给定的条件为真,C# 中的 while 循环语句会重复执行一个目标语句。

语法

C# 中 while 循环的语法:

while(condition)
{
   statement(s);
}

 

在这里,statement(s) 可以是一个单独的语句,也可以是几个语句组成的代码块。condition 可以是任意的表达式,当为任意非零值时都为真。当条件为真时执行循环。

当条件为假时,程序流将继续执行紧接着循环的下一条语句。

C# 中的 while 循环

在这里,while 循环的关键点是循环可能一次都不会执行。当条件被测试且结果为假时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。

static void Main(string[] args)
{
    /* 局部变量定义 */
    int a = 10;

    /* while 循环执行 */
    while (a < 20)
    {
        Console.WriteLine("a 的值: {0}", a);
        a++;
    }
    Console.ReadLine();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19

  

6. for 循环

一个 for 循环是一个允许您编写一个执行特定次数的循环的重复控制结构。

C# 中 for 循环的语法:

for ( init; condition; increment )
{
   statement(s);
}

  

下面是 for 循环的控制流:

  1. init 会首先被执行,且只会执行一次。这一步允许您声明并初始化任何循环控制变量。您也可以不在这里写任何语句,只要有一个分号出现即可。

  2. 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。

  3. 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。

  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。

C# 中的 for 循环

实例:求1-100的和

static void Main(string[] args)
{
    int sum =0;
    /* for 循环执行 */
    for (int a = 1; a <= 100; a = a + 1)
    {
        sum+=a;// sum = sum +a;
    }
    Console.WriteLine(sum) ;
    Console.ReadLine();
}

输出结果:

5050

7. do...while 循环

不像 forwhile 循环,它们是在循环头部测试循环条件。do...while 循环是在循环的尾部检查它的条件。

do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。

C# 中 do...while 循环的语法:

do
{
   statement(s);

}while( condition );

请注意,条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次。

如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。

流程图

C# 中的 do...while 循环

static void Main(string[] args)
{
    /* 局部变量定义 */
    int a = 10;

    /* do 循环执行 */
    do
    {
        Console.WriteLine("a 的值: {0}", a);
        a = a + 1;
    } while (a < 20);

    Console.ReadLine();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19

  

8. 循环控制语句

循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建的自动对象都会被销毁。

C# 提供了下列的控制语句。点击链接查看每个语句的细节。

控制语句描述
break 语句 终止 loopswitch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。
continue 语句 引起循环跳过主体的剩余部分,立即重新开始测试条件。

break

C# 中 break 语句有以下两种用法:

  1. break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。

  2. 它可用于终止 switch 语句中的一个 case。

如果您使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。

C# 中的 break 语句

实例

static void Main(string[] args)
{
    /* 局部变量定义 */
    int a = 10;

    /* while 循环执行 */
    while (a < 20)
    {
        Console.WriteLine("a 的值: {0}", a);
        a++;
        if (a > 15)
        {
            /* 使用 break 语句终止 loop */
            break;
        }
    }
    Console.ReadLine();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15

continue

C# 中的 continue 语句有点像 break 语句。但它不是强迫终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

对于 for 循环,continue 语句会导致执行条件测试和循环增量部分。对于 whiledo...while 循环,continue 语句会导致程序控制回到条件测试上。

C# 中的 continue 语句

static void Main(string[] args)
{
    /* 局部变量定义 */
    int a = 10;

    /* do 循环执行 */
    do
    {
        if (a == 15)
        {
            /* 跳过迭代 */
            a = a + 1;
            continue;
        }
        Console.WriteLine("a 的值: {0}", a);
        a++;

    } while (a < 20);

    Console.ReadLine();
}

 

当上面的代码被编译和执行时,它会产生下列结果:

a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19

  

9. 嵌套循环

C# 允许在一个循环内使用另一个循环,下面演示几个实例来说明这个概念。

语法

C# 中 嵌套 for 循环 语句的语法:

for ( init; condition; increment )
{
   for ( init; condition; increment )
   {
      statement(s);
   }
   statement(s);
}

  

C# 中 嵌套 while 循环 语句的语法:

while(condition)
{
   while(condition)
   {
      statement(s);
   }
   statement(s);
}

  

C# 中 嵌套 do...while 循环 语句的语法:

do
{
   statement(s);
   do
   {
      statement(s);
   }while( condition );
​
}while( condition );

  

关于嵌套循环有一点值得注意,您可以在任何类型的循环内嵌套其他任何类型的循环。比如,一个 for 循环可以嵌套在一个 while 循环内,反之亦然。

实例:打印9 * 9乘法表

for (int i = 1; i < 10; i++)
{
    for (int j = i; j < 10; j++) // j=i,可以避免 1* 9 和 9 * 1 这种重复情况
    {
        Console.WriteLine($"{i} * {j} = {i * j}");
    }
}

 

优化输出, 打印三次之后才换行:

int index = 0;
for (int i = 1; i < 10; i++)
{
    for (int j = i; j < 10; j++)
    {
        if ((index++) %3 ==0)
        {
            Console.WriteLine("\n");// 换行
        }
        Console.Write($"{i} * {j} = {i*j}\t");
    }
}

 

输出结果:

1 * 1 = 1       1 * 2 = 2       1 * 3 = 3
1 * 4 = 4       1 * 5 = 5       1 * 6 = 6
1 * 7 = 7       1 * 8 = 8       1 * 9 = 9
2 * 2 = 4       2 * 3 = 6       2 * 4 = 8
2 * 5 = 10      2 * 6 = 12      2 * 7 = 14
2 * 8 = 16      2 * 9 = 18      3 * 3 = 9
3 * 4 = 12      3 * 5 = 15      3 * 6 = 18
3 * 7 = 21      3 * 8 = 24      3 * 9 = 27
4 * 4 = 16      4 * 5 = 20      4 * 6 = 24
4 * 7 = 28      4 * 8 = 32      4 * 9 = 36
5 * 5 = 25      5 * 6 = 30      5 * 7 = 35
5 * 8 = 40      5 * 9 = 45      6 * 6 = 36
6 * 7 = 42      6 * 8 = 48      6 * 9 = 54
7 * 7 = 49      7 * 8 = 56      7 * 9 = 63
8 * 8 = 64      8 * 9 = 72      9 * 9 = 81

  

10. 无限循环(死循环)

如果条件永远不为假,则循环将变成无限循环。for 循环在传统意义上可用于实现无限循环。由于构成循环的三个表达式中任何一个都不是必需的,您可以将某些条件表达式留空来构成一个无限循环。

static void Main(string[] args)
{
    for (; ; )
    {
        Console.WriteLine("Hey! I am Trapped");
    }
    
    while(true)
    {
        Console.WriteLine("我也是死循环");
    }

}

 

当条件表达式不存在时,它被假设为真。您也可以设置一个初始值和增量表达式,但是一般情况下,程序员偏向于使用 for(;;) 结构来表示一个无限循环。

4. 作业

  1. 练习九九乘法表

  2. 打印规则图形

    *
    **
    ***
    ****
    *****

    *
    *****
    **********
    *************
  3. 某人有100元钱,要买100只鸡。公鸡5元一只,母鸡三元一只, * 小鸡一元三只。问可买到公鸡,母鸡,小鸡各多少只 ?

  4. 假设有一组规则数字:1,1,2,3,5,8,13.... ,第20个数字是多少?

  5. 我们需要通过 选择结构 来计算个人所得税,最终页面效果如下

    名词解释:

    • 税前月收入:即税前工资,指交纳个人所得税之前的总工资

    • 应纳税所得额:指按照税法规定确定纳税人在一定期间所获得的所有应税收入减除在该纳税期间依法允许减除的各种支出后的余额

    • 税率:是对征税对象的征收比例或征收额度

    • 速算扣除数:指为解决超额累进税率分级计算税额的复杂技术问题,而预先计算出的一个数据,可以简化计算过程

    • 扣税额:是指实际缴纳的税额

    • 税后工资:是指扣完税后实际到手的工资收入

    计算规则:

    要实现个人所得税计算器,需要了解如下计算规则:

    规则编号名称描述
    1 计算应纳税所得额 应纳税所得额为税前工资减去3500
    2 设置税率,应纳税所得额<=1500 税率为0.03,速算扣除数为0
    3 设置税率,应纳税所得额在1500至4500之间 税率为0.1,速算扣除数为105
    4 设置税率,应纳税所得额在4500至9000之间 税率为0.2,速算扣除数为555
    5 设置税率,应纳税所得额在9000至35000之间 税率为0.25,速算扣除数为1005
    6 设置税率,应纳税所得额在35000至55000之间 税率为0.3,速算扣除数为2755
    7 设置税率,应纳税所得额在55000至80000之间 税率为0.35,速算扣除数为5505
    8 设置税率,应纳税所得额在80000以上 税率为0.45,速算扣除数为13505
    9 计算税后工资 扣税额=应纳税所得额*税率-速算扣除数 税后工资=税前工资-扣税额

要求:任意定义一个变量表示税前工资,通过上述规则 ,计算税后工资。

posted @ 2023-05-30 09:25  誉尚学教育  阅读(113)  评论(0编辑  收藏  举报