C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# 流程控制语句

C# 入门基础知识 - 流程控制语句

  • 第5节 流程控制语句
    • 5.1 分支语句
      • 5.1 if 语句
      • 5.2 if...else 语句
      • 5.3 if...else if...else 语句
      • 5.4 switch 语句
    • 5.2 循环语句(迭代语句)
      • 5.2.1 while循环:在条件为真时重复执行一段代码。
      • 5.2.2 do-while循环:先执行一段代码,然后在条件为真时重复执行。
      • 5.2.3 for循环:按照特定的计数器条件重复执行一段代码。
      • 5.2.4 foreach循环:用于遍历集合或数组中的元素。
    • 5.3 跳转语句
      • 5.3.1 break语句:终止循环或switch语句的执行。
      • 5.3.2 continue语句:跳过当前循环迭代,继续执行下一次迭代。
      • 5.3.3 return语句:用于从方法中返回值并停止方法的执行。
      • 5.3.4 goto语句:跳转到指定的标签位置继续执行代码。

更多C#基础知识点可查看:C#学习笔记 - C#基础知识 - C#从入门到放弃

第5节 流程控制语句

5.1 分支语句

5.1 if 语句

if 语句用于条件判断,其中包含一个布尔表达式,后面跟随着若干要执行的代码,当布尔表达式为真时,后面跟随的代码就会执行,if 语句的语法格式如下:

if(布尔表达式){
    要执行的代码;
}

if 语句流程图:
在这里插入图片描述
【示例】判断一个数是否为偶数

int num = 12;
if (num % 2 == 0)
{
	Console.WriteLine("num的值为偶数");
	//Console.ReadKey();
}
Console.ReadKey();

执行结果:

num的值为偶数

但是当num的值为奇数时,屏幕不会有任何提示,若想打印提示,可以使用if…else语句。

5.2 if…else 语句

if else 语句同样用于条件判断,它比 if 语句中多出了一个 else 语句,当布尔表达式为假时,执行 else 语句块中的代码,语法格式如下所示:

if(布尔表达式){
    表达式为真时要执行的代码;
}else{
    表达式为假时要执行的代码;
}

if else 语句的执行流程如下图所示:
在这里插入图片描述
【示例】用户输入一个数,打印出其偶数性。
程序代码:

Console.WriteLine("输入一个整数:");
int num = int.Parse(Console.ReadLine());
if (num % 2 == 0)
{
	Console.WriteLine("num的值为{0},它是偶数",num);
}
else
{
	Console.WriteLine("num的值为{0},它是奇数",num);
}
Console.ReadKey();

运行程序:

输入一个整数:
45
num的值为45,它是奇数

输入一个整数:
22
num的值为22,它是偶数

5.3 if…else if…else 语句

if else if 语句其实就是一个 if 语句后面跟随着若干个 else if else 语句,语句中可以包含多个条件表达式,程序会依次判断这些条件表达式,当条件表达式为真时则执行后面语句块中的代码,如果没有为真的条件表达式则执行 else 语句块中的代码,其语法格式如下所示:

if(布尔表达式 1){
    布尔表达式 1 为真时要执行的代码;
}else if(布尔表达式 2){
    布尔表达式 2 为真时要执行的代码;
}else if(布尔表达式 3){
    布尔表达式 3 为真时要执行的代码;
}
...
else{
    当所有布尔表达式都为假时要执行的代码;
}

需要注意的是,当布尔表达式为真,且成功执行它后面语句块中的代码后,会跳出 if else if 语句,语句中的其它部分不会再被执行。
if else if 语句的执行流程如下图所示:
在这里插入图片描述
【示例】
程序代码:

Console.WriteLine("请输入1-7判断是星期几:");
int week = int.Parse(Console.ReadLine());
//int.Parse用于将屏幕输入的语句转换为整型
if (week == 1)
	Console.WriteLine("星期一");
else if (week == 2)
	Console.WriteLine("星期二");
else if (week == 3)
	Console.WriteLine("星期三");
else if (week == 4)
	Console.WriteLine("星期四");
else if (week == 5)
	Console.WriteLine("星期五");
else if (week == 6)
	Console.WriteLine("星期六");
else if (week == 7)
	Console.WriteLine("星期日");
else
	Console.WriteLine("输入数值非1-7,重新输入");
Console.ReadKey();

执行程序:

请输入1-7判断是星期几:
5
星期五

请输入1-7判断是星期几:
9
输入数值非1-7,重新输入

5.4 switch 语句

