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