(转载)你好,C++(21)只要天还没黑,就一直在工地干活-4.3.1 while循环:只要…就一直…

你好,C++(21)只要天还没黑,就一直在工地干活-4.3.1 while循环:只要…就一直…

4.3  循环控制语句

在现实世界中,有这样一类现象:

只要油箱中的当前油量小于油箱容量100升,就一直往油箱中加油;

一直不断地为祖国辛勤工作,只要我还活着;

公司100000位员工,每个人的工资都增加10000元;

这些现象虽然各不相同,但它们都有一个共同的特点,那就是在某个条件(只要我还活着)下,或者某个范围(所有100000位员工)内,这些动作(辛勤工作、增加10000元工资)都是循环往复重复多次地出现。为了表达这类循环现象,C++提供了循环控制结构。又因为这些循环现象各有特点,为了准确而简便地表达它们,C++有针对性地分别提供了while、do…while…以及for语句。

4.3.1  while循环:只要…就一直…

对于上面的第一个循环现象,我们可以用“只要…就一直…”这样的句式来描述。在现实世界中,这种循环现象非常普遍:

只要天还没黑,就一直在工地干活;

只要硬盘还有剩余空间,就一直往硬盘上面存储文件。

在自然语言中,我们用“只要…就一直…”这样的句式来表达这种在某个条件下某个动作循环发生的循环现象,与之对应地,在C++中,我们用while循环结构来表达这种循环现象。其语法格式如下:

while( 条件表达式 )
{
    循环体语句;
}

在条件表达式中,我们对某个条件进行判断,得到表示条件成立与否的true或者false值,以此来表达这个循环是在“某个条件”下进行的。而while结构中的循环体语句,则表示会被循环执行的动作。例如,我们将“只要油箱中的当前油量小于油箱容量100升,就一直往油箱中加油”这个循环现象用while结构表达出来就是:

// 当前油量
int nL = 0;
// …
// 循环条件:当前油量小于油箱容积
while(nL < 100)
{
    nL += 1; // 循环动作:往油箱中加1升油
}

在执行的时候,while语句首先会计算条件表达式(nL < 100)的值,也就是判断循环条件(当前油量小于油箱容量100升)是否满足。如果其值为true,表示循环条件满足,则进入循环执行循环体语句,完成循环动作(往油箱中加1升油);反之,则表示循环条件不再满足,从而直接结束整个while语句的执行。当循环体语句执行完一次后,会再次计算条件表达式的值,判断循环条件是否仍然满足。如果满足,则继续进入循环执行循环体语句,开始第二次循环。如此不断循环往复,直到条件表达式的值为false,循环条件不再满足,整个循环才结束。可以把while理解成自然语言中的“只要”,只要循环条件满足,就不断执行循环体语句。当循环条件不再满足时,就结束while循环语句。while循环语句的执行流程如图4-3所示。

知道更多:单步调试执行程序,查看代码执行过程

while循环语句的执行过程,要比之前介绍的if条件语句复杂的多,再加上后面我们将要学到的break和continue对执行过程的控制,这样while循环语句的执行过程就更复杂了。稍不留意,就可能导致代码的实际执行过程与我们的设计不符,从而使程序执行得到错误结果。在这种情况下,我们可以利用Visual Studio所提供的单步调试运行功能,查看while循环语句真实的执行过程,从而找到与设计预期不符的地方,进而改正错误,使程序按照正确的过程执行得到正确的执行结果。

所谓的单步调试执行,就是在调试状态下,按照程序的执行流程逐条地依次执行每一条语句,而在这个过程中,我们可以清楚地看到程序的执行过程——哪一条语句先执行,哪一条语句后执行,哪一条语句被跳过而没有得到执行——以此判断代码的执行过程是否与设计预期相符。同时在这个过程中,我们还可以利用Visual Studio提供的“观察”、“变量”等工具窗口,查看各个变量的当前数值,以此判断执行结果是否与设计预期相符。如果执行过程或者执行结果与设计预期不符,那么这就意味着当前执行的代码可能是程序中出现问题的地方。当程序执行出现问题,也就是所谓出现bug的时候,我们通常用这种方式来寻找出现问题的代码位置进而对其进行修正,而这个过程也被称为debug。

要想使用单步调试执行来查看某段代码的执行过程,我们可以先将输入焦点定位在这段代码的开始位置,然后按下F9快捷键在当前代码行设置一个断点。所谓断点,就是在程序调试执行的过程中会暂停的代码位置。设置断点后,按下F5快捷键调试执行程序,当程序执行到之前设置的断点位置就会暂停下来,这时我们可以利用F10快捷键,按键一次就向下执行一条语句,从而可以看到整个代码的执行过程。利用这种方式,我们就可以查看while语句的执行过程,从而对while语句的执行过程有一个更深刻更直观的认识。

4.3.2  do…while循环:一直…只要…

前面介绍的while语句表达的“只要…就一直…”循环现象,是“先判断循环条件后执行循环动作”。然而在现实世界中,还有另外一类循环现象。例如:

一直不断地为祖国辛勤工作,只要我还活着;

一直接受用户输入数据,只要用户输入不为0 。

这类循环现象刚好与while语句表达的循环现象相反,总是先执行循环动作(工作、输入数据)后判断循环条件(还活着,输入不为0)。在自然语言中,我们可以用“一直…只要…”这样的句式来表达这种现象,刚好是”只要…就一直…”的倒置。与之对应地,在C++中,我们也将while语句倒置形成do…while…语句来表达这种循环现象。其语法格式如下:

do
{
    循环体语句;
}
while ( 条件表达式 );

在执行的时候,do…while循环语句首先会执行一次循环体语句,然后再利用条件表达式对循环条件进行判断。如果条件表达式的值为true,则意味着循环条件仍然满足,可以再次执行循环体语句,开始下一次循环;反之,则意味着循环条件不再满足,直接结束整个循环。do…while循环语句的执行流程如图4-4所示。

下面来看一个实际的例子。在生活中,精打细算的妈妈们总是喜欢统计每月的收支情况。用自然语言来描述这一统计过程就是:一直不断地输入收支数目并将其累加到收支总数,只要还有剩下的收支数目。在这里,“还有剩下的收支数目”是do…while…的循环条件,我们用输入的收支数目为0表示没有剩余数目,换而言之,循环条件成了“只要收支数目不为0”。而“输入收支数目并将其累加到收支总数”就是这个do…while…循环要反复执行的动作了。这是一个典型的“一直…只要…”循环现象,用do…while…循环结构将其表达出来就是:

// 每月收支统计程序
#include <iostream>
using namespace std;

int main()
{
    // 输出用户提示
    cout << "======每月收支统计程序======" << endl;
    cout << "请输入你本月的收入(正数)和支出(负数),0表示输入结束。" << endl;

    // 收支数目,这里的初始值不是必须的
    int nInput = 0;
    // 收支总数
    int nTotal = 0;
    // 第一次循环,无条件执行循环动作
    // 其后的循环,要在循环条件满足的情况下才能执行
    do
    {
          // 接受用户输入的收支数目并保存到nInput
          cin>>nInput;
           // 对收支进行统计,将其加和到收支总数nTotal
           nTotal += nInput;
    } while( 0 != nInput ) // 对循环条件进行判断,以决定是否进行下一次循环

    // 输出统计结果
    cout << "你本月的结余是:" << nTotal << endl;

    return 0;
}

在执行的时候,do…while…语句第一次会无条件地执行一次循环体语句,然后才执行条件判断“while( 0 != nInput )” ,判断收支数目nInput是否为0,也就是判断循环条件是否依然满足,以决定是否进入下一次循环。这时的nInput中已经是用户第一次输入的收支数目了,如果为0,则表示后面没有收支数据了,“0 != nInput”的值为false,循环条件不再满足而直接结束整个do…while…循环语句。反之,则继续进行下一次循环,接受用户输入并将其累加到收支总数,然后再次判断循环条件是否依然满足以决定是否进行下一次循环。这个过程会不断循环往复地进行下去,直到用户输入nInput为0,循环条件不再满足为止。整个过程只需要输入各个收支数目,程序会循环接收这些数据并进行累加统计得到结果,这可比按计算器省事多了。赶紧把这个统计程序拿去献给老妈吧,肯定会得到一番奖赏的。

while和do…while都是用来表达循环现象的结构,且很多时候,两者之间可以相互转换。两者的差别在于,while语句是先判断循环条件后执行循环动作,而do…while…语句却刚好是反过来,先执行循环动作后判断循环条件。这也就意味着,do…while…语句的第一次循环可以无条件地执行,所以它更加适合于表达哪些第一次循环没有初始条件限制的循环现象。比如在收支统计程序中第一次输入收支数目时,任何时候任何情况都可以,没有什么初始条件限制。而while语句的每一次循环动作都要在循环条件满足的前提下执行,所以它更适合于表达哪些每次循环都有前提条件的循环现象。比如,在给汽车加油时,每一次我们都需要判断油箱是否已满,无论是第一次还是最后一次。

原文地址:http://www.cnblogs.com/nihaoCPP/p/4107981.html

时间: 2024-10-13 17:14:22

(转载)你好,C++(21)只要天还没黑,就一直在工地干活-4.3.1 while循环:只要…就一直…的相关文章

你好,C++(21)只要天还没黑,就一直在工地干活-4.3.1 while循环:只要…就一直…

4.3  循环控制语句 在现实世界中,有这样一类现象: 只要油箱中的当前油量小于油箱容量100升,就一直往油箱中加油: 一直不断地为祖国辛勤工作,只要我还活着: 公司100000位员工,每个人的工资都增加10000元: 这些现象虽然各不相同,但它们都有一个共同的特点,那就是在某个条件(只要我还活着)下,或者某个范围(所有100000位员工)内,这些动作(辛勤工作.增加10000元工资)都是循环往复重复多次地出现.为了表达这类循环现象,C++提供了循环控制结构.又因为这些循环现象各有特点,为了准确