switch 语句类似于if else if 语句,都可以根据表达式执行某个的语句块,其语法格式如下:

switch(表达式){
    case value1:
    //表达式的值为 value1 时,要执行的代码
        break;
    case value2:
    //表达式的值为 value2 时,要执行的代码
        break;
    case value3:
    //表达式的值为 value3 时,要执行的代码
        break;
    ... ...
    default:
    //没有与表达式相匹配的值时,要执行的代码
        break;
}

使用 switch 语句时必须遵守以下规则:

① switch 语句中表达式的值必须是一个整型或者枚举类型;
② 在一个 switch 语句中可以有任意数量的 case 语句,每个case 关键字后面要跟一个与表达式比较的值和一个冒号;
③ case 关键字后面的值必须与 switch中表达式的值具有相同的数据类型,并且必须是一个常量(也可以理解为是一个固定的值,不会随程序的运行发生改变);
④ 当表达式的值等于 case中的值时,就会执行 case 后面的语句,在遇到 break 关键字时停止;
⑤ 当遇到 break 关键字时,switch语句会停止运行,并跳转到 switch 语句以外的下一行代码继续运行;
⑥ 并不是每一个 case 语句后面都需要包含 break关键字,如果 case 语句为空(case 语句后面没有要执行的代码),则可以不包含 break 关键字,这时程序会继续执行后续的 case语句,直至遇到 break 关键字为止;
⑦ C# 不允许从一个 case 语句连续执行到下一个 case 语句,因此如果 case语句中包含要执行的语句,就必须包含 break 关键字或其他跳转语句;
⑧ 一个 switch 语句的末尾可以有一个可选的default(默认选项),当所有 case 语句都不能与表达式相匹配时则会执行 default 部分中的代码,而且 default 中的break 语句可以省略;

switch 语句的执行流程如下图所示:
在这里插入图片描述
【示例】根据用户输入的月份,判断2023年这个月份的天数。
程序代码:

            //判断2023年每个月份的天数
            //31天:1 3 5 7 8 10 12
            //30天:4 6 9 11
            //28天:2

            Console.WriteLine("请输入1-12判断月份天数:");
            int month = int.Parse(Console.ReadLine());
            //int.Parse用于将屏幕输入的语句转换为整型
            switch (month)
            {

                case 2: Console.WriteLine("本月有28天"); break;
                case 4:
                case 6:
                case 9:
                case 11:
                    Console.WriteLine("本月有30天"); break;
                default:
                    Console.WriteLine("本月有31天"); break;
            }
            Console.ReadKey();

运行程序:

请输入1-12判断月份天数:
2
本月有28天

请输入1-12判断月份天数:
12
本月有31

5.2 循环语句(迭代语句)

5.2.1 while循环:在条件为真时重复执行一段代码。

while 循环用于多次迭代一部分程序,特别是在迭代的次数不固定的情况下,建议使用 while 循环而不是 for 循环。while 循环的语法格式如下所示:

while(表达式){
    循环主体;         // 要执行的代码
}

需要注意的是,如果循环条件一开始就为false,那么循环体中的代码将不会执行,循环会被跳过。使用while循环时,需要注意确保在一定条件下循环终止,以避免无限循环。同时,需要适当地更新循环条件,使循环朝着正确的方向进行。其中,循环主体可以是一个单独的语句,也可以是多条语句组成的代码块,当表达式的为真时,循环会一直执行下去。

while 循环的执行流程如下图所示:
在这里插入图片描述
【示例】计算1+2+3+…+99+100的和。
程序代码:

            int i = 1;
            int sum = 0;
            while (i < 101) {
                sum += i;
                i++;
            }
            Console.WriteLine("1-100的和是"+sum);
            Console.ReadKey();

运行程序:

1-100的和是5050

5.2.2 do-while循环:先执行一段代码,然后在条件为真时重复执行。

do-while 循环是一种迭代语句,类似于 while 循环,它在循环体执行后检查条件是否为真。如果条件为真,则重复执行循环体,直到条件为假。
do-while 循环的语法格式如下:

do
{
    // 循环体代码
}
while (condition);

语法说明:
① condition 是一个布尔表达式,表示循环继续执行的条件。循环体先执行一次,然后检查条件。如果条件为真,则继续重复执行循环体;如果条件为假,则循环终止。
② 需要注意的是,do-while 循环至少会执行一次循环体代码,即使条件一开始就为假。这与 while 循环的行为有所不同,因为 while 循环会在开始之前检查条件。
③ 在使用 do-while 循环时,要确保能在循环体内改变条件,确保循环有终止的机制,以避免出现无限循环。同时,根据实际情况,可以根据循环体的执行结果来决定是否继续循环。

