第5章 条 件 语 句 条件语句能够使计算机程序具有“判断能力”,像人类的大脑一样分析问题,使程序根据某些表达式的值有选择地执行。C#语言提供了两种条件语句: (1) if语句。 (2) switch语句。 5.1if语句 由if语句引导的选择结构有if结构、ifelse结构和ifelseif结构3种。 微课视频 5.1.1if结构 if结构流程如图51所示,首先测试条件表达式,如果为true则执行语句组(包含一条或多条语句的代码块),否则执行if语句结构后面的语句。 图51if结构流程 如果语句组只有一条语句,可以省略大括号,但从编程规范角度来看,最好不要省略大括号,省略大括号会使程序的可读性变差。 if结构语法格式如下: if (条件表达式) { 语句组 } if结构示例代码如下: // 5.1.1 if结构 using System; namespace HelloProj { internal class Program { static void Main(string[] args) { Console.WriteLine("请输入一个整数:"); string str = Console.ReadLine(); // 从键盘读取字符串 ① int score = Convert.ToInt32(str); // 将字符串转换为int类型数据 ② if (score >= 85) { Console.WriteLine("您真优秀!"); } if (score < 60) ③ Console.WriteLine("您需要加倍努力!"); if ((score >= 60) && (score < 85)) { Console.WriteLine("您的成绩还可以,仍需继续努力!"); } } } } 上述程序运行时,会挂起并等待用户输入,如图52所示,输入内容后按Enter键,程序将继续执行,如图53所示。 图52等待用户输入 图53程序继续执行 上述代码第①行调用Console类的.ReadLine()方法,从控制台读取一个字符串。 代码第②行通过Convert.ToInt32(str)方法将字符串转换为整数。 代码第③行的if语句中的语句组只有一条语句,故省略大括号。 微课视频 5.1.2ifelse结构 ifelse结构流程如图54所示,首先测试条件表达式,如果为true,则执行语句组1; 如果为false,则忽略语句组1而直接执行语句组2,然后继续执行后面的语句。 图54ifelse结构流程 ifelse结构语法格式如下: if (条件表达式) { 语句组1 } else { 语句组2 } ifelse结构示例代码如下: // 5.1.2 if-else结构 namespace HelloProj { internal class Program { static void Main(string[] args) { Console.WriteLine("请输入一个整数:"); string str = Console.ReadLine(); // 从键盘读取字符串 int score = Convert.ToInt32(str); // 将字符串转换为int类型数据 if (score < 60) Console.WriteLine("不及格"); else Console.WriteLine("及格"); } } } 上述代码与5.1.1节类似,这里不再赘述。 微课视频 5.1.3ifelseif结构 如果程序有多个分支,则可以使用ifelseif结构,其流程如图55所示。ifelseif结构实际上是ifelse结构的多层嵌套,其明显特点就是在多个语句组中只执行一个,而其他都不执行,所以这种结构可用于有多种判断结果的情况。 图55ifelseif结构流程 ifelseif语法格式如下: if (条件表达式1) { 语句组1 } else if (条件表达式2) { 语句组2 } else if (条件表达式3) { 语句组3 ... } else if (条件表达式n) { 语句组n } else { 语句组n+1 } ifelseif结构示例代码如下: // 5.1.3 if-else-if结构 namespace HelloProj { internal class Program { static void Main(string[] args) { Console.WriteLine("请输入一个整数:"); string str = Console.ReadLine(); // 从键盘读取字符串 int score = Convert.ToInt32(str); // 将字符串转换为int类型数据 char grade; if (score >= 90) grade = 'A'; else if (score >= 80) grade = 'B'; else if (score >= 70) grade = 'C'; else if (score >= 60) grade = 'D'; else grade = 'F'; Console.WriteLine("分数等级:" + grade); } } } 上述代码与5.1.1节类似,这里不再赘述。 5.2多分支语句 如果分支有很多,那么ifelseif结构使用起来将很麻烦,这时可以使用switch语句,它的语法格式如下: switch (表达式) { case 判断值1: 语句组1 case 判断值2: 语句组2 case 判断值3: 语句组3 ... case 判断值n: 语句组n default: 语句组n+1 } default语句可以省略。switch语句中“表达式”运算结果只能是如下几种类型。 (1) 整数类型。 (2) 字符串类型。 (3) 枚举类型。 当程序执行到switch语句时,先计算“表达式”的值,假设值为A,然后拿A与第1个case语句中的“判断值1”进行匹配,如果匹配,则执行“语句组1”,执行完成后不跳出switch语句,只有遇到break才跳出switch语句; 如果A没有与第1个case语句中的“判断值1”匹配,则与第2个case语句中的“判断值2”进行匹配,如果匹配,则执行“语句组2”,以此类推,直到执行“语句组n”。如果所有的case语句都没有被执行,就执行default的“语句组n+1”,这时才跳出switch语句。 微课视频 5.2.1表达式运算结果是整数类型 switch语句中的表达式运算结果可以是整数类型或字符串类型,下面先看一个整数类型的示例,代码如下: namespace HelloProj { internal class Program { static void Main(string[] args) { Console.WriteLine("请输入一个整数:"); string str = Console.ReadLine(); // 从键盘读取字符串 int score = Convert.ToInt32(str); // 将字符串转换为int类型数据 char grade; switch (score / 10) { case 10: case 9: grade = 'A'; break; case 8: grade = 'B'; break; case 7: grade = 'C'; break; case 6: grade = 'D'; break; case 5: grade = 'E'; break; default: grade = '?'; break; } Console.WriteLine("分数等级:" + grade); } } } 上述示例运行时,用户通过键盘输入一个整数,然后通过执行switch语句返回结果,如图56所示。 图56switch语句示例代码运行过程和结果 微课视频 5.2.2表达式运算结果是字符串类型 5.2.1节示例介绍了表达式运算结果是整数类型,本节介绍表达式运算结果是字符串类型,示例代码如下: namespace HelloProj { internal class Program { static void Main(string[] args) { Console.WriteLine("请输入级别:"); string level = Console.ReadLine(); string desc = ""; switch (level) { case "优": desc = "90分以上"; break; case "良": desc = "80分~89分"; break; case "中": desc = "60分~79分"; break; case "差": desc = "低于60分"; break; default: desc = "无法判断"; break; } Console.WriteLine(desc); } } } 上述示例运行时,用户通过键盘输入优、良、中和差等字符,然后通过执行switch语句返回结果,如图57所示。 图57示例代码返回结果 5.3动手练一练 1. 选择题 (1) switch语句中“表达式”的运算结果是如下哪些类型?() A. byte、sbyte、char和int类型 B. String类型 C. 枚举类型 D. 以上都不是 (2) 下列语句执行后,ch1的值是()。 char ch1 = 'A', ch2 = 'W'; if (ch1 + 2 < ch2) ++ch1; A. 'A' B. 'B' C. 'C' D. B 2. 判断题 (1) switch语句中每一个case语句后面必须加上break语句。() (2) if语句可以替代switch语句。() (3) if语句中的语句组只有一条语句时,不能省略大括号。()