《C#程序设计教程.ppt》由会员分享,可在线阅读,更多相关《C#程序设计教程.ppt(46页珍藏版)》请在课桌文档上搜索。
1、第3章 控制流程,C#程序设计教程,C#程序设计教程,书名:C#程序设计教程书号:978-7-111-56027-2作者:倪步喜 主编出版社:机械工业出版社,第3章 控制流程,3.1 分支结构1.if语句2.单步调试3.switch语句3.2 循环结构1.while循环语句2.一维数组初步3.break和continue语句4.dowhile循环语句5.for循环语句3.3 巩固训练3.4 穷举法3.5 本章小结,3.1 分支结构if语句,(1)单分支if语句语法如下:if(条件)语句序列说明:只有条件成立,语句序列才被执行;条件如果“语句序列”只有一条语句,“”可以省略。若是不成立,那么语句
2、序列不被执行。例如:if(Score 100)Console.WriteLine(输入数据错误!);,3.1 分支结构if语句,【实例 3-1】从键盘输入两个整数,要求从小到大输出它们。,1 using System;2 class Program3 4 static void Main(string args)5 6 int a,b,t;7 Console.Write(a=);8 a=int.Parse(Console.ReadLine();9 Console.Write(b=);10 b=int.Parse(Console.ReadLine();11 if(a b)12 t=a;a=b;b
3、=t;/交换两变量的值13 Console.WriteLine(0 1,a,b);14 15,3.1 分支结构if语句,(2)二分支if语句语法如下:if(条件)语句序列1/当条件成立时执行else 语句序列2/当条件不成立时执行例如:if(Score 100|Score 0)return;/终止本方法的执行并将控制返回给调用方法else Console.WriteLine(数据正确);,3.1 分支结构if语句,【实例 3-2】从键盘输入一个整数,判断其是奇数还是偶数。1 using System;2 class Program3 4 static void Main(string args
4、)5 6 int n;7 Console.Write(n=);8 n=Convert.ToInt32(Console.ReadLine();9 if(0=n%2)10 Console.WriteLine(偶数);11 else12 Console.WriteLine(奇数);13 14,3.1 分支结构if语句,(3)多分支if语句即多选一if语句,语法格式如下:if(条件1)语句序列1/当满足条件1时执行,不再判断条件2,本if语句执行结束else if(条件2)语句序列2/否则,当满足条件2时执行,然后,本if语句执行结束else if(条件3)语句序列3/否则,当满足条件3 时执行/还可
5、以加任意个“else if(条件)语句序列”else 语句序列n+1/当所有条件都不满足时执行,3.1 分支结构if语句,【实例 3-3】检查输入字符是否是小写字符、大写字符或数字,如果都不是,则输出“输入字符不是字母字符,也不是数字”。,1 using System;2 class Program3 4 static void Main()5 6 Console.Write(输入一个字符:);7 char c=(char)Console.Read();8 if(char.IsUpper(c)9 10 Console.WriteLine(大写字母);11 12 else if(char.IsL
6、ower(c)13 14 Console.WriteLine(小写字母);15 16 else if(char.IsDigit(c)17 18 Console.WriteLine(数字);19 20 else21 22 Console.WriteLine(输入字符不是字母字符,也不是数字);23 24 25,3.1 分支结构单步调试,单步调试是最常见的调试方法之一。单步调试即一步一步跟踪程序执行的流程,在单步执行过程中,程序员可以监视变量值的变化,观察变量的值与预期的值是否一致,这样可以帮助发现程序中的逻辑错误。【实例 3-4】编写一个评价成绩的程序,成绩与评价之间关系如表所示。调试运行程序,
7、观察程序的单步执行过程,观察程序中相关变量的值。,3.1 分支结构单步调试,程序主要代码如下所示。6 static void Main(string args)7 8 double Score;9 Console.Write(请输入成绩:);10 Score=Convert.ToDouble(Console.ReadLine();11 if(Score 100)12 Console.WriteLine(输入数据错误!);13 else if(Score=0 22,3.1 分支结构单步调试,开始调试前,首先要准备好测试数据,做到心中有数,测试用例考虑了边界数据。,3.1 分支结构单步调试,单步调
8、试的执行过程因人而异,下面是本实例单步调试执行的一种情形。(1)按F10功能键,启动单步执行。此时,程序调试状态如图所示。图中黄色箭头于第7行处。黄色箭头指示将要执行的下一条语句。,3.1 分支结构单步调试,(2)再按一次F10,黄色箭头如图所示。程序执行跳过了“double Score;”语句,因为该语句用来声明变量,是非执行性语句。(3)再按两次F0功能键,单步执行第10行,程序要求从键盘读取数据,程序员此时在控制台窗口中输入测试数据-1并回车后,调试状态如下图所示。本步骤要注意,当黄色箭头在“ReadLine()”行上时,不能在控制台窗口上输入-1。因为此时还未执行第10行,读键盘功能的
9、“ReadLine()”方法尚未被执行。,3.1 分支结构单步调试,(4)在变量Score上右击,在弹出的快捷菜单中选择【添加监视】,便可以将Score变量添加到监视窗口,如图所示。监视图中所示的变量Score值为-1.0,类型为double,正和预期的一致。在监视窗口中,可以编辑变量的值,以察看新值下后续的执行过程,但此处不人为更改变量Score的值。(5)继续按一次F10功能键,执行状态如下图所示。第11行中的条件成立,即将执行第12行。,3.1 分支结构单步调试,(6)继续按一次F10功能键,下一个要执行的语句是“Console.ReadKey();”,执行状态如下图 所示。此时,多选一
10、if语句已经结束执行。(7)继续按F10功能键,单步执行后续过程。,3.1 分支结构单步调试,在单步执行过程中,还可以进行其他的操作,常见的操作说明如下:1)按F11功能键,逐语句执行。它与F10功能键的区别是会进入到自定义方法内部去执行。在调试本实例时,F10与F11没有区别。2)按Shift+F11组合键,跳出由F11进入的方法。3)按F9功能键,在光标所在行设置或取消断点,调试运行时,会在断点处暂停运行。4)按F5功能键,连续调试运行,但会在断点处暂停。5)按Shift+F5组合键,停止调试。6)按Ctrl+F10组合键,运行到光标处。但事先选择的光标位置很关键,若光标处于一个不可能到达
11、的分支上时,执行过程不会暂停于光标处,而会继续执行。7)拖动黄色箭头,更改下一步要执行的语句。但是,这可能导致预料不到的运行结果。8)选择【调试】|【快速监视】命令,在打开的快捷监视对话框中监视一个表达式的值。如图 所示,图中监视一个逻辑表达式的值,其值为true。,3.1 分支结构switch语句,1)switch语句格式当一个表达式有多个取值情形时,可以用switch语句测试表达式的值等于何种情形的值。switch语句的语法如下:switch(表达式)case 可能性的值1:语句序列1 break;case 可能性的值2:语句序列2 break;/还可以加任意个类似上方的case段 def
12、ault:语句序列n+1 break;,3.1 分支结构switch语句,1)switch语句格式在使用switch语句时,必须要注意以下几方面的规定:(1)表达式的类型可以是sbyte、byte、short、ushort、uint、long、ulong、char、bool、string或枚举类型。(2)每个case中的常量表达式必须属于或能隐式转换成(1)中所指类型。(3)如果有两个或两个以上的case标签中的常量表达式相同,编译时将会报错。2)switch语句执行过程当执行switch语句时,先计算表达式的值,然后将表达式的值与case 后面“可能性的值”逐个匹配,如果与某个“可能性的值”
13、匹配成功,则进入相对应的case 代码段执行,如果匹配都不成功,则进入default部分执行。当执行到break 语句时,就终止执行当前的switch语句。【实例 3 5】将实例3_4用switch语句实现。,3.2 循环结构,1.while循环语句2.一维数组初步3.break和continue语句4.dowhile循环语句5.for循环语句,1.while循环语句,while 循环的语法:while(条件)语句块只要给定的条件为真,while循环语句会重复执行语句块。语句块中必须要有改变条件的措施与方法,使最终能从循环执行中退出来。【实例 3-6】编程求1+2+3+100的和。分析:可以设
14、计一个100次的循环,每次循环把一个加数累计到和中。因此,可设计一个计数变量i来控制循环的退出。思路如下:i=1;/初值while(i=100)/终值/把i累加到和中,因为每次循环计数变量的值与表达式中的加数相同。i+;/这就是改变循环条件的措施。步长为1,1.while循环语句,本例代码如下:1 using System;2 class Program3 4 static void Main(string args)5 6 int i=1,s=0;7 while(i=100)8 9 s+=i;10 i+;11 12 Console.WriteLine(s=+s.ToString();13 1
15、4 说明:本例循环控制中,计数变量的初值为1,终值为100,每次循环计数变量的步长值为1。,2.一维数组初步,一维数组由包含若干相同类型的数组元素(简称元素)组成,这些元素可以通过索引进行访问。元素的个数称为数组的长度。数组中的每个元素都具有唯一的索引与其相对应,元素的索引从零开始。一维数组的数组元素的索引只有一个,所有数组元素可排成连续的一行或一列。数组变量是引用类型,System.Array类是所有数组的基类,该类有Length属性,表示数组长度。数组变量位于栈(stack)中,而它引用的数组(即数组实例)在堆(heap)中。数组实例需要使用new关键字来创建。,2.一维数组初步,1)声明
16、数组语法:类型 数组变量名;如:int candidates=new int3;上面定义了整型数组变量candidates,如图 3-9所示。它引用一个具有三个整型元素的数组,这三个元素是candidates0、candidates1、candidates2,它们在空间上是连续的,它们具有默认值0。现给第一个元素赋值,可采用如下语句:candidates0=1;,2.一维数组初步,1)声明数组再如:int arr1,arr2;arr1=new int 1,2,3;arr2=arr1;上面定义了两个整型数组变量,再让arr1引用一个有3个元素的数组实例,最后让arr2也引用相同的数组实例。,2.
17、一维数组初步,2)初始化数组初始化数组指的是为数组变量指定一个数组实例,并为数组实例中的数组元素指定初始值。数组是一个引用类型,所以需要使用new关键字来创建数组的实例。例如:int scores=new int45;/声明数组变量scores,并初始化,元素默认值为0string names=new string10;/声明数组变量names,并初始化,元素默认值为nullint numbers=new int 1,2,3,4,5,6;/中为元素的初始值,元素个数确定了数组长度,可访问的元素为numbers0 numbers5。,2.一维数组初步,【实例 3-7】输出十个两位随机整数。主要代
18、码如下所示。6 static void Main(string args)7 8 int i;9 System.Random random=new Random();10 int numbers=new int10;11 i=0;12 while(i numbers.Length)13 14 numbersi=random.Next(10,100);15 Console.Write(0,4,numbersi);16 i+;17 18 Console.ReadKey();19,代码分析:第9行,System.Random类对象用于产生随机数字。第10行,声明整型数组变量numbers,它引用一个
19、具有10个整型元素的数组。第12行,Length是数组变量的一个属性,表示数组长度。第14行,Random对象的Next方法产生10,100)的整数。,3.break和continue语句,break语句用在switch语句中,其作用是终止当前switch语句的执行。break语句也可以用在循环语句中,其作用是终止当前的循环的执行,或者说,它使程序的执行跳出当前循环语句。continue语句仅用在循环语句中。其作用是跳过当前这次循环中的后续代码,强制开始下一次循环。对于while和do.while循环,continue语句会导致程序控制回到条件测试上。,3.break和continue语句,【
20、实例 3-8】分析如下代码的输出结果。4 static void Main(string args)5 6 int i=1;7 while(true)8 9 Console.Write(0,3,i);10 i+;11 if(i%5=0)12 13 i+;/略过5的倍数14 15 if(i 10)16 break;/超过10不输出17 else18 continue;19 20 Console.ReadKey();21,代码分析:变量i值从1开始输出,但遇到5的倍数时,i值增1,略过输出其值,但i值超过10时,终止循环。所以输出结果为:1 2 3 4 6 7 8 9。,4.dowhile循环语句
21、,1)dowhile循环语句语法:do语句块while(条件);初学者容易忘写上面语法中的分号。执行过程:do-while语句先执行循环体语句一次,再判别表达式的值,若为true,则继续循环,否则终止循环。,4.dowhile循环语句,【实例 3-9】给定一个正整数n,求它的二进制表示中1的个数。1 using System;2 namespace Example3_93 4 class Program5 6 static void Main(string args)7 8 int n,count=0;9 Console.Write(请输入一个正整数:);10 n=int.Parse(Cons
22、ole.ReadLine();11 do12 13 if(n%2)=1)14 count+;15 n/=2;16 while(n 0);17 Console.WriteLine(二进制表示中1的个数为0,count);18 19 20,5.for循环语句,1)for循环的语法如下:for(表达式1;表达式2;表达式3)语句块2)执行for语句的步骤为:(1)计算表达式1的值。(2)计算表达式2的值,若值为true,则执行语句块一次,否则终止循环。(3)计算表达式3的值,转回第(2)步重复执行。3)说明:(1)表达式1通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外。给循环变量赋
23、初值,此时可以省略该表达式。(2)表达式2通常是循环条件,一般为关系表达式或逻辑表达式。(3)表达式3通常可用来修改循环变量的值,一般是赋值语句。(4)在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次。语句块可能执行多次,也可能一次都不执行。,5.for循环语句,【实例 3-10】编程求1+2+3+100的和。1 using System;2 namespace Example3_103 4 class Program5 6 static void Main(string args)7 8 int i,s=0;9 for(i=1;i=100;i+)10 s+=i;1
24、1 Console.WriteLine(s=0,s);12 Console.ReadKey();13 14 15,5.for循环语句,【实例 3 11】编程判断从键盘输入的大于1的正整数n是否为素数。素数指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。最小的素数为2。分析:显然,这是一个循环作除法的问题。容易想到的是设置除数变量i,也作循环变量,取值从2到n-1,每次增1。但是,这里需要说明的是,i的终值取n即可(数学上证明可行),这样可以减少循环次数。程序代码如下:6 static void Main(string args)7 8 int n,intfinal,i
25、;9 Console.Write(输入一个大于1的正整数:);10 n=int.Parse(Console.ReadLine();11 intfinal=(int)(Math.Sqrt(n);12 i=2;13/for循环有两个出口14 for(;i intfinal)20 Console.WriteLine(0是素数,n);21 else22 Console.WriteLine(0不是素数,n);23,值得一提的是,类似本例,一个循环有多个出口时,经常在循环结束后作判断,以确定是哪种情形的退出循环,以便作出不同的处理的编程方法,初学者要仔细领会,熟练掌握。,5.for循环语句,【实例 3 1
26、2】编写一个为三位候选人统计选票的程序,三位候选人分别用代号1、2、3表示。输入数据1表示投1号候选人一票,输入2时,表示投2号候选人,输入3时,表示投3号候选人一票。输入1-3以外的数据视为废票。输入-999时,表示投票结束,时要输出各候选人的得票数、总票数及废票数。分析:通过问题描述可知,投票意味着输入数据,但投票的次数并不确定,投票进程用一个特殊的数据(-999)来控制,当输入的是的是-999时,投票的结束,接着就可以输出投票的结果。因此,这里的特殊数据-999可以看成是结束标志。所以,输入的数值数据有三类:结束标志、有效票、废票。下面逐步细化分析过程。(1)确定程序框架static v
27、oid Main(string args)/./循环输入数据/分结束标志和票号分别处理输入的数据/处理结束标志/识别并分类处理票/输出结果,5.for循环语句,(2)循环控制结构for(;)/永真/输入数据if(是-999吗?)break;/识别并分类处理票(3)识别并分类处理票switch(票号)case 1:/1号候选人票数加1 break;case 2:/2号候选人票数加1 break;case 3:/3号候选人票数加1 break;default:/累计废票 break;,3.3 巩固训练,1编程求1+2+3+.+n之和小于等于3478时最大的n值。思路分析:1)定义循环变量并赋初值1
28、。2)设置永真循环,循环执行如下操作:(1)累计求和。(2)判断和是否越界,越界则中止循环。(3)加数自增。3)输出结果。,3.3 巩固训练,2.有一堆100多个的零件,若三个三个数,剩两个;若五个五个数,剩三个;若七个七个数,剩五个。请你编一个程序计算出这堆零件至少是多少个?思路分析:零件数量为100多个,表明数量在100至200之间。三个三个数,剩二个,表明数量除以3的余数为2。当三个条件同时满足时,该数量就是所求的结果。因此可参考如下步骤加以实现。1)定义循环变量i。2)设置循环,让循环变量i从100取值至199,步长为1,循环执行操作:判断条件i%3=2&i%5=3&i%7=5是否成立
29、,若成立,则输出i。,3.3 巩固训练,3古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问20个月内,每个月的兔子数为多少?一行输出5个数。如图 3-11所示。,3.3 巩固训练,4.求e=1+1/1!+(1/2!)+(1/3!)+.+(1/n!)(1)直到第50项(2)直到最后一项小于 0.000001对(1)分析:设item表示表达式中的项,其初值为1.0;设e表示表达式的和,它的值是逐步累加的过程,其初值为item。后续再作49次循环:求得新项;新项加入到e中。参考步骤如下:1)声明变量item,并赋初值1.0。2)声
30、明变量e,并把item作为e的初值。3)声明循环变量n,并赋初值1。4)执行循环体(do-while循环语句):(1)求得新项值,即item/n赋给item。(2)新项值item加入到e中。(3)n计数。判断循环条件,当n50时,继续执行循环体。5)输出e的值。,3.3 巩固训练,5.请编写如图 3-12所示的菜单。当输入字符a后,输出一句话,表示用户选择的是添加操作,如图 3-13所示。当输入字符b后,输出一句话,表示用户选择的是浏览操作,如图 3-14所示。当输入a、b、c以外的字符时,输出一句话,表示用户选择错误,如图 3-15所示。当输入字符c时,则退出运行。,3.3 巩固训练,程序的
31、框架:static void Main(string args)while(true)1)采用Console.Clear()方法清除窗口字符。2)输出菜单和选择提示。3)接收输入,并转换小写字母。4)若输入为”c”,则退出。5)对选择a项、b项、非法选项分别作多选一处理,3.4 穷举法,穷举法的基本思想是根据问题的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本题无解。穷举法也称为枚举法。【实例 3 13】在公元五世纪我国数学家张丘建在其算经一书中提出了“百
32、鸡问题”:鸡翁一值钱5,鸡母一值钱3,鸡雏三值钱1。百钱买百鸡,问鸡翁、母、雏各几何?分析:百鸡问题的数学方程可列出如下:显然这是个不定方程组,适用于穷举法求解,即穷举Cock、Hen、Chick数量和为100的所有组合,每次都判断它们的总价值是否为100。,3.4 穷举法,【实例 3 14】张三说:李四在说谎。李四说:王五在说谎。王五说:张三和李四都在说谎。请问他们三个人到底谁在说谎?分析:(1)穷举三人所有取值情形用1表示真话,0表示假话。穷举方法如下:for(zs=0;zs=1;zs+)/张三取值情形 for(ls=0;ls=1;ls+)/李四取值情形 for(ww=0;ww=1;ww+
33、)/王五取值情形/判断处理zs、ls、ww的每一种取值组合情形,3.4 穷举法,分析:(2)判断处理取值组合zs、ls、ww取值组合如果同时满足张三情形、李四情形及王五情形,那么当前组合就是要找的一种组合。但是要注意,三人情形指的是说真话情形或者说假话情形。即这三个人都有可能说真话,也有可能说假话。比如张三,由问题描述可以得到:张三真话情形,即zs=1所以,zs、ls、ww取值组合同时满足问题描述的话,应该作如下判断:if(blzs&blls&blww)/输出结果,3.5 本章小结,本章主要介绍关于程序流程控制语句,即分支与循环语句。if分支语句有单分支结构、二选一结构以及多选一结构。switch语句也是多选一的分支结构,它的表达式的类型与if语句有很大不同。描述循环结构的语句有while语句、dowhile语句以及for语句,循环体中可有break语句和continue语句。循环结构要保证循环能够正常退出。不管什么语句,首先要理解语句的语法,还要掌握其执行过程,重要的是能熟练运用这些语句解决编程问题。本章还介绍了穷举法解决问题的一般思路。另外还初步介绍了数组。学习到本章时,程序流程变得灵活了许多,建议初学者要有信心,熟悉C#基础知识和语法,多读、多写程序。,