【示例1】计算1+2+3+…+99+100的和。
程序代码:

            int i = 1;
            int sum = 0;
            do
            {
                sum += i;
                i++;
            } while (i < 101);
            Console.WriteLine("1-100的和是"+sum);
            Console.ReadKey();

运行程序:

1-100的和是5050

【示例2】输入本金、利率和期待收益,计算多少年可以完成期待收益。
程序代码:

            //银行存款问题
            double Balance = 0;
            double Rate = 0;
            int Year = 0;
            double TargetBalance = 0;
            Console.WriteLine("请输入存款本金:");
            Balance = double.Parse(Console.ReadLine());
            Console.WriteLine("请输入当前利率百分比:");
            Rate = double.Parse(Console.ReadLine()) / 100;
            Console.WriteLine("请输入目标收益:");
            //验证输入有效性
            do
            {
                TargetBalance = double.Parse(Console.ReadLine());
                if (TargetBalance <= Balance)
                    Console.WriteLine("Eorr:目标收益小于等于本金!重新输入目标收益:");
                    
            } while (TargetBalance <= Balance);

            do
            {
                Balance *= (Rate + 1);
                Year++;
            } while (Balance < TargetBalance);
            Console.Write("将会在{0}年内,达到收益{1}元。", Year, Balance);
            Console.ReadKey();
        }

运行程序:

请输入存款本金:
50000
请输入当前利率百分比:
2.5
请输入目标收益:
48000
Eorr:目标收益小于等于本金!重新输目标收益:!
55000
将会在4年内,达到收益55190.64453125元。

5.2.3 for循环:按照特定的计数器条件重复执行一段代码。

for 循环是一种常见的迭代语句,用于在特定的计数器条件下重复执行一段代码。for 循环由三个部分组成:初始化部分、循环条件和迭代部分。

for 循环的语法格式如下:

for (initialization; condition; iteration)
{
    // 循环体代码
}

语法说明:

① initialization 是在循环开始之前执行的初始化语句,用于初始化循环计数器或其它变量。
② condition 是一个布尔表达式,表示循环继续执行的条件。只要条件为真,循环体就会继续执行;一旦条件为假,循环终止。
③ iteration 是在每次循环迭代之后执行的语句,用于更新循环计数器或变量。

for 循环的执行流程如下图所示:
在这里插入图片描述
【示例1】计算用户输入的数求其阶乘值。
程序代码:

            //for循环求阶乘
            //1!=1 2!=2*1 3!=3*2*1
            Console.WriteLine("输入要求的阶乘数值:");
            int a = int.Parse(Console.ReadLine());
            int jc = 1;
            for (int i = 1; i <= a; i++)
            {
                jc *= i;
            }
            Console.WriteLine("{0}!的结果是:{1}", a, jc);
            Console.ReadKey();
        }

运行程序:

输入要求的阶乘数值:
6
6!的结果是:720

【示例2】打印一个九九乘法表。
程序代码:

            Console.WriteLine("=========================九九乘法表==========================");
            for (int i = 1; i <= 9; i++)
            {
                for (int j = 1; j <= i; j++)
                {
                    Console.Write("{0}*{1}={2} ", j, i, i * j);
                    if (i * j < 10)
                        Console.Write(" ");
                }
                Console.WriteLine("");
            }
            Console.WriteLine("==============================================================");
            Console.ReadKey();

执行程序:

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

5.2.4 foreach循环:用于遍历集合或数组中的元素。

foreach 循环用于遍历集合或数组中的元素,它可以自动迭代集合中的每个元素,而无需手动控制迭代器或索引。foreach 循环提供了一种简洁和直观的方式来遍历集合。

foreach 循环的语法格式如下:

foreach (var item in collection)
{
    // 循环体代码
}

语法说明:

① item 是用于表示集合中当前元素的变量,在每次迭代中被赋值为集合中的下一个元素。
② collection 是要遍历的集合,可以是数组、列表、字典等可枚举的数据结构。在每次迭代中,item 变量被赋值为集合中的下一个元素,直到遍历完所有元素为止。
③ 以下是一个示例,展示了使用 foreach 循环遍历数组中的元素并求和的例子:
④ 要注意foreach 循环只用于遍历集合或数组,不提供对集合中元素的修改操作。如果需要修改集合中的元素,可以使用传统的 for 循环或其他方式进行操作。

