第3章 选择结构与循环结构 王德俊 上海交通大学继续教育学院
第3章 选择结构与循环结构 3.1 一个简单的选择结构程序 3.2 if语句——二分支选择语句 3.3 switch语句——多分支选择语句 3.4 一个简单的循环结构程序 3.5 while语句和do…while语句 3.6 for语句和foreach语句 3.7 跳转语句
【例3.1】 构造一个C#控制台应用程序,使之实现下列分段函数的功能: 3.1一个简单的选择结构程序 ——分段函数的实现 【例3.1】 构造一个C#控制台应用程序,使之实现下列分段函数的功能:
创建一个控制台应用程序PiecewiseFunction: 3.1一个简单的选择结构程序 ——分段函数的实现 3.1.1 创建C#控制台应用程序 创建一个控制台应用程序PiecewiseFunction: 运行该程序,从键盘上输入一个数值数据,如-3.14:
如果x>0,则f=1 选择 结构 如果x=0,则f=0 如果x<0,则f=-1 3.1.2 选择结构解析 3.1一个简单的选择结构程序 ——分段函数的实现 3.1.2 选择结构解析 选择 结构 如果x>0,则f=1 如果x=0,则f=0 如果x<0,则f=-1
选择结构主要有: 3.1.2 选择结构解析(续) 单入口双分支 单入口三分支(如上面的if语句实现的选择结构) 3.1一个简单的选择结构程序 ——分段函数的实现 3.1.2 选择结构解析(续) 选择结构主要有: 单入口双分支 单入口三分支(如上面的if语句实现的选择结构) 单入口多分支(三个或三个以上的分支) 对于这些选择结构,除了可以利用if语句来实现以外,还可以用 switch语句来完成。
3.2 if语句——二分支选择语句 将if语句分为三种类型: if…语句 if…else…语句 if…else if…else…语句
3.2 if语句——二分支选择语句 3.2.1 if…语句 3.2.2 if…else…语句 3.2.3 if…else if…else…语句
if…语句是最简单的一种if语句,其语法格式如下: 说明: 该语句的作用是:如果括号中布尔表达式的值为true,则 执行后面的语句块(语句块是指放在大括号“{”和“}”之间 的语句序列),否则什么都不做。 如果语句块仅由一条语句组成,那么大括号“{”和“}”可以省略。 “if (布尔表达式)”和“语句块”可以放在一行上,也可以分在两行上。 “if”后面括号中的表达式的返回值必须为布尔类型,即返回true或 false,这一点与C/C++不同;此外,关键字“if”后面没有“then”。
3.2 if语句——二分支选择语句 3.2.1 if…语句(续) if…语句的流程图如下图所示。
【例3.2】 从键盘上输入两个整数,然后输出较大的整数。 3.2 if语句——二分支选择语句 3.2.1 if…语句(续) 【例3.2】 从键盘上输入两个整数,然后输出较大的整数。 经过该语句后x总是保存了它们当中的最大者
if…else…语句是一种二分支选择语句,其语法格式如下: 语句块1 else 语句块2 说明: 该语句的作用是:如果括号中布尔表达式的值为true,则执行后面的语句块1,否则执行语句块2。也就是说,不管布尔表达式的值为true还是为false,语句块1和语句块2必有其中之一被执行。
示例PasswordBox 编程PasswordBox判断从文本框输入的口令是否合法?效果如 下图! 文本框的PasswordChar属性可以隐蔽用户通过键盘输入的字符,常用 来编写检查用户口令的程序。使用选择语句实现该操作 程序预设口令为“abc”
控件 属性 属性值 Form1 Text 使用基本控件实现口令判断 label1 请输入口令: label2 button1 验证 textBox1 PasswordChar *
private void button1_Click(object sender, System.EventArgs e) { if(textBox1.Text=="abc") //设口令为“abc” label2.Text="欢迎使用本系统!"; //如果输入正确,显示"欢迎使用本系统!" else //如果输入不正确 label2.Text=“对不起,您的口令有误,您无权使用该系统!"; }
if…else语句也可以用于多种分支的选择结构,这种情况也就是 if语句嵌套结构 if语句可以嵌套,但应注意if…else的配对问题
语法格式如下: 3.2.3 if…else if…else…语句 if (布尔表达式1) 语句块1 else if (布尔表达式2) 语句块2 … else if (布尔表达式n) 语句块n else 语句块n+1
一旦有语句块被执行,执行后程序都跳出整个if语句。 默认情况下,else总是与前面最近的if相匹配。 3.2.3 if…else if…else…语句(续) 该语句的作用是:先计算布尔表达式1,如果其值为true, 则执行语句块1;否则计算布尔表达式2,如果布尔表达式2 的值为true,则执行语句块2;…;否则计算布尔表达式n, 如果布尔表达式n的值为true,则执行语句块n;否则(所有 布尔表达式的值均为false)执行语句块n+1。 一旦有语句块被执行,执行后程序都跳出整个if语句。 默认情况下,else总是与前面最近的if相匹配。 最后面的“else”和“语句块n+1”可以省略,要根据实际需 要取舍。
【例3.4】 编写一个控制台应用程序,使之能够将学生成绩从百分制转化为等级制。创建控制台应用程序Grade: 3.2 if语句——二分支选择语句 3.2.3 if…else if…else…语句(续) 【例3.4】 编写一个控制台应用程序,使之能够将学生成绩从百分制转化为等级制。创建控制台应用程序Grade: static void Main(string[] args) { Console.Write("请输入分数: "); double score = Convert.ToDouble(Console.ReadLine()); string grade; if (score > 100 || score < 0) Console.Write("输入的分数不合法,请核查!"); Console.ReadLine(); return; } //判断合法的分数输入
Console.Write("成绩等级为: {0} !",grade); Console.ReadLine( ); if (score >= 90) grade = "优秀"; else if (score >= 80) grade = "良好"; else if (score >= 70) grade = "中等"; else if (score >= 60) grade = "及格"; else grade = "不及格"; Console.Write("成绩等级为: {0} !",grade); Console.ReadLine( ); } 利用了if…else if…else…语句来实现成绩从百分制到等级制的转化
3.3 switch语句——多分支选择语句 1. break语句 2. default标签
多分支选择结构 if语句每次判断只能有两个分支,如果在多重分支的情况下, 使用if语句实现比较复杂 使用开关语句即switch语句可以方便地解决这种问题 switch语句有一个控制表达式,其分支语句根据控制表达式的 值的不同执行不同的程序段
格式为: switch (控制表达式) { case 常量表达式1: 内嵌语句1; break; case 常量表达式2: 内嵌语句2; default: 内嵌语句; } 控制表达式所允许的数据类型为:整数类型、字符类型、字符串类型,或者枚举类型 常量表达式的数据类型与控制表达式的类型相同
switch语句 switch语句按以下顺序执行: ① 控制表达式求值 ② 若常量表达式等于控制表达式所求出的值,则执行case后的内嵌语句 ③ 若没有常量表达式等于控制表达式的值,则执行default后的内嵌语句 ④ 若控制表达式的值不满足case,也没有default,则转向switch语句段 的结束端 注意:在switch语句结束之前(即“}”之前),必须在case、default 后的内嵌语句中使用break语句,以便跳出switch语句,否则将会产生 编译错误
1. break语句 break语句用于停止语句的执行,即在switch语句结构中, break语句用于中断选择分支的语句运行 如果case语句后有处理语句,需要break语句作为结束 在switch语句中,多个case语句可以使用同一个处理语句
2. default标签 在switch语句中,常常用到default标签来处理不满足case语句 的值
【例3.5】 对于例3.4中关于将学生成绩从百分制转化为等级制的问题,也可以使用switch语句来解决。创建控制台应用程序Grade2: static void Main(string[ ] args) { Console.Write("请输入分数: "); double score = Convert.ToDouble(Console.ReadLine()); string grade; if (score > 100 || score < 0) Console.Write("输入的分数不合法,请核查!"); Console.ReadLine( ); return; }
switch ((int)(score / 10)) { case 10: case 9: grade = "优秀"; break; default: grade = "不及格"; break; } Console.Write("成绩等级为: {0} !", grade); Console.ReadLine( ); switch语句
改进 例3.5(示例ScoreConversion) 用窗体应用程序实现,效果如下图:
private void button1_Click(object sender, System private void button1_Click(object sender, System.EventArgs e) // “转换(switch)”按钮 { int k=int.Parse(textBox1.Text); switch(k/10) { case 0: case 1: case 2: case 3: case 4: case 5: textBox2.Text="不及格"; break; case 6: textBox2.Text="及格"; break; case 7: textBox2.Text="中"; break; case 8: textBox2.Text="良"; break; case 9: case 10: textBox2.Text="优"; break; default: textBox2.Text=“非法数据,请重新输入"; break; }
private void button2_Click(object sender, System private void button2_Click(object sender, System.EventArgs e) // “退出”按钮 { this.Close(); //也可以Application.Exit( ); }
本讲小结 if语句——二分支选择语句 switch语句——多分支选择语句