文章教程

3.11语句和流程控制

8/31/2020 9:56:04 PM 人评论 次浏览

图片 1 知识点讲解:光盘:视频\PPT讲解(知识点)\第3章\语句和流程控制.mp4

语句是C#程序完成某特定操作的基本单位。每一个C#语句都有一个起始点和结束点,并且每个语句并不是独立的,可能和其他的语句有着某种对应的关系。在C#中常用的语句有如下几种。

  • 空语句:只有分号“;”结尾。
  • 声明语句:用来声明变量和常量。
  • 表达式语句:由实现特定应用的处理表达式构成。
  • 流程控制语句:制定应用程序内语句块的执行顺序。

例如下面的代码都是语句:

int mm=5;
int nn=10;
mm=mm+nn;
Console.WriteLine(“你好,我的朋友!”)

在默认情况下,上述C#语句是按照程序自上而下的顺序执行的。但是,通过流程控制语句,可以指定语句的执行先后顺序。根据流程语句的特点,C#流程语句可以分为如下3种。

  • 选择语句。
  • 循环语句。
  • 跳转语句。

而语句块是由1个或多个语句构成的,C#的常见独立的语句块一般由大括号来分隔限定。在语句块内可以没有任何元素,称为空块。在一个语句块内声明的局部变量或常量的作用域是块的本身。

C#语句块的执行规则如下。

  • 如果是空语句块,则控制转到块的结束点。
  • 如果不是空语句块,则控制转到语句的执行列表。

if语句属于选择语句,功能是从程序表达式的多个语句中选择一个指定的语句来执行。C#中的选择语句有if语句和switch语句。

1.if语句

C#中的if语句即if…else语句,其功能是根据if后的布尔表达式的值进行执行语句选择。if语句的基本语法格式如下。

if (布尔表达式)
 {
  处理语句;
……
 }
else
 {
  处理语句;
  ……
}

其中,处理语句可以是空语句,即只有一个分号;如果有处理语句或有多个处理语句,则必须使用大括号“{}”;else子句是可选的,可以没有。

if语句的执行顺序规则如下。

(1)首先计算if后的布尔表达式。

(2)如果表达式的结果是true,则执行第一个嵌套的处理语句。执行此语句完毕后,将返回到if语句的结束点。

(3)如果表达式的结果是false,并且存在else嵌套子句,则执行else部分的处理语句。执行此语句完毕后,将返回到f语句的结束点。

(4)如果表达式的结果是false,但是不存在else嵌套子句,则不执行处理语句,并将返回到if语句的结束点。

例如下面的一段代码:

int mm,nn,
mm=2;
nn=3;
if (mm<nn)
{
 mm=3;
 nn=4;
}
else
{
 mm=1;
 nn=2;
}

在上述代码中,首先定义了2个int类型的变量mm和nn。然后通过if语句进行判断处理,具体处理如下所示。

  • 设置布尔判断语句,通过“mm<nn”比较语句返回布尔结果。
  • 如果mm小于nn,则执行if后的处理语句,即赋值变量mm=3,变量nn=4。
  • 如果mm不小于nn,则执行else后的处理语句,即赋值变量mm=1,变量nn=2。

2.switch语句

C#中的switch语句即多选项选择语句,其功能是根据测试表达式的值,从多个分支选项中选择一个执行语句。switch语句的基本语法格式如下所示。

switch (表达式)
 {
case 常量表达式:
处理语句;
case 常量表达式:
处理语句;
case 常量表达式:
处理语句;
default:
处理语句;
……
}

其中,switch后的表达式必须是sbyte、byte、short、ushort、uint、int、ulong、long、char、string和枚举类型中的一种,或者是可以隐式转换为上述类型的类型。case后的表达式必须是常量表达式,即只能是一个常量值。

例如下面的一段代码。

int mm,nn,zz,
mm=7;
switch (mm)
{
case 0:
nn=1;
zz=2;
break;
case 1:
nn=2;
zz=3;
break;
case 2:
nn=3;
zz=4;
break;
default:
nn=4;
zz=5;
}

在上述代码中,首先定义了3个int类型的变量mm、nn和zz。然后通过switch语句根据mm的值进行判断处理,具体处理过程如下。

  • 如果mm值为0,则赋值变量nn=1,变量zz=2。
  • 如果mm值为1,则赋值变量nn=2,变量zz=3。
  • 如果mm值为2,则赋值变量nn=3,变量zz=4。
  • 如果没有匹配的值,则赋值变量nn=4,变量zz=5。

循环语句即重复执行的一些语句。通过循环语句可以重复地执行指定操作,从而避免编写大量的代码执行某项操作。在C#中有如下3种常用的循环语句。