【示例】用户输入一个语句,根据空格剪切出单词换行输出。
程序代码:

            Console.WriteLine("输入一个语句:");
            string str = Console.ReadLine();
            foreach (char word in str)
            {
                if (char.IsWhiteSpace(word))
                {
                    Console.WriteLine();    //仅换行
                }
                else
                {
                    Console.Write(word);    //遇到空格前不换行输出
                }
            }
            Console.ReadKey();

运行程序:

输入一个语句:
my name is flyer.cheng nice to meet you !
my
name
is
flyer.cheng
nice
to
meet
you
!

5.3 跳转语句

5.3.1 break语句:终止循环或switch语句的执行。

break 语句在前面switch 语句的时候已经有了简单的了解,它不仅可以用来终止 switch 语句,在循环语句中使用时还可以用来跳出循环,执行循环外的下一条语句。
如果是在嵌套循环中使用,例如在内层的循环中使用 break 语句,那么程序只会跳出内层的循环,并不会影响到外层循环的执行。
break 语句的执行原理如下图所示:
在这里插入图片描述

【示例】输出1-100的数字,每行10个,同时为3、4、5的倍数时退出循环并提示。
程序代码:

            //输出1-100的数字,每行10个,同时为3、4、5的倍数时退出
            Console.WriteLine("输出1-100的数字,每行10个,同时为3、4、5的倍数时退出:");
            for (int i = 1; i < 101; i++)
            {
                if ((i % 3 == 0) && (i % 4 == 0) && (i % 5 == 0))
                {
                    Console.WriteLine( );
                    Console.WriteLine("3、4、5公倍数倍数是{0},此时跳出循环。",i);
                    break;
                }
                   
                if (i % 10 == 0)
                    Console.WriteLine(i);
                else
                {
                    if (i < 10)
                        Console.Write(" " + i + " ");
                    else
                        Console.Write(i + " ");
                }

            }
            Console.ReadKey();

运行程序:

输出1-100的数字,每行10个,同时为345的倍数时退出:
 1  2  3  4  5  6  7  8  9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59
345公倍数倍数是60,此时跳出循环。

5.3.2 continue语句:跳过当前循环迭代,继续执行下一次迭代。

continue 语句的工作原理与 break 语句类似,但是 continue 语句并不会跳出整个循环,而是跳过本次循环继续执行下一次的循环。
continue 的执行原理如下图所示:
在这里插入图片描述
【示例】输出1-100的数字,每行10个,同时为3、4的倍数时跳过,用**取代。
程序代码:

            //输出1-100的数字,每行10个,同时为3、4的倍数时跳过,用**取代
            Console.WriteLine("输出1-100的数字,每行10个,同时为3、4的倍数时跳过:");
            for (int i = 1; i < 101; i++)
            {
                if ((i % 3 == 0) && (i % 4 == 0)) //&&(i % 5 == 0)
                {
                    if (i % 10 == 0)
                        Console.WriteLine("**" + " ");
                    else
                        Console.Write("**" + " ");
                    continue;
                }
                if (i % 10 == 0)
                    Console.WriteLine(i);
                else
                {
                    if (i < 10)
                        Console.Write(" " + i + " ");
                    else
                        Console.Write(i + " ");
                }

            }
            Console.ReadKey();

运行程序:

输出1-100的数字,每行10个,同时为34的倍数时跳过:
 1  2  3  4  5  6  7  8  9 10
11 ** 13 14 15 16 17 18 19 20
21 22 23 ** 25 26 27 28 29 30
31 32 33 34 35 ** 37 38 39 40
41 42 43 44 45 46 47 ** 49 50
51 52 53 54 55 56 57 58 59 **
61 62 63 64 65 66 67 68 69 70
71 ** 73 74 75 76 77 78 79 80
81 82 83 ** 85 86 87 88 89 90
91 92 93 94 95 ** 97 98 99 100

5.3.3 return语句:用于从方法中返回值并停止方法的执行。

跳转语句 return 用于在方法中提前返回结果并终止方法的执行。当使用 return 语句时,程序会立即退出当前方法,并返回指定的值(如果有)给调用者。

return 语句的用法有3种:返回一个值;无返回值;提前终止方法;

说明:
return用法:退出整个main函数
return语句只能出现在方法当中,当调用方法时,执行到return语句时,直接跳转到Main( )函数。
return 语句终止它出现在其中的方法的执行并将控制返回给调用方法。它还可以返回一个可选值。
④ 如果方法为 void 类型,则可以省略 return 语句

