|
控制语句 |
|
|
本章主要内容5.1算法概述 5.2选择语句 5.3循环语句 5.4跳转语句 5.5FOREACH语句 5.6异常 语句 第5章控制语句算法是为解决一个问题而采取的有限步骤,而程序的算法是指使用程序解决问题的计算步骤。不同的算 法效率不同:高效率算法:采用优秀的解决方法,合理安排计算步骤,以最少的计算步骤完成计算任务的方法。低效率算法:使用 了比较笨拙的解决方法,通过较多的运算步骤来实现同样的计算任务的计算方法。5.1算法概述算法的设计要有一定的原则:1. 符合数学计算规则只有符合数学规则的计算步骤才可以被计算机正确执行。2.保证结果确定如果一个算法对同一组数据进行多次计 算,竟然获得多个不同的结果,这种算法是不确定的,是无效的。保证算法的确定性,最重要的方面是排除程序中随机数的产生(变量 初始化)。3.程序能够正常结束一个合理的算法应包含有限的操作步骤,而不能是无限的。4.合理的输入一个实际有效 的程序中应该含有零个或者多个输入(一般会在程序的算法中加入一个或者多个输入)。5.合理的输出一个有效的程序在设 计算法时必须保证程序至少要有一个输出选择型语句就是条件判断语句,它能让程序根据在指定的条件是否成立而选择执行不同的语句块。 C#提供两种选择语句结构:if、switch。5.2选择语句5.2.1if语句1.if框架形式:if (条件表达式){语句;}如果条件为真,则执行语句。2.if_else框架 if(条件表达式){语句1;}else{语句2;}如果条件表达式为真,执行语句1 ;否则执行语句2。当有多重的判断的时候可用以下格式:if(<表达式1>)语句1//elseif语句 elseif(<表达式2>)语句2//组合if语句elseif(<表达式3>)语句3…else语 句n(编译器采取自上向下的方式执行语句)在if语句框架中,无论条件表达式为真或为假,将要执行的语句都有可能又是一个 if语句,这种if语句又包含if语句的结构就称之为嵌套的if语句。在使用if_else结构是,C#规定else语句与和 它处于同一模块最近的if相匹配以避免二义性。3.嵌套的if语句当我们计算如下函数时:若使用如下的代码:intx,y; y=0;if(x>=0)if(x>0)y=1;else y=-1;因为else与最近的if匹配,所以这段代码会出现逻辑上的错误。那么有什么办法可以很好的解决这 种错误呢?方法就是:将嵌套的if语句改成如下形式:if(x>=0){if(x>0) y=1;}elsey=-1;加上“{}”将离else最近的if隔离掉例:求ax2+b x+c=0方程的根usingSystem;usingSystem.Collections.Generic;using System.Text;namespaceif_else嵌套{classProgram{ staticvoidMain(string[]args){doublea, b,c,disc,x1,x2,real,image;Console.WriteLine( "请输入三个实数:");a=double.Parse(Console.ReadLine()); b=double.Parse(Console.ReadLine());c= double.Parse(Console.ReadLine());if(Math.Abs(a)<=1e-7) //a==0,注意写法{if(Math.Abs(b)<=1e-7)/ /b==0Console.WriteLine("不是方程");els eConsole.WriteLine("是一次方程,解为:{0}",-c/b); }else{disc=bb-4ac;if(Math.Ab s(disc)<=1e-7)//disc==0Console.WriteLine(" 有两个相等的实根:{0}",-b/(2a));elseif(disc>1e-7) {x1=(-b+Math.Sqrt(disc))/(2a); x2=(-b-Math.Sqrt(disc))/(2a);Consol e.WriteLine("有两个不相等的实数根:{0}和{1}",x1,x2);} else{real=-b/(2a);imag e=Math.Sqrt(-disc)/(2a);Console.WriteLine("有 两个复数根:");Console.WriteLine("{0}+{1}i",real,image );Console.WriteLine("{0}-{1}i",real,image); }}//a不为0,处理其它三种情况5.2.2switch语句switch开关语句专门用于 处理多路分支的情形,使程序变得简洁。其一般的定义格式为:switch(表达式){casevalue1: 内嵌语句块1casevalue2;内嵌语句块2default: 内嵌语句块N}switch语句的执行流程是:计算switch后的表达式?将结果值一一与case后的常 量值比较?找到相匹配的case?执行相应的语句序列,直到遇到跳转语句(break)?结束。如果找不到匹配的case ?归结到default处,执行它的语句序列,直到遇到break语句为止;当然如果没有defaul,则不执行任何操作。在使用swi tch时须注意:switch语句的表达式必须是整数类型。case常量必须是与表达式类型相兼容。case常量的值必须互异,不 能有重复。“不穿透”规则:不能将与某个case相关联的语句序列接在另一个case语句序列之后。可以有两个或多个case前缀指 向相同的语句序列。下面是利用switch来求学生的成绩的等级的例子:usingSystem;usingSystem. Collections.Generic;usingSystem.Text;namespace@switch{c lassProgram{staticvoidMain(string[]args) {Console.Write("输入学生百分制的成绩:");intG rade=int.Parse(Console.ReadLine());switch(Grade/10){ case9:case10:Console.WriteLine("你的成绩为:A"); break;case8:Console.WriteLine("你的 成绩为:B");break;case7:Console.Wri teLine("你的成绩为:C");break;case6:C onsole.WriteLine("你的成绩为:D");break; default:Console.WriteLine("你的成绩为:E");break ;}}}}5.3循环语句循环语句就是在特定的条件下重复地执行相同的动作,直到条件不再满足特定的条件 时才停止执行。5.3.1while语句While语句的语法形式:whil e(条件表达式){循环体语句;}如果条件表达式为真(true), 则执行循环体语句。While语句的流程图:5.3.2do_while语句do_while语句的语法形式:do 循环体语句;while(条件表达 式)该循环首先执行循环体语句,再判断条件表达式。如果条件表达式为真(true),则继续执行循环体语句。其流程图为: 通过比较while与do_while的流程图,我们不难发现这两种循环语句的不同之处:(1)while语句 的循环体有可能一次也不执行。(2)而do_while语句的循环体至少执行一次。5.3.3for语句fo r语句的语法形式:for(表达式1;表达式2;表达式3){循环体语句;}表达式1是设置循环控 制变量的初值;表达式2是bool类型的表达式,作为循环控制条件;表达式3是设置循环控制变量的增值(正负亦可)。Q:三个表达式要 如何定义呢?for语句的流程图:for语句的一些变化特点:(1)for循环语句,表达式1和表达式3可引入逗号运算符“,”,这 样可以对若干个变量赋初值或增值。(2)for循环的三个表达式可以任意缺省,甚至全部缺省,如果表达式2缺省就约定它的值是true 。但不管哪个表达式缺省,其相应的分号“;”不能缺省。(3)可在for循环内部声明循环控制变量。如果循环控制变量仅仅只在这个 循环中用到,那么为了更有效地使用变量,也可在for循环的初始化部分(表达式1)声明该变量,当然这个变量的作用域就在这个循环内。5 .3.4三种循环的比较(1)三种循环可以处理同一问题。(2)while和do-while循环,循环变量应在循环语句前初 始化。(3)while循环和for循环是先判断表达式后执行语句,而do-while循环是先执行语句,然后判断表达式。 (4)对while、do-while和for循环,可用break语句跳出循环,而用continue语句结束本次循 环5.4跳转语句跳转语句用于改变程序的执行流程,转移到指定之处。break语句只能用于循环语句或swit ch语句中,如果在switch语句中执行到break语句,则立刻从switch语句中跳出,转到switch语句的下一条语句;如果在 循环语句执行到break语句,则会导致循环立刻结束,跳转到循环语句的下一条语句。注意:不管循环有多少层,break语句只能从包含 它的最内层循环跳出一层。5.4.1break语句5.4.1continue语句continue语句只能用于循环语 句之中,它的作用是结束本轮循环,不再执行余下的循环体语句,对while和do_while结构的循环,在continue执行之后就立 刻测试循环条件,以决定循环是否继续下去;对for结构循环,再continue执行之后,先求表达式3(即循环增量部分),然后再测试循 环条件。注意:(1)通常continue会和一个条件语句结合起来用,不会是独立的一条语句,也不会是循环体的最后一条语句,否则没 有任何意义。(2)如果continue语句陷于多重循环结构之中,它只对包含它最内层循环有效。5.4.3return语句return语句出现在一个方法内,在方法中执行到return语句时,程序流程转到调用这个方法处。(可以没有返回值)5.4.4goto语句goto语句就是使程序转向标记的地方,执行该地方的动作。语法形式:标号:语句;goto标号;(标号给出goto语句转向的目标)goto语句如果用在switch语句中,它的格式是:gotocase常量;gotodefault;注意:只能在本switch语句中从一种情况转向另一种情况。使用goto语句时需注意:goto语句不能使控制转移到另一个语句块内部,更不能转到另一个函数内部。 |
|
|
|
|
|
|
|
|
|
|