




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章 循环目标: 能够构造符合语法的、正确的while循环 能够用while 语句构造计数控制循环 能够用while语句构造事件控制循环 22 能够使用文件结束条件控制数据输入 能够使用标志控制一个while语句的执行 能够用while语句构造一个计数循环 能够用while语句构造一个求和循环 能够为所给的问题选择正确的循环类型 能够构造嵌套while循环 能够选择数据设置,测试一个综合地循环程序 循环:引起一条语句或成组的语句重复执行的控制结构。只要一个条件或条件设置被满足,循环就一遍又一遍地执行同样的语句(简单的或复合的语句)。 在这章中,我们讨论不同种类的循环和如何用while语句构造循环。我们也讨论嵌套循环(包含另一个循环的循环) 6.1 while语句while 语句,像If语句一样要测试一个条件,这里是while语句的语法模板。这是一个例子:while ( inputval != 25 )cin inputval ;while语句是一个循环控制结构,通过循环每次都执行的语句被称为循环体。在上面例子中,循环体是输入语句,读入一个值到变量inputval中。这个while 语句是说,只要输入值不是等于25,重复执行循环体,当inputval变量的值等于25,while 语句循环完成(因此,循环停止)。然而,这个循环的效果是销毁和忽略所有输入流中的值,直到数据25被读到为止。 正像If语句中的条件一样,在while语句中条件可以是任何简单数据类型的表达式。几乎条件总是一个逻辑(布尔)表达式,如果不是,它的值强制为布尔类型(回想一下,零值是强制为false,并且任何非零值被强制为true),while语句的表述是:“如果表达式的值是true,执行循环体,然后回过来再测试表达式。如果表达式的值是false,跳过循环体。”只要被测试的表达式是true,就一遍又一遍的执行循环体。当表达式是false,程序跳过循环体并继续执行紧跟着循环后面的语句,当然,如果表达式开始就是false,循环体甚至一次也不执行。图6-1显示了while语句的控制流程,这里statement1是循环体和statement2是紧跟着循环后面的语句一个循环体可以是复合语句(块),这允许我们重复执行任何语句组。大多数情况下,我们常使用以下形式的while循环:while(表达式)在这个结构中,如果表达式是true,在块中的全部系列语句被执行,然后表达式再次被检测,如果它仍是true,块语句再次被执行,循环一直继续到表达式成为false为止。 6.2 循环执行阶段循环体执行的几个阶段: 循环进入:控制流程达到在循环体内第一条语句的位置。 重复:独立贯穿执行循环体一趟。 循环测试:求表达式的值决定是开始一个新重复还是立即跳过循环体语句接着循环语句后面的语句继续执行的地方。 循环退出:循环体的重复结束并且控制转向循环后面的第一条语句的地方。 中止条件:引起循环结束条件。就while循环来说,结束条件是while表达式成为false。注意循环退出仅出现在一种地方:当循环测试被执行时,即使结束条件也许在循环执行过程中被满足,但在计算机再次检查while表达式之前,当前重复仍被执行。6.3 使用while语句构成循环在解决问题中,你将会遇到两个主要循环类型:计数控制循环,这种循环重复执行指定的次数;事件控制循环,重复执行循环体直到循环内某件事情发生为止。计数控制循环计数控制循环在循环测试中,使用一个我们称之为“循环控制变量”。在我们进入计数控制循环之前,我们必须初始化(设置初始值)循环控制变量,那后对它进行测试,再把循环控制变量作为每次重复的循环的部分,我们必须对循环控制变量加1。这是一个例子: loopCout =1 ; /初始化while (loopCout = 10) /测试 /重复活动loopCout + ; /循环控制变量加1这里,loopCout是循环控制变量,在循环进入之前,它被设置为1。while语句测试表达式loopCout month day ; /得到一个数据初始读值while (!(month = =2 & day = =31) / 对它(2月31日)进行处理cin month day ; / 得到下一个数据这个代码段在进入循环之前首先读入两个数据(我们把这称为初始读值),如果不是标记值,它得到处理。在循环的末尾下一个数据被读入,并且我们返回到循环的开始。如果新读入的数据不是标记值,它像第一个那样得到处理;当标记值被读到,while表达式成为false并且循环退出(不处理标记值)。常常问题指挥着标记的值。例如,如果问题不允许有数据值0,那么标记值应设置为0,当你处理字符数据时,一次输入一行,新行字符(/n)常被作为标记。这里是一个读入和打印一个输入行所有字符的代码段(inChar 是 char 类型):cin.get (inChar) ; / 得到第一个字符while ( inChar != /n )cout dataValue sentinel ;while ( sentinel = 1) / 错误操作符cin dataValue sentinel ;这个错误产生一个无休止的循环,while表达式现在是一个赋值表达式,不是一个关系表达式。表达式的值是1(由于它是非零值,在循环测试中解释为1)并且它的负影响是存储值1到标记中,取代刚刚被输入到变量中的值。由于while表达式始终是true,循环决不会终止。文件结束控制循环:在一个程序从一个输入文件读入最后数据段后,计算机是在文件的结尾(简称为EOF),在这个时刻,输入流状态是正确的。但是如果我们再多输入即使是多一个数据的值,输入流转向失败状态。我们可以利用这个有利的事实。为了写一个输入不知数据项数目的循环,我们可以使用输入流的失败状态作为一个标记的形式。在第5章中,我们描述了如何测试一个I/O流的状态,在一个逻辑表达式中,我们使用流名就好像使用一个布尔变量一样。if (inFile)在这样的一个测试中,如果最近的I/O操作是成功的,结果为true,如果失败结果为false。在while语句中,测试流的状态用相同的方法。假如我们有一个包含整数值的数据文件,如果在我们的程序中,inDate是文件流的名字, 这里是一个读入和回显文件中所有数据值的循环:inData intVal ; / 得到第一个值while (inData) / 当输入成功cout intVal intVal ; / 得到下一个值让我们跟踪这个代码,假设在文件中有三个值:10,20和30,初始读到输入值是10,由于输入成功,while条件为true,因此计算机执行循环体,首先循环体打印出值10,然后输入第2个数据值20,循环反回到循环测试位置,由于输入成功,表达式inData是true,循环体再次被执行,打印值20并从文件中读入值30,循环返回到测试位置,表达式是true,即使读入的数是在文件的结尾,流状态仍然是OK因为前面的输入操作是成功的,循环体执行第3次,打印值30,并执行输入语句,这次输入语句读失败,因为我们试图读文件结尾以外的数据,输入流inData进入失败状态,循环返回到循环测试位置,表达式的值是false,程序退出循环。当我们写像上面一样的EOF控制循环时,我们希望文件的结尾是流失败的结果,但是记住任何输入错误都会引起流失败。例如,上面循环中断是由于输入数据中无效字符的输入引起的。这个事实再一次强调了回打印的重要性,它帮助我们证实在遇到EOF之前,所有读入的数据都是正确的。特征控制循环:一个特征值是用来控制一个程序逻辑流的布尔变量。我们在while循环之前设置一个值为true布尔变量,然后,当我们想要停止执行循环,我们重新设置它为false,即,我们可以使用布尔变量来记录控制过程的事件是否会出现。例如,下列代码段读入数据并求它们的和值,直到输入值是负数为止:sum = 0 ;nonnegative = true ; / 初始特征值while ( nonnegative )cin number ;if ( number 0 ) / 测试输入值nonNegative = false ; / 如果事件出现,设置特征值为false elsesum = sum + number ; 注意,我们可以用特征值编写标志控制循环,事实上,这个代码使用一个负值作为标志。 循环子任务我们已经看到了使用循环来影响程序中控制流程的方法。但是循环自身不做什么事情,为了循环完成某些事情,循环体必须有序执行一项工作,在这部分,我们看三项工作计数、求和、记录前面的值经常在循环中使用。计数:循环中一项通常的工作是记录执行循环的次数。例如,下列程序段读入并计数输入的字符直到出现一个句号为止。(inChar 具有char类型;count具有int 类型),这个例子中的循环有一个计数变量,由于变量不被作为一个循环控制变量,所以循环不是一个计数控制循环。count = 0 ; /初始化计数器cin.get ( inchar ) ; /读第一个字符while (inchar != .) count + ; /计数器增值cin.get (inchar ) ; /得到下一个字符在循环结束后,count包含数据比读入的字符数少,即它计数字符数目直至标记值(句号),但不包含句号标记值。注意如果句号是第一个字符,不进入循环体并且count包含一个0值作为它应有的值。由于循环是标记控制,这里我们要使用一个初始读数。在这个例子中的计数器变量被称为重复计数器,因为它的值等于通过循环的重复次数。按照我们的定义,计数控制循环的循环控制变量是一个重复计数器,可是,像你看到那样,不是所有重复计数器都是循环控制变量。求和:另一个通常的循环工作是求一组数据值的和。注意在下列的例子中,不管如何控制循环,同样的方法写求和操作。sum = 0 ; / 对sum初始化count =1 ; while (count number ; / 输入一个值sum = sum + number ; / 增加值到sum中count + + ;在循环开始之前,我们对sum初始化值为0,以便第1次执行循环体,语句sum = sum + number ;增加当前sum (0) 的值到number上形成新的sum值,在全部代码段执行完后,sum包含了10个读入值的总和,count包含11,并且number包含的是最后读入的值。 记录以前的值:有时我们想要记住变量以前的值。假如我们要在一个包含C+程序的文件中,写一个计数不等号的程序。我们可以简单地做这样:计数在输入数据中,一个感叹号(!)后面紧跟者出现一个等号(=)的次数。这样做的一种方法是,一次从输入文件中读一个字符,记录两个最近的值,当前值和前一个值。每次重复循环,读新的当前值并且旧的当前值成为前一个值。当读到EOF时,循环结束。这里是一个以这种方法编写的计数不等号的循环。count = 0 ; / 初始化counterinFile.get (prerChar ) ; / 初始化前一个值inFile.get (currChar ) ; / 初始化当前值while (inFile) / 当输入成功if (currChar = = = & prevChar = =! / 测试事件count + ; / 计数增加prevChar = currChar ; / 用当前值取代前一个值inFile.get (currchar) ; /得到下一个值cout count ! =operators ware found. endl ;在这个例子中的计数器是一个事件计数器,它被初始化为0,并且仅在当某种事件出现时,计数器增加值(加1)。前面例子中的计数器是重复计数器,它被初始化为1并且在每次循环期间增加值。 6.4 如何设计循环我们可以将设计过程分为两部分工作:设计控制流程和设计循环过程。我们把每项工作分成三个阶段:工作自身,初始化,更新。当程序退出循环时,指出程序的状态同样是重要的。在设计一个循环中,有七个不同点要考虑1、 循环结束的条件是什么?2、 条件应该如何初始化?3、 条件应该如何被更新?4、 重复的过程是什么?5、 过程应该如何初始化?6、 过程应该如何被更新?7、 退出循环程序的状态怎么?我们利用这些问题作为一个检查表,前三个问题帮助我们设计控制程序的执行(设计控制流)部分,接下来三个问题帮助我们设计循环(设计循环过程)内的过程,最后问题留给我们确定以一种合适的方法退出循环。设计控制流程在循环设计中最重要的步骤是:决定什么事情应该使得循环停止。如果中止条件想的不好,就会有潜在的无休止循环和其它的错误。所以这是我们的第一个问题。 循环结束的条件是什么?这个问题通常是通过检查问题语句来回答。下列表列出一些例子 现在我们准备回答下面2个问题 条件应该如何初始化? 条件应该如何更新?回答取决于终止条件的类型。对于计数控制循环,使用一个重复计数器,下面是对问题的回答: 初始化重复计数器为1 。 在每次重复的结尾增加重复计数器的值 。当循环使用一个事件计数器时,下面是对问题的回答: 初始化事件计数器为0。 每次事件出现时,增加事件计数器的值。对于标记-控制循环,我们以下面方法回答我们的问题: 如果需要的话打开文件,并在进入循环之前输入一个值(最初的读数)。 在每次重复的结尾,为过程输入一个新的值。EOF-控制循环需要与标记控制循环一样的初始化,更新循环条件意味着循环必须保持正在读的数据。对于特征控制循环回答我们的问题如下: 初始化特征变量为一合适的true或false。 只要条件一改变,就更新特征变量。由于更新取决于过程做什么,有时候,在我们可以决定如何更新条件之前,我们必须设计过程。 在循环内设计过程接下来,我们详细填入过程。在设计过程中,我们首先必须决定我们希望做一个什么重复。 要重复的过程是什么?为了回答这个问题,我们必须从另一个角度条件语句,问题的定义也许需要过程概括数据值或保持满足某种测试的数据值的次数,例如:计算文件howMany 中整数的数目这个语句告诉我们这个过程是一个计数操作的重复。现在我们可以为这个要正确重复的问题设计所需要的过程部分。我们增加几步来考虑循环执行多于一次的情况。这部分典型的设计包括:在循环之前初始化某些变量,然后在每次后续的重复之前重新初始化或更新这些变量。 循环过程如何初始化? 循环过程如何更新?例如,如果循环内的过程需要完成几个不同的计数合求和操作,那么每个计数和求和操作都必须有自己的语句来对变量进行初始化、对计数变量增加值、或将值加到和中。也就是说,必须有只涉及每个自身的计数和求和操作,首先是写初始化语句,然后写计数或求和语句。在你为一项操作做完这些后,继续下一项操作。 循环退出现在我们必须考虑我们设计的结果并仔细检查它的妥当性。 退出循环时程序的状态是什么?例如,假设我们已使用一个事件计数器,且后面的处理取决于事件数,确定计数器中剩下的值恰是事件数是重要的。事件数目不是以1结束。设计正确的循环根多地取决于的经验,就像它在设计方法应用中做的一样。在这点上,你也许想在本章结尾通过读编程例子来看看循环设计过程如何应用到一个实际问题上。6.5 嵌套逻辑While和if语句都可包含它们自身的语句,所以一个While语句的循环体或If语句的分支都可以包含另一个While语句和If语句,用嵌套我们可以建立复杂的控制结构。假如我们想计数一行输入数据中逗号的数目,对一个文件中所有行重复它,我们在一个标记控制循环外围设置一个EOF控制循环。cin.get (inChar) ; / 初始化外部循环while (c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 爆破与安全试题及答案
- 保温工考试试题及答案
- 安全师试题及答案
- 物联网设备安全漏洞检测与防护策略在智能交通信号控制系统中的实战解析报告
- 2025年快时尚零售行业供应链优化与变革分析报告
- 安全教育考试试题及答案
- 安全规程考试试题及答案
- 职业教育未来趋势:2025年职业院校与企业深度合作研究报告
- 2025年医院信息化建设关键环节:电子病历系统医疗信息化战略规划报告
- 大学生膳食营养与健康
- 2025年全国低压电工作业证(复审)考试练习题库(600题)附答案
- 2025漳浦县国企招聘考试题目及答案
- 知识产权相关的国际法的试题及答案
- 钢结构墙板拆除施工方案
- 软件开发文档-电子政务云服务平台系统招标文件范本
- 2025年养老护理员专业知识测试卷:养老护理员护理技能操作试题集
- PET考试培训课件
- 无人机飞手培训班合作合同协议范本模板
- 2025年燃气安全生产管理人员模拟考试题库试卷
- 2024-2025学北京房山区初一语文(下)期末试卷附答案解析
- VDA6.3-2023版培训教材课件
评论
0/150
提交评论