【示例】(有返回值)输入三个数,求平均值。
程序代码:

using System;
namespace return语句
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("输入三个数求平均值");
            Console.WriteLine("输入第一个数:");
            int num1 = int.Parse(Console.ReadLine());
            Console.WriteLine("输入第二个数:");
            int num2 = int.Parse(Console.ReadLine());
            Console.WriteLine("输入第三个数:");
            int num3 = int.Parse(Console.ReadLine());

            double avg = fun_avg(num1,num2,num3);
            Console.WriteLine("三个数的平均值是:" + avg);
            Console.ReadKey();
        }
		//1、return有返回值时
        static double fun_avg(int a,int b,int c) {
            return (a+b+c) / 3;
        }

    }
}

运行程序:

输入三个数求平均值
输入第一个数:
37
输入第二个数:
29
输入第三个数:
42
三个数的平均值是:36

【示例】(无返回值)输入三个数,求平均值。
程序代码:

using System;
namespace return语句
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("输入三个数求平均值");
            Console.WriteLine("输入第一个数:");
            int num1 = int.Parse(Console.ReadLine());
            Console.WriteLine("输入第二个数:");
            int num2 = int.Parse(Console.ReadLine());
            Console.WriteLine("输入第三个数:");
            int num3 = int.Parse(Console.ReadLine()); 
            fun_avg(num1,num2,num3);
            Console.ReadKey();
        }
        //2、return不带返回值时
        static void fun_avg(int a, int b, int c)
        {
            Console.WriteLine("三个数的平均值是:{0}", (a + b + c) / 3);
            return;
        }
    }
}

运行程序:

输入三个数求平均值
输入第一个数:
19
输入第二个数:
53
输入第三个数:
48
三个数的平均值是:40

程序说明:
return语句只能出现在方法当中,当调用方法时,执行到return语句时,直接跳转到Main( )函数。

5.3.4 goto语句:跳转到指定的标签位置继续执行代码。

goto 语句是一种跳转语句,用于将程序的控制转移到指定的标签处,从而改变执行流程。虽然 goto 语句在某些情况下可以提供一种跳转的方式,但由于容易造成代码结构混乱和可读性差的问题,一般不建议过多使用

goto 语句的语法:

goto label;
// ...
label: statement;

语法说明:
label 是一个标签,用于标记代码中的位置。它由一个冒号和标识符组成,标识符可以是任意有效的名称。statement 是要执行的语句。

goto 语句来实现了一个简单的循环。程序使用标签 start 标记循环的入口,在每次迭代后通过 goto start; 语句将控制转移到标签处,从而实现了循环的目的。goto 语句可以实现代码跳转,但过多使用会对代码的可读性和维护性产生负面影响。建议在大多数情况下使用结构化的控制流语句(如 ifforwhiledo-while),它们提供了更清晰和易于理解的代码结构。只在极少数情况下,当必要时再使用 goto 语句。为了提高代码的可读性和可维护性,应该遵循一致的代码风格和最佳实践,并避免滥用 goto 语句。

【示例1】打印1-5:

int i = 0;
start:
i++;
Console.WriteLine(i);
if (i < 5)
    goto start;

【示例2】模拟一个账号密码登陆场景。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace goto语句
{
    class Program
    {
        static void Main(string[] args)
        {
            int count = 1;
        login:
            Console.WriteLine("请输入用户名");
            string username = Console.ReadLine();
            Console.WriteLine("请输入密码");
            string userpwd = Console.ReadLine();
            if (username == "flyer" && userpwd == "123123")
            {
                Console.WriteLine("登录成功");
            }
            else
            {
                count++;
                if (count > 3)
                {
                    Console.WriteLine("用户名或密码错误次数超过3次!退出程序!");
                }
                else
                {
                    Console.WriteLine("用户名或密码错误");
                    goto login;//返回login标签处重新输入用户名密码
                }
            }

            Console.ReadKey();

        }
    }
}

运行程序(错误输入):

请输入用户名
fly
请输入密码
123123
用户名或密码错误
请输入用户名
flyer
请输入密码
13
用户名或密码错误
请输入用户名
flye
请输入密码
12312
用户名或密码错误次数超过3次!退出程序!

运行程序(正确输入):

请输入用户名
flyer
请输入密码
123123
登录成功

你可能感兴趣的:(C#基础知识,知识点,学习笔记,c#,开发语言,java)