首页 > 代码库 > 控制语句
控制语句
编码中最常用的控制语句分为三种:顺序结构、选择结构和循环结构。
其中顺序结构的控制语句是计算机执行的一系列有序指令的集合,顺序是自上而下逐语句执行。如
void Main(){ Console.WriteLine ("欢迎进入我的计算器程序"); Console.WriteLine ("请输入第一个数字"); var numA = Convert.ToInt32(Console.ReadLine()); Console.WriteLine ("请输入第二个数字"); var numB = Convert.ToInt32(Console.ReadLine()); Console.WriteLine ("{0} + {1} = {2}", numA, numB, numA + numB);}
运行后结果显示(使用LINQ Pad执行)
选择结构是用于进行条件判断,不同的结果将导致计算机执行不同的代码块。
最简单的选择结构是if,用于判断是否需要执行某个代码段的(条件成立时执行,条件不成立时则跳过),如
void Main(){ Console.WriteLine ("请输入考试成绩:"); var score = Convert.ToInt32(Console.ReadLine()); if (score>=60) { Console.WriteLine ("你的考试成绩是:{0},恭喜通过考试!", score); } Console.WriteLine ("程序结束");}
只有考试成绩>=60的情况下,控制台次才会输出恭喜通过的信息,
但是无论通过与否,都会执行最终程序结束的语句,因为最后一行并没有被包含在if代码块的大括号中{}。
另外,控制语句if页经常用于做输入参数的判断(防御式编码),来保证输入参数的有效性与合法性,如
void Main(){ Console.WriteLine ("请输入考试成绩:"); int score = 0; if(int.TryParse(Console.ReadLine(),out score)) { if (score>=60) { Console.WriteLine ("你的考试成绩是:{0},恭喜通过考试!", score); } } Console.WriteLine ("程序结束");}
在这段代码中,int.TryParse(Console.ReadLine(),out score)用于尝试将用户输入的文本转换成整型。
如果转换成功,条件成立,返回True;否则条件不成立,返回False
这种情况下,可以防止用户输入非法的数字文本。
另一种选择结构是if-else,除了可以执行条件成立时的代码块,也定义了当条件不成立时需要执行的代码块。
将刚才的代码改造一下,就可以在控制台中,显示更为详细的提示,从而提高用户的体验,如
void Main(){ Console.WriteLine ("请输入考试成绩:"); var input = Console.ReadLine(); int score = 0; if(int.TryParse(input, out score)) { if (score>=60) { Console.WriteLine ("你的考试成绩是:{0},恭喜通过考试!", score); }else { Console.WriteLine ("你的考试成绩是:{0},请再接再厉!", score); } }else { Console.WriteLine ("{0} 的格式不正确,请输入合法的整数!",input); } Console.WriteLine ("程序结束");}
这种情况下,如果用户输入的文本不是一个有效的整数,那么显示的结果为
如果用户输入的成绩<60,输出的结果是
在出现if-else的时候,我们往往可以使用一种特殊的运算符(三元运算符 或 三目运算符)来替换,如
Console.WriteLine(score >= 60 ? "你的考试成绩是:{0},恭喜通过考试!" : "你的考试成绩是:{0},请再接再厉!", score);
其中条件成立时执行考试通过的语句,条件不成立时执行最后的语句。
然而,在现实开发中,判断条件不仅仅是简单的对错,可能会有多种情况的选择,这时,我们可能会使用if-elseif-else的多分支选择结构
static void Main(){ Console.WriteLine("请输入考试成绩:"); var input = Console.ReadLine(); int score; if (int.TryParse(input, out score)) { if (score >= 85) { Console.WriteLine("你的考试成绩是:{0},优秀!", score); } else if (score < 85 && score >= 60) { Console.WriteLine("你的考试成绩是:{0},考试通过!", score); } else { Console.WriteLine("你的考试成绩是:{0},请再接再厉!", score); } } else { Console.WriteLine("{0} 的格式不正确,请输入合法的整数!", input); } Console.WriteLine("程序结束");}
如果出现等值判断时,往往会再过个条件中选择其中一个,那么,还可能使用switch语句来实现,但是一定要注意:
switch并不能替代if-else结构,他们处理的业务是不同的。
switch语句的执行效率要略高于if-else,但是switch的判断条件有一定的限制,比如只能是整数、字符串、布尔、字符或者枚举等
比如使用switch判断用户的输入来选择具体的部门
void Main(){ Console.WriteLine ("请选择部门(输入1-3的数字):"); int dep = Convert.ToInt32(Console.ReadLine()); switch (dep) { case 1: Console.WriteLine ("你选择了 研发部"); break; case 2: Console.WriteLine ("你选择了 市场部"); break; case 3: Console.WriteLine ("你选择了 财务部"); break; default: Console.WriteLine ("输入错误!"); break; }}
在这段代码中,计算机根据输入的数字1-3,选择不同的case分支语句执行,break用于结束switch代码块(这很重要,但不是必须的)
比如,在某些情况下,我们确实需要在多个分支语句中执行相同的代码,比如判断工作日和非工作日,代码如下
static void Main(){ var dow = DateTime.Now.DayOfWeek; Console.WriteLine("今天是:{0}", dow); switch (dow) { case DayOfWeek.Monday: case DayOfWeek.Tuesday: case DayOfWeek.Wednesday: case DayOfWeek.Thursday: case DayOfWeek.Friday: Console.WriteLine("今天是工作日"); break; default: Console.WriteLine("今天是非工作日志"); break; }}
这里,通过多个case分支,执行相同的工作日志代码,可以减少冗余。
最后,在更为复杂的业务逻辑中,我们可以使用分支语句的嵌套来实现(要求思路清楚,可以使用伪代码辅助分析)
比如,我们想计算KTV在不同时间段的计费价格,如下所示
大 | 中 | 小 | ||||
周末 | 工作日 | 周末 | 工作日 | 周末 | 工作日 | |
00:00-08:00 | 50 | 40 | 40 | 30 | 30 | 20 |
08:00-18:00 | 100 | 80 | 80 | 60 | 60 | 40 |
18:00-24:00 | 120 | 100 | 100 | 80 | 80 | 60 |
编码实现:第一步,判断包间类型
void Main(){ var week = DateTime.Now.DayOfWeek; var time = DateTime.Now.Hour; var room = "中"; int money = 0; Console.WriteLine ("请选择包间大小(大,中,小)"); room = Console.ReadLine(); switch (room) { case "大": Console.WriteLine ("你选择的包间类型:大"); break; case "中":break; Console.WriteLine ("你选择的包间类型:大"); break; case "小":break; Console.WriteLine ("你选择的包间类型:大"); break; default: Console.WriteLine ("输入的包间规格不符"); break; }}
编码实现:第二步,判断是否是工作日
void Main(){ var week = DateTime.Now.DayOfWeek; var time = DateTime.Now.Hour; var room = "中"; int money = 0; Console.WriteLine ("请选择包间大小(大,中,小)"); room = Console.ReadLine(); switch (room) { case "大": Console.WriteLine ("你选择的包间类型:大"); switch (week) { case DayOfWeek.Sunday: case DayOfWeek.Saturday: Console.WriteLine ("今天是周末"); break; default: Console.WriteLine ("今天是工作日"); break; } break; case "中": Console.WriteLine ("你选择的包间类型:中"); switch (week) { case DayOfWeek.Sunday: case DayOfWeek.Saturday: Console.WriteLine ("今天是周末"); break; default: Console.WriteLine ("今天是工作日"); break; } break; case "小": Console.WriteLine ("你选择的包间类型:小"); switch (week) { case DayOfWeek.Sunday: case DayOfWeek.Saturday: Console.WriteLine ("今天是周末"); break; default: Console.WriteLine ("今天是工作日"); break; } break; default: Console.WriteLine ("输入的包间规格不符"); break; }}
编码实现:第三步,判断当前时间段,整合代码如下:
void Main(){ var week = DateTime.Now.DayOfWeek; var time = DateTime.Now.Hour; var room = "中"; int money = 0; Console.WriteLine ("请选择包间大小(大,中,小)"); room = Console.ReadLine(); switch (room) { case "大": switch (week) { case DayOfWeek.Sunday: case DayOfWeek.Saturday: if (time>=0 && time<8) { money = 50; }else if(time>=8 && time<18){ money = 100; }else{ money = 120; } break; default: if (time>=0 && time<8) { money = 40; }else if(time>=8 && time<18){ money = 80; }else{ money = 100; } break; } break; case "中": switch (week) { case DayOfWeek.Sunday: case DayOfWeek.Saturday: if (time>=0 && time<8) { money = 40; }else if(time>=8 && time<18){ money = 80; }else{ money = 100; } break; default: if (time>=0 && time<8) { money = 30; }else if(time>=8 && time<18){ money = 60; }else{ money = 80; } break; } break; case "小": switch (week) { case DayOfWeek.Sunday: case DayOfWeek.Saturday: if (time>=0 && time<8) { money = 30; }else if(time>=8 && time<18){ money = 60; }else{ money = 80; } break; default: if (time>=0 && time<8) { money =20; }else if(time>=8 && time<18){ money = 40; }else{ money = 60; } break; } break; default: Console.WriteLine ("输入的包间规格不符"); break; } Console.WriteLine ("今天是:{0}, 当前时间:{1}点,您选择的包间类型是:{2},收费:{3}",week,time,room,money);}
最终运行效果如下
控制语句