《c#pp第四章结构化程序设计.ppt》由会员分享,可在线阅读,更多相关《c#pp第四章结构化程序设计.ppt(91页珍藏版)》请在三一办公上搜索。
1、第4章 结构化程序设计,内容提要:结构化程序的三种基本结构 算法、流程图、if语句、分支语句 循环语句、跳转语句 异常处理的概念 try/catch语句、throw语句和finally语句目的要求:理解算法的概念 掌握 if语句、switch分支语句、循环语句和异常处理语句的含义重点难点:if语句、循环语句和异常处理语句,4.1 结构化程序设计的概念结构化程序设计的概念及算法的概念 结构化程序设计方法,是比较广泛使用的程序设计方法。用这种方法编制的程序具有结构清晰,可读性强,易查错等特点。结构化程序设计有三种基本结构,即:顺序结构、选择结构、循环结构。每种基本结构可以包含若干条语句。,程序设计
2、的主要步骤:分析问题。确定算法。(3)画出程序流程图。(4)编写程序。(5)调试程序。(6)建立健全的文档资料。最关键的是第2个步骤,即“算法设计”。所谓“算法”,粗略地讲,是为解决一个特定问题而采取的确定的有限的步骤。,4.1.2 流程图 流程图(Flowchart),亦称框图,它是用一些几何框图、流向线和文字说明表示各种类型的操作。计算机算法可以用流程图来表示。,图2-2-1 程序控制结构的流程图,4.2 顺序结构 4.2.1 顺序结构的概念:有些简单的程序是按程序语句的编写顺序依次执行的,这种结构称为顺序结构。,例:编写程序计算圆的周长和面积。,using System;class Ci
3、rcle static void Main()const double PI=3.141;double R,L,S;Console.Write(请输入圆的半径值:);R=double.Parse(Console.ReadLine();L=2*PI*R;S=PI*R*R;Console.WriteLine(圆的周长为:0,L);Console.WriteLine(圆的面积为:0,S);,4.2.2 顺序结构的实例,Parse()方法:主要用于将数字的字符串表示形式转换为它的等效的其他基本数字类型。例:string s=“18”;int a=int.Parse(s)-10;/a=8 int b=a
4、+int.Parse(Console.ReadLine();,4.3 选择结构4.3.1 选择结构的概念 选择结构,是一种常用的主要基本结构,是计算机根据所给定选择条件为真与否,而决定从各实际可能的不同操作分支中执行某一分支的相应操作。,【案例5】计算方程的根 本例将实现通过输入一元二次方程的系数,计算方程的根的程序,效果如图2-2-8所示。,图2-2-8 计算方程的根,在本例的实现过程中,将学习使用if语句的应用。案例的实现方法如下。1创建项目 2界面设计 3代码编辑(1)算法流程分析(2)算法代码实现,【案例6】用户登录 本例将实现一个可以验证用户登录的程序,效果如图2-2-11所示。,图
5、2-2-11 用户登录,在本例的实现过程中,将学习使用if语句的应用。案例的实现方法如下。1创建项目 2界面设计 3代码编辑(1)算法流程分析(2)算法代码实现,4.3.2 条件语句1if语句 语法形式:if(表达式)语句;说明:如果表达式的值为true,则执行后面if语句所控制的语句;如果表达式的值为false,则不执行if语句控制的语句,而直接跳转执行后面的语句。注意:如果if语句块中只有一条语句,则大括号“”可以省略。,编程:计算下面公式中的b的值。2a+1(a 100)b=a(a 100),using System;class value static void Main()Conso
6、le.Write(请输入a的值:);int a=int.Parse(Console.ReadLine();int b=a;if(a=100)b=2*a+1;Console.WriteLine(b=0,b);,编程:输入三个数,将它们从大到小排序 int a,b,c,t=0;Console.Write(“请输入第一个数:”);a=int.Parse(Console.ReadLine();Console.Write(“请输入第二个数:”);b=int.Parse(Console.ReadLine();Console.Write(“请输入第三个数:”);c=int.Parse(Console.Rea
7、dLine();if(a=b t=a;a=b;b=t;if(a=c t=a;a=c;c=t;if(b=c t=b;b=c;c=t;Console.WriteLine(“排序结果为:0,1,2”,a,b,c);,2ifelse语句语法:if(表达式)语句块1;else 语句块2;说明:如果表达式的值为true,则执行if语句所控制的语句块1;如果表达式的值为false,则执行else语句所控制的语句块2。,例:输入一个数,对该数进行四舍五入。using System;class Value static void Main()Console.WriteLine(“请输入a的值:”);double
8、 a=double.Parse(Console.ReadLine();int b;if(a-(int)a=0.5)b=(int)a+1;else b=(int)a;Console.WriteLine(0进行四舍五入后的值为:1,a,b);,在ifelse语句中可以嵌套使用多层ifelse语句,如:if(表达式1)if(表达式2)if(表达式3)语句1;else 语句2;else 语句3;else 语句4;在使用这种结构时,要注意else和if的配对关系,其原则是:从第1个else开始,一个else总和它上面离它最近的可配对的if配对。,例:int a=int.Parse(Console.Rea
9、dLine();if(a0)if(a100)a=a-50;else a=a+10;/这个else与if(a100)相配 else a=-a;/这个else与if(a0)相配Console.WriteLine(“a=”,a);,练习:1.若int m,n,r;则以下正确的是()Aif(mn)r-;Bif(m=n)r-;Cif(!m)r-;Dif(m=n)r-;2.程序改错。if(x=1)y+=5;else;y+=10;,思考与练习 1.为铁路编写计算运费的程序。假设铁路托运行李,规定每张客票托运费的计算方法是:行李重量不超过 50 kg时,每千克0.25元;超过 50 kg而不超过 100 kg
10、时,其超过部分每千克0.35元;超过 100 kg时,其超过部分每千克0.45元。(编写完整的程序,上机实现)分析:托运费的分段函数是什么?,答:设行李重量为w公斤,应付托运费为x元,则托运费的分段函数是:(1)w100时,x=0.25*50+0.35*50+0.45*(w-100),double w,x=0;Console.Write(“请输入重量”);w=double.Parse(Console.ReadLine()if(w 50,/不能写成:50w=100,3else if语句else if语句是if语句和ifelse语句的组合,其一般形式如下:if(表达式1)语句1;else if(表
11、达式2)语句2;else if(表达式n-1)语句n-1;else 语句n;,例:编写一个实现如下函数值的程序-1,x0,using System;class Test static void Main()Console.Write(“请输入x的值:);double x=double.Parse(Console.ReadLine();int y;if(x0)y=1;else if(x=0)y=0;else y=-1;Console.WrteLine(“Y=0“,y);,【案例7】计算运费 在进行货物托运时,按货物重量的不同有不同的计费方式,其计费公式如下:,其中,n为货物重量(单位为公斤),y
12、为应付的运费(单位为元/公斤)。本案例中将实现对运费的计算,效果如图2-2-13所示。在本例的实现过程中,将学习使用switch语句的应用。案例的实现方法如下。1创建项目 2界面设计 3代码编辑(1)算法流程分析(2)算法代码实现,4.3.3 分支语句格式:switch(表达式)case 常量表达式1:语句1;break;case 常量表达式2:语句2;break;default:语句n;break;,注意:C#要求每个case后使用break语句或跳转语句goto。所有常量表达式的值不能相同。,编程:查询学生姓名,输入一个字符,如输入“k”时,显示Kate;输入“m”时,显示Mary;输入“
13、r”时,显示Rose;输入“T”时,显示Tom;输入其他字符时,显示Other Students。,Console.Write(“Enter a character:);char Name=(char)Console.Read();switch(Name)case k:Console.WriteLine(Kate.);break;case m:Console.WriteLine(Mary.);break;case r:Console.WriteLine(Rose.);break;case T:Console.WriteLine(Tom.);break;default:Console.Write
14、Line(Other students.);break;,例:using System;class Demo public static void Main()Console.Write(enter i=);int i=int.Parse(Console.ReadLine();switch(i)case 1:case 2:case 3:Console.WriteLine(“i is 1,2 or 3.);break;case 4:Console.WriteLine(i is 4.);break;,注意:在C#中,两个或更多的case语句可以共用同一程序代码:,4.4 循环结构 循环是指在指定的
15、条件下多次重复执行一组语句。被重复执行的一组语句称为循环体。采用循环结构可以解决一些按一定规则重复执行的问题。例如,统计一个班几十名学生,甚至全校几千名学生的学期成绩,如求平均分、不及格人数等。4.4.1 循环结构的概念 循环结构按其循环体是否嵌套从属的子循环结构,可分为单循环结构和多重循环结构。,【案例8】成绩统计 本例将编写一个控制台程序,程序运行时提示输入学生成绩,能够对多个学生的成绩进行统计分析,计算各个等级的人数。程序效果如图2-3-2所示。,图2-3-2 成绩统计,在本例的实现过程中,将学习While循环语句的应用。1创建项目 2代码编辑(1)算法流程分析(2)算法代码实现,4.4
16、.2 while语句和dowhile语句1while语句语法格式:while(条件表达式)循环体,using System;class Sumw static void Main()int n=1;while(n6)Console.WriteLine(“n=0”,n);n+;,例:写出下列程序的运行结果。,结果:,例:使用while语句,编程计算1+2+1000。,using System;class Sumw static void Main()int i=1,sum=0;while(i=1000)sum+=i;i+;Console.WriteLine(“1+2+1000=0”,sum);,
17、思考与练习(1)如果要实现 sum=1+2+3+10,怎样修改程序?(2)如果要实现 sum=30+31+32+50,怎样修改程序?,while(i=10),int i=30;While(i=50),using System;class Value static void Main()int i=10;long x=1;while(i0)x*=i;i-;Console.WriteLine(“10!=0”,x);,例:使用while语句,编程计算10的阶乘值。,1.下列程序所计算的数学式是()int a=0,i=2;while(i100)a+=i;i+=2;A.a=1+2+4+98 B.a=1+
18、2+4+100 C.a=2+4+6+98 D.a=2+4+6+100,练习:,例:写出下列程序的运行结果。using System;class example static void Main()int i=1,j,s=0;while(i=3)j=1;while(j=2)s+;j+;i+;Console.WriteLine(“s=0”,s);,循环语句允许嵌套,即while语句里面还可以再套while语句。,1.以下程序段的循环次数为()int i=0,j=0;while(i3)while(j2)j+;i+;,练习:,2do-while语句 语法格式:do 循环体;while(条件表达式);,
19、dowhile执行过程 while执行过程,例:写出下列程序的运行结果。using System;class TestDoWhile static void Main()int x,y=0;do x=y+;Console.WriteLine(x);while(y5);,结果:,using System;class EvenSum static void Main()int i=5,esum=0;do esum+=5;i+=5;while(i=100);Console.WriteLine(esum=0,esum);,例:编程利用do-while语句实现100以内的能被5整除的数累加。,using
20、 System;class Sum static void Main()int i=1,j;long m,sum=0;do m=1;j=1;do m*=j;j+;while(j=i);sum+=m;i+;while(i=10);Console.WriteLine(“1!+2!+10!=0”,sum);,例:使用do-while语句,编程计算1!+2!+10!。,练习:1.while语句循环结构和do.while语句循环结构的区别在于()Awhile语句的执行效率较高Bdo.while语句编写程序较复杂C无论条件是否成立,while语句都要执行一次循环体Ddo.while循环是先执行循环体,后判
21、断条件表达式是否成 立,而while语句是先判断条件表达式,再决定是否执行循环 体,【案例9】乘法表 本案例中将编写一个控制台程序,通过程序中的循环打印出一个乘法表,如图2-3-4所示。,图2-3-4 乘法表,在本例的实现过程中,将学习for循环的应用。1创建项目 2代码编辑(1)算法流程分析(2)算法代码实现,【案例10】素数 本案例中将编写一个控制台程序,计算指定范围内的所有素数,效果如图2-3-6所示。,图2-3-6 素数,在本例的实现过程中,将学习for循环语句和流程转向语句的应用。1创建项目 2代码编辑(1)算法流程分析(2)算法代码实现,4.4.3 for语句和foreach语句
22、1for语句 语法格式:for(表达式1;表达式2;表达式3)循环体;执行过程:(1)首先计算表达式1的值(2)判断表达式2的值是true还是false,若表达式2的值为false,则转而执行步骤(4),若表达式的值是true,则执行循环体中的语句,然后求表达式3的值(3)转回步骤2(4)结束循环,执行程序的下一条语句,例:使用for循环语句,编程输出120的每个奇数的平方。,using System;class square static void Main()int s;for(int i=1;i20;i+=2)s=i*i;Console.Write(0t,s);,结果:,for语句的几点
23、说明:(1)如果对循环变量在for语句前已赋初值,则在for语句中可省略表达式1,但要保留其后的分号。.int i=1;for(;i=20;i+).,(2)for语句可以省略表达式2,即不判断表达式条件是否成立,循环将一直进行下去,但应保留表达式2后面的分号。此时,需要在循环体中添加跳出循环的控制语句。例:for(int i=1;i+)s=i*i;Console.WriteLine(0t,s);if(i=10)break;,(3)for中可以省略表达式3。此时应在循环体中添加改变循环变量值的语句,以结束循环。例:for(int i=1;i=10;)s=i*i;Console.WriteLine
24、(0t,s);i+;,(3)for语句中的3个表达式可同时省略。int i=1;for(;)s=i*i;Console.WriteLine(0t,s);i+;if(i=10)break;,using System;class Test static void Main()int i=1;long m=1;for(i=1;i=10;i+)m*=i;Console.WriteLine(0!=1,i-1,m);,编程:用for语句输出10!的值:,结果:,for循环语句也可以嵌套。例:利用for循环嵌套语句,求1!+2!+3!+.+10!的和。,using System;class MultiSum
25、 static void Main()long s=0,m=1;for(int i=1;i=10;i+)m=1;for(int j=1;j=i;j+)m*=j;s=s+m;Console.WriteLine(1!+2!+3!+.+10!=0,s);,结果:,2foreach语句 foreach语句用于列举集合中的每一个元素,并且通过执行循环体对每一个元素进行操作。foreach语句只能对集合中的元素进行循环操作。foreach语句的一般语法格式如下:foreach(数据类型 标识符 in 表达式)循环体,using System;class Test static void Main()dou
26、ble Array=16,12,31,8,21;int intArray=1,2,3;foreach(int i in intArray)Console.WriteLine(Arrayi);,例:写出下列程序段的结果:,结果:,练习:1以下程序段的循环次数为()int a=new int 1,2,3,4,5;foreach(int i in a)Console.WriteLine(t);A0 B4 C5 D62.以下程序运行后,变量a的值为()int a=100;for(int j=10;j0;j-=2)a-=j*3;A100 B16 C13 D10,4.4.4 跳转语句 在C#中还可以用跳转
27、语句来改变程序的执行顺序。1break语句 在switch语句中,break用来使程序流程跳出switch语句,继续执行switch后面的语句;在循环语句中,break用来从当前所在的循环内跳出。语法格式:break;,using System;class Prime static void Main()Console.Write(输入n的值:);int i=1,n;n=int.Parse(Console.ReadLine();while(+in)if(n%i=0)Console.WriteLine(0不是素数,n);break;if(i=n)Console.WriteLine(0是素数,n)
28、;,编程:任意给定一个整数n,判定其是否为素数(即只能被1和自身整除)。,2.continue语句 continue语句用于循环语句中。continue语句并不是跳出当前的循环,它只是终止一次循环,接着进行下一次循环是否执行的判定。语法格式:continue;,1.int x=0,y=0;2.for(int i=1;i10;i+)do Console.Write(i+“”);if(i%2=0)x=x+1;continue;if(x%2!=0)Console.WriteLine();continue;y=y+1;while(x=10);Console.WriteLine(“y=0”,y);,写出
29、下列程序段的运行结果:,结果:,结果:,using System;class Output public static void Main()for(int j=1;j=100;j+)if(j%7!=0)continue;Console.Write(“0t”,j);,用continue语句编程:输出100以内所有能被7整除的数。,3goto语句 C#中,goto语句是无条件跳转语句。当程序流程遇到goto语句时,就跳到它指定的位置。操作时,goto需要一个标签,标签是后跟冒号(:)的合法的C#标识符,标签放在goto语句要跳转到的那一条语句的前面。例如:end:a=i+8 语法格式:goto
30、标签;例:goto end;标签必须和goto用在同一个方法中。,例:using System;class Test static void Main()goto H;W:Console.WriteLine(“world”);goto X;H:Console.Write(“world”);goto W;X:Console.WriteLine(“Good bye!”);,注意:goto语句这种无条件跳转程序执行流程的功 能,破坏了程序的可读行,在现在的程序设 计中,已不提倡使用goto语句。,异常:就是程序运行时发生的错误或某种意想不到的状态。如溢出、被零除、数组下标超出界限以及内存不够等。通过
31、使用C#异常处理系统就可以处理这些错误。C#为常见的程序错误定义了许多标准的异常,如除0错误(divide-by-zero)、访问越界(index-out-of-range)等。例如:当企图除以0(即除数是0)时,就会产生一个DivideByZeroException异常。,4.5.1 异常处理的概念,4.5 异常处理,C#通常在两种情况下产生异常:(1)在C#语句和表达式的处理过程中激发了某个异常的 条件,使得操作无法正常结束,引发异常。(2)throw语句抛出异常。,例如:当企图除以0(即除数是0)时,就会产生一个DivideByZeroException异常。,using System;
32、class NotHandled static void Main()int a=0,b=5;Console.WriteLine(Before exception is generated.);/产生除0异常 b=b/a;,当程序有异常发生时,C#运行系统会捕获到它,这时C#运行系统报告错误,并结束程序。例如:using System;class NotHandled public static void Main()int nums=new int4;Console.WriteLine(“Before exception is generated.”);/产生数组越界访问异常 nums 7=
33、10;当发生数组越界错误时,程序停止执行,并显示如下错误信息:,捕获异常并处理的好处是不用把那些令人讨厌的系统默认的异常消息提示给用户,而且能使产生异常的应用程序能够继续执行。在C#中用四个关键字:try、catch、throw、finally来管理C#异常处理。,4.5.2 异常的处理,使用try和catch语句来捕获异常 异常处理的核心是try和catch。但这两个关键字得配合使用,不可以单独用 catch。当try中的一个异常被抛出时,它被相应的catch语句捕获,该语句然后处理异常。,例如:using System;class ExcDemo1 public static void M
34、ain()int nums=new int4;try Console.WriteLine(Before exception is generated.);/产生数组越界访问异常 nums 7=10;Console.WriteLine(this wont be displayed);catch Console.WriteLine(Index out-of-bounds!);Console.WriteLine(After catch statement.);,使用不带参数的catch语句可以捕获所有的异常。,异常处理的几个关键问题:首先,把想要监视错误的代码包含在一个try块中。其次,发生异常时,
35、异常就会被抛出try块,并会被catch语句捕获。程序流程自动从try块中退出并转到catch语句那里执行。执行完catch语句后,程序就会继续执行跟在catch后的语句。异常处理程序的任务就是要补救发生异常的程序,以使程序得以正常运行下去。注意:如果在try块中没有异常发生,那么将会忽略所有的catch语句,程序会从catch语句之后继续执行。,int numer=4,8,16,32,64,128;int denom=2,0,4,4,0,8;for(int i=0;inumer.Length;i+)try Console.WriteLine(numeri+/+denomi+“is+numer
36、i/denomi);catch Console.WriteLine(Cant divide by Zero!);,使用异常处理的一个主要好处就是,它使程序能响应错误并继续执行。,程序的运行结果如下:,使用throw语句可以人为抛出异常。格式:throw 异常对象 说明:throw是无条件、即时地抛出异常。,2.使用throw语句抛出异常,使用finally语句可以构成tryfinally 或 trycatchfinally的形式。当与try块一起 使用时,不管是否发生了异常,都将执行 finally块中的语句。,3.使用finally语句,给出下列程序的运行结果。try throw new Exception(“G”);catch(Exception e)Console.WriteLine(Exception in Main:+e.Message);finally Console.WriteLine(Executing finally block.);,程序的运行结果,由以上的例子可见,异常的处理过程通常为:捕捉、消除、继续执行程序。,本章作业:1.习题4的1、2、3。,实验报告:实验三,