三星坠落:最糟的日子还没到来

现如今的大众,都充满了"邪恶"的恶趣味.不再关心某个名人.明星,或某家企业是如何从无到有,一举成名,一夜暴富的,更关心的是他们如何从天堂坠入深渊.这样他们才能嘲笑一句:"早知如此,何必努力."如今,三星就面临着这样一个尴尬处境.在财大气粗了好几年后,不景气的财报凸显出它的无力,也让很多人在等着看它的笑话. 事实上,三星坠落并不是骤然而至,而是有着深刻根源.正所谓最强势的地方就是最薄弱的环节,三星最终还是败在了成就自己巅峰的移动业务上.如今的三星就像热锅上的蚂蚁,急的

poj3687 拓扑排序 还没怎么搞明白 回头再想想

[题意]:n个重量为1~n的球,给定一些球之间的重量比较关系(如 2 1  表示第二个球比第一个球轻),求每个球可能的重量,ans[i] 表示第i个球的重量,要求输出的是ans字典序最小的情况. [思路]:对于给出的a b  建反边,每次 在出度为0的所有点里选一个序号最小的赋值(从n开始 由大到小赋). 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string>

我还没死!!微信公众号——自媒体的营销之路

过去的非常多天的一直没有写什么博客,我还没死. 实际上我在忙着几个项目的设计和制作,个人的站点.企业的站点另一些自媒体的编辑.创作,实在很抱歉大家对我的等待哈,当前我同一时候还在山东毛豆科技工作负责微企通.秀企来以及微商会的实现工作. 同一时候在企业里学了一些SEO和Corel系列软件的使用,提高了HTML和CSS的使用能力,顺便学了一些文案的知识--感觉良好. 现在,我想要提升一下个人的品牌的建立和提升,而一个博客是远远不能满足全部的要求.所以我把目光投向了微信--差点儿每个中国人都在使用的A

秋姑娘还没来得及告别,冬韵就轻歌曼舞而来

冬悄悄的来了,秋姑娘还没来得及告别,冬韵就轻歌曼舞而来,冬姑娘带着晶莹的诗心,身披白纱婷婷而至.带着纯洁和梦想轻奏一曲温婉的歌,携着雪花翩翩起舞的韵律,还有梅花的芳菲在人间淡淡挥洒韵致,冬天来了,春天还会远吗? ***---------------------题记 冬姑娘带着晶莹的诗心,身披白纱婷婷而至.冬韵,浅浅的着韵在洁白的雪花,在芬芳妩媚的梅花上绽放,美好的情愫在飘荡,丝丝温馨,盈着阳光淡淡的清香. 清晨空气清新,阳光暖暖照着我,惬意盈满心间,静静的听一曲涤情的小夜曲,任时光轻飘飘的流转,

人生中处处都是创业经商,若不是,那代表着还没找到商业的秘密

为什么说经商而不是创业呢,我觉得创业这个词用得有点不恰当,创业代表着一个暂新的事业,因此还是说经商较为准确. 很多热血青年认为创业or经商是他们一个重大的人生决定,其实不然,经商无处不在,每个人每天都在经商,不是吗?你只要购买或交易就是一种经商. 一般人认为只要有实体店或工商注册才是象征着创业的一个身份代表,其实大众这样认为也没错,但也错了,错就错在一个观念的错误,什么观念呢?认识问题总是在一个起点上,而不是一个生态系统的认识创业的主客观过程的行为. 很多创业者认为,创业就是至死地而后生的过程,

找来的清除缓存代码,还没试过。

/// <summary>/// 获取数据缓存/// </summary>/// <param name="CacheKey">键</param>public static object GetCache(string CacheKey){    System.Web.Caching.Cache objCache = HttpRuntime.Cache;    return objCache[CacheKey];}/// <summ

当前不会命中断点,还没有加载该文档加载任何符号

断点调试是我编程时经常用到的,但有的程序并一定有Windows界面,而是附加到其他程序中的,如ArcGIS的Addin开发.当我在代码中插入断点调试无效(断点不起作用),并警告"当前不会命中断点,还没有加载该文档加载任何符号". 网上查了说可能是Framework版本的问题,我才恍然大悟:ArcGIS 10.1的Framework版本配置是3.5,而默认VS2010新建的程序Framework版本是4.0,原来如此. 修改目标框架后,要重新清理.重新生成一下. 虽然,调试时还是如此显示

《活着》——活着是因为自己还没死

我读这本书的时候没什么震撼力,觉得一般般. 后来跟人讨论这本书的时候我说,如果福贵不赌博,他早就死了. 其实是我只是看到了死的痛苦,而这本书最打动人的地方应该是福贵坚韧地活着,承担生活的沉重. 所以活着是因为自己还没死. 最后那一段写的真好 我知道黄昏正在转瞬即逝,黑夜从天而降了.我看到广阔的土地袒露着结实的胸膛,那是召唤的姿态,就像女人召唤着她们的儿女,土地召唤着黑夜来临.