1.while语句

while语句的功能是按照不同的条件执行一次或多次处理语句,其基本语法格式如下。

while (布尔表达式)
处理语句;

其中,while 后的表达式必须是布尔表达式。

C#中while语句的执行顺序规则如下。

(1)首先计算while后的布尔表达式。

(2)如果表达式的结果是true,则执行后面的处理语句。执行此语句完毕后,将返回到while语句的开始。

(3)如果表达式的结果是false,则返回while语句的结束点,循环结束。

实例004 计算经过多少年得到指定目标的存款

源码路径 光盘\daima\3\4\  视频路径 光盘\视频\实例\第3章\004

实例文件while.cs的主要实现代码如下。

namespace whilezhixing
{
  class Program
  {
   static void Main(string[] args)
   {
     double cunkuan, lilu, lixicunkuan;
     Console.WriteLine("你现在有多少钱?");
     cunkuan = Convert.ToDouble(Console.ReadLine());
     Console.WriteLine("现在的利率是?(千分之几格式)");
     lilu = 1 + Convert.ToDouble(Console.ReadLine()) / 1000.0;
     Console.WriteLine("你希望得到多少钱?");
     lixicunkuan = Convert.ToDouble(Console.ReadLine());
     int totalYears = 0;
     while (cunkuan < lixicunkuan)
     {
       cunkuan *= lilu;
       ++totalYears;
     }
     Console.WriteLine("存款{0} 年后将得到的钱数是{2} 。",
             totalYears, totalYears == 1 ? "" : "s", cunkuan);
     Console.ReadKey();
   }
  }
}
范例007:泛型委托和Lamdba实现计算器
源码路径:光盘\演练范例\007视频路径:光盘\演练范例\007范例008:实现货币和日期格式转换
源码路径:光盘\演练范例\008视频路径:光盘\演练范例\008\

上述实例代码的设计过程如下。

(1)通过WriteLine方法分别输出3段指定文本。

(2)分别定义变量cunkuan、lilu和lixicunkuan,用于分别获取用户输入的存款数、利率数和目标存款数。

(3)通过while语句执行存款处理。

(4)将处理后的结果输出。

经过编译执行后,将首先显示指定的文本,当输入3个数值并按回车键后,将显示对应的处理结果,如图3-10所示。

图像说明文字

图3-10 实例执行结果

2.do…while语句

在while语句中,如果表达式的值是false,则处理语句将不被执行。然而有时为了特定需求,需要执行指定的特殊处理语句,这时就要用到do…while语句。而C#中,do…while语句的功能是无论布尔表达式的值为多少,都要至少执行一次处理语句。

do…while语句的基本语法格式如下。

do
处理语句;
while (布尔表达式)

do…while语句的执行顺序规则如下。

(1)执行转到do后的处理语句。

(2)当执行来到处理语句的结束点时,计算布尔表达式。

(3)如果表达式的结果是true,则执行将返回到do语句的开始;否则,执行将来到do语句的结束点。

3.for语句

C#中,for语句的功能是在项目中循环执行指定次数的某语句,并维护其自身的计数器。简单来说就是计算一个初始化的表达式,并判断条件表达式的值。如果值为true,则重复执行指定的处理语句;如果为false,则终止循环。

for语句的基本语法格式如下。

for(初始化表达式;条件表达式;迭代表达式)
{
处理语句
}

其中,for后的初始化语句可以有多个,但必须用分号“;”隔开。

for语句的执行顺序规则如下。

(1)如果有初始化的表达式,则按照初始语句的编写顺序顺序地执行。

(2)如果有条件表达式则计算。

(3)如果没有条件表达式,则执行来到处理语句。

(4)如果条件表达式结果为true,则执行来到处理语句。

(5)如果条件表达式结果为false,则执行来到if语句的结束点。

实例005 将指定数组内的数据从小到大进行排列

源码路径 光盘\daima\3\5\  视频路径 光盘\视频\实例\第3章\005

实例文件for.cs的具体实现代码如下。

namespace forzhixing
{
  class Program
  {
    public static void Main()
    {
      int[] items = { 3, 5, -7, 8, 2, 1, -200, 1200, 24, 2, 7, 14 };
      for (int i = 1; i < items.Length; ++i)
      {
        for (int j = items.Length - 1; j >= i; --j)
        {
          //如果不符合排序要求,则交换相邻的两个数
          if (items[j - 1] > items[j])
          {
            int temp = items[j - 1];
            items[j - 1] = items[j];
            items[j] = temp;
          }
        }
      }
      for (int i = 0; i < items.Length; ++i)
        Console.Write("{0} \n", items[i]);
        Console.ReadKey();
    }
  }
}
范例009:计算两日期时间间隔
源码路径:光盘\演练范例\009视频路径:光盘\演练范例\009范例010:获取当前日期和时间
源码路径:光盘\演练范例\010视频路径:光盘\演练范例\010\

上述实例代码的设计过程如下。

(1)定义int类型的数组items,在数组内存储任意个数字。

(2)利用for语句进行相邻数据比较,然后将小的数字前置。

(3)将比较处理后的数据从小到大顺序排列。

上述代码执行后,将数组内的数字按照从小到大的顺序排列并显示出来,如图3-11所示。

Y`Z806K3SW(SU0AO[[4F_5B

图3-11 实例执行结果

跳转语句就像走捷径一样,直接命令程序跳出原来的流程,而指定去执行某个语句。跳转语句常用于项目内的无条件转移控制。通过跳转语句,可以将执行转到指定的位置。在C#程序中,有如下3种常用的跳转语句。

1.break语句

在本书前面的实例中,已经多次使用了break语句。break语句只能用于switch、while、do或for语句中,其功能是退出其本身所在的处理语句。但是,break语句只能退出直接包含它的语句,而不能退出包含它的多个嵌套语句。

2.continue语句

continue语句只能用于while、do或for语句中,其功能是用来忽略循环语句块内位于它后面的语句,从而直接开始另外新的循环。但是,continue语句只能使直接包含它的语句开始新的循环,而不能作用于包含它的多个嵌套语句。

3.return语句

return语句的功能是控制返回到使用return语句的函数成员的调用者。return语句后面可以紧跟一个可选的表达式,不带任何表达式的return语句只能被用在没有返回值的函数中。为此,不带表达式的return语句只能被用于返回类型为如下类别的对象中。

  • 返回类型是void的方法。
  • 属性和索引器中的set访问器。
  • 事件中的add和remove访问器。
  • 实例构造函数。
  • 静态构造函数。
  • 析构函数。
  • 而带表达式的return语句只能用于有返回值的类型中,即返回类型为如下类别的对象中。
  • 返回类型不是void的方法。
  • 属性和索引器中的get访问器或用户自定义的运算符。

另外,return语句的表达式类型必须能够被隐式地转换为包含它的函数成员的返回类型。

4.goto语句

goto语句的功能是将执行转到使用标签标记的处理语句。这里的标签包括switch语句内的case标签和default标签,以及常用标记语句内声明的标签。例如下面的格式:

标签名:处理语句

在上述格式内声明了一个标签,这个标签的作用域是声明它的整个语句块,包括里面包含的嵌套语句块。如果里面同名标签的作用域重叠,则会出现编译错误。并且,如果当前函数中存在具有某名称的标签,或goto语句不再这个标签的范围内,也会出现编译错误。所以说,goto语句和前面介绍的break语句、continue语句等有很大的区别,它不但能够作用于定义它的语句块内,而且能够作用于该语句块的外部。

实例006 根据分支参数的值执行对应的处理程序

源码路径 光盘\daima\3\6\  视频路径 光盘\视频\实例\第3章\006

实例文件goto.cs的具体实现代码如下。

namespace gototiaozhuan
{
  class Program
  {
    public static void Main()
    {
      for (; ; )
      {
        Console.Write("请输入一个整数(输入负数结束程序),按Enter键结束:");
        string str = Console.ReadLine();
        int i = Int32.Parse(str);
        if (i < 0)
          break;
        switch (i)
        {
          case 0:
            Console.Write("-> 0 ");
            goto case 3;
          case 1:
            Console.Write("-> 1 ");
            goto default;
          case 2:
            Console.Write("-> 2 ");
            goto outLabel;
          case 3:
            Console.WriteLine("-> 3 ");
            break;
          default:
            Console.WriteLine("-> default ");
            break;
        }
      }
    outLabel:
      Console.WriteLine("-> 离开分支 ");
    }
  }
}
范例011:获取星期信息
源码路径:光盘\演练范例\011视频路径:光盘\演练范例\011范例012:获取当前年的天数
源码路径:光盘\演练范例\012视频路径:光盘\演练范例\012\

上述实例代码的设计过程如下。

(1)通过Write语句输出指定的文本语句。

(2)定义变量str,用于获取用户输入的数值。

(3)分别定义0、1、2、3和default5个标签。

(4)根据switch的标签值进行执行语句选择。

(5)根据用户输入的数值显示对应的执行语句的标签值。

上述实例代码执行后,当用户输入标签数字后,将显示对应的执行语句标签,如图3-12所示。

图3-12 实例执行结果

当用户输入数值“2”后会引入goto语句,使执行来到外层的outLabel分支,从而退出程序。

教程类别