⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 教学--第十章 循环语句.htm

📁 《白话c++网页版》是一本用浅显易懂的并具有点幽默的语调来讲述c++的高深的内容
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      <H3><A name=10.2>10.2</A> do ... while 循环</H3>
      <P> 
      <P>语法形式:
      <P> 
      <P>do
      <P>{
      <P>&nbsp;&nbsp;&nbsp; 需要循环执行的语句;&nbsp;
      <P>}
      <P>while(条件);
      <P> 
      <P>和 
      while循环最明显的区别,就是do...while循环中,判断是否继续循环的条件,放在后面。也就是说,就算是条件一开始就不成立,循环也要被执行一次。请比较以下两段代码,前者使用while循环,后者使用do...while循环。
      <P> 
      <P>代码段一:
      <P>int a = 0;
      <P>while( a &gt; 0 )
      <P>{
      <P>&nbsp; a--;
      <P>}
      <P> 
      <P>变量a初始值为 0,条件 a &gt; 0 显然不成立。所以循环体内的 a--;语句未被执行。
      <P>本段代码执行后,变量a值仍为0;
      <P> 
      <P>代码段二:
      <P>int a = 0;
      <P>do&nbsp;
      <P>{
      <P>&nbsp; a--;
      <P>}
      <P>while( a &gt; 0 );
      <P> 
      <P>尽管循环执行前,条件 a &gt; 0 一样不成立,但由于程序在运行到 
      do...时,并不先判断条件,而是直接先运行一遍循环体内的语句:a--。于是a的值成为 -1,然后,程序才判断 a &gt; 0 
      ,发现条件不成立,循环结束。
      <P> 
      <P>do..while中的条件和while循环中的条件一样是:“允许继续循环的条件”,而不是“结束循环的条件”,这和Pascal语言中的do...until正好相反,学习过Pascal(Delphi)的学员可得注意。
      <P> 
      <P>以笔者的经验,do..while循环用得并不多,大多数的循环用while...来实现会更直观。下面我们仅简单地将1到100的连加程序转换为用do...while实现:
      <P> 
      <P>int sum =0;
      <P>int i=1;
      <P> 
      <P>do
      <P>{
      <P>&nbsp;&nbsp; sum += i;
      <P>&nbsp;&nbsp; i++;
      <P>}
      <P>while(i&lt;=100);
      <P> 
      <P><B>例三:用 do...while实现可以多次统计的程序。</B>
      <P> 
      <P>在例二中,我们做了一个统计程序。假如一个学生有三门成绩,如语文,数学,英语要统计总分,例二的程序可以方便地使用,但如果要连续统计一个班级每个学生的这三门成绩,我们就得不断地运行例二的成绩,这显然不方便。
      <P>一个同学的三门成绩需要一层循环,要不断统计多个同学各自的成绩,就需要再套上一层循环。请看下面例子中,如何在原来的 
      while...循环上再加一层do...while循环。
      <P>程序的思路是:统计完一遍后,就问一句是否要继续统计新同学的成绩,如果用户输入字母Y或y,表示需要统计一下位,否则,程序结束循环。
      <P>这个程序是在例二的基础上进行功能改进,以下粗体部分为新加的代码。
      <P> 
      <P>//---------------------------------------------------------------------------
      <P>#include &lt;iostream.h&gt;
      <P>#pragma hdrstop
      <P>//---------------------------------------------------------------------------
      <P>#pragma argsused
      <P>int main(int argc, char* argv[])
      <P>{
      <P>&nbsp;&nbsp; float sum,score;
      <P>&nbsp;&nbsp; int num; //num 用于存储有几个成绩需要统计。
      <P>&nbsp;&nbsp; int i;&nbsp;&nbsp; //i 用于计数
      <P> 
      <P><B>&nbsp;&nbsp; char c; //用来接收用户输入的字母</B>
      <P> 
      <P><B>  do</B>
      <P><B>&nbsp;&nbsp; {</B>
      <P><B>&nbsp;&nbsp;&nbsp;&nbsp; </B>//初始化:
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sum = 0;&nbsp;
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = 1;
      <P> 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "====成绩统计程序====" &lt;&lt; 
      endl;<BR>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //用户需事先输入成绩总数:
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "请输入待统计的成绩个数:";
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; num;
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "总共需要输入"&lt;&lt; num 
      &lt;&lt; "个成绩(每个成绩后请加回车键):" &lt;&lt; endl;
      <P> 
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( i &lt;= num)
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "请输入第" 
      &lt;&lt; i &lt;&lt; "个成绩:";
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin &gt;&gt; 
      score;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      sum += 
      score;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      i++;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      }<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      //输出统计结果:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout 
      &lt;&lt; "参加统计的成绩数目:" &lt;&lt; num &lt;&lt; endl;<BR>&nbsp;&nbsp; 
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "总分为:" &lt;&lt; sum &lt;&lt; 
      endl;
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
      <P><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //提问是否继续统计:</B>&nbsp;&nbsp;
      <P><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt;"是否开始新的统计?(Y/N)?";</B>
      <P><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cin&nbsp; &gt;&gt; c;</B>
      <P><B>&nbsp;&nbsp;&nbsp;&nbsp; }</B>
      <P><B>&nbsp;&nbsp;&nbsp;&nbsp; while( c == 'y' || c == 'Y');</B>
      <P>}
      <P>//---------------------------------------------------------------------------<BR>
      <P>程序完成一次统计以后,会提问“是否开始新的统计”,用户输入一个字母,存到变量 
      c,然后程序在do...while的条件里检查c是否等于‘Y’或‘y’。如果不等于,就结束循环。
      <P>由于程序在统计之后有一个提问的时间,所以,原来的getchar()就不再需要了。
      <P>在这个例子,外层循环使用do...while是最好的选择,因为,用户运行本程序,多数情况下,他至少想统计一次。
      <P> 
      <P>最后我们来看do...while循环的流程图,请和while的流程图对比。
      <P> 
      <P><IMG height=284 src="教学--第十章 循环语句.files/ls10.h5.gif" width=276 
border=0>
      <P> 
      <H3><A name=10.3>10.3</A> for 循环</H3>
      <P>for 
      循环里在C,C++里用得最多,也是最灵活的循环语句。要学好它,需要从已经学过的while循环的身上,“挖掘”出有关循环流程的要素,这些要素隐藏在while,或do...while的背后,但它将直接体现在for循环的结构上。
      <H4><A name=10.3.1>10.3.1</A> 循环条件三要素</H4>
      <P> 
      <P>学习了两种循环,我们来挖掘一下循环流程中的“条件三要素”。
      <P> 
      <P><B>第一、条件一般需要进行一定的初始化操作。</B>
      <P> 
      <P>请看我们用while循环实现1到100累加的代码:
      <P> 
      <P><I>int sum = 0; //变量sum将用于存储累加和,将它初始化为0,这很重要。</I>
      <P><I>int i = 1;&nbsp;&nbsp; //i是每次要加的数,它从1开始。</I>
      <P> 
      <P><I>while ( i&lt;= 100)</I>
      <P><I>{</I>
      <P><I>&nbsp;&nbsp; sum += i;</I>
      <P><I>&nbsp;&nbsp; i++;</I>
      <P><I>}</I>
      <P> 
      <P>这段代码中,循环的条件是 i &lt;= 100;因此,一开始,i肯定需要一个确定的值。前面的:
      <P>int i = 0;这一行代码,在声明变量i的同时,也为i赋了初始值:1。这样,条件 i &lt;= 100 得以成立(因为i为1,所以 i 
      &lt;= 100 当然成立)。
      <P> 
      <P><B>第二、循环需要有结束的机会。</B>
      <P> 
      <P>程序中最忌“死循环”。所谓的“死循环”就是指该循环条件永远为真,并且,没有另外的跳出循环的机会(后面将学到)。比如:
      <P> 
      <P>//一段死循环的例子:
      <P>while ( 2 &gt; 1 )
      <P>{
      <P>&nbsp; cout &lt;&lt; "死循环" &lt;&lt;endl;&nbsp;
      <P>}
      <P> 
      <P>执行这段代码,你会发现程序停不下来了。原因就是它的循环条件 2 &gt; 1 
      永远为true。所以,一个最后可以变成不成立条件在大多数情况下是必需的。比如在while的那个例子:
      <P><I>while ( i&lt;= 100)</I>
      <P>条件 i &lt;= 100 ,由于 i 在循环中被改变,所以它至少在理论上有可能造成 i &lt;= 100 不成立。
      <P> 
      <P><B>第三、在循环中改变循环条件的成立因素</B>
      <P> 
      <P>这一条和第二条互相配套。
      <P>比如这段代码:
      <P><I>int i=1;</I>
      <P><I>while ( i&lt;= 100)</I>
      <P><I>{</I>
      <P><I>&nbsp;&nbsp; sum += i;</I>
      <P><I>}</I>
      <P>同样是一段可怕的“死循环”。因为i没有被改变的机会,其值永远为1,从而循环条件 
      i&lt;=100也就永远为真。所以在循环中最后一句(下面加粗部分),不可遗忘。
      <P><I>while ( i&lt;= 100)</I>
      <P><I>{</I>
      <P><I>&nbsp;&nbsp; sum += i;</I>
      <P><I><B>&nbsp;&nbsp; i++;</B></I>
      <P><I>}</I>
      <P>当然,在这段程序里,i++除了起改变条件成立因素以外,同时也起上sum不断加递增的数,从而实现得到累加和。
      <P> 
      <P>说完这一些,我们来看C,C++中最灵活循环结构:for循环。
      <P> 
      <H4><A name=10.3.2>10.3.2</A> 三要素在for循环结构上体现</H4>
      <P> 
      <P>for 循环的语法:
      <P> 
      <P>for(条件初始化;条件;条件改变)
      <P>{
      <P>&nbsp; 需要循环执行的语句;&nbsp;
      <P>}
      <P> 
      <P>可见,for的结构中,不仅提供了的“条件”的位置,同时也提供了条件初始化,和条件改变的位置。这三者虽然在同一行上,但并不是依次连接地执行。
      <P> 
      <P>条件初始化的表达式首先被执行(并且只被执行一次);
      <P>然后程序检查条件是否成立,如果成立就执行循环体中的语句,否则直接结束循环。
      <P>执行完一遍循环以后,程序执行“条件改变”语句。
      <P> 
      <P>1到100整数累加的程序,改为for循环写,是最合适的了:
      <P> 
      <P>int sum = 0;
      <P>int i;
      <P> 
      <P>for( i=1; i &lt;= 100;i++)
      <P>{
      <P>&nbsp; sum += i;
      <P>} 
      <P> 
      <P>程序先执行条件初始化语句:i=1;
      <P>然后立即判断条件 i &lt;= 100 吗?显示,此时该条件成立;
      <P>于是程序执行循环体内的语句,此时只有一句: sum += i;
      <P>然后,执行改变条件因子的语句: i++; 此时,i值变为 2;
      <P>程序再次判断条件 i &lt;= 100 ?,依然成立,于是开始第二遍循环……
      <P> 
      <P>变量 i 可以初始化条件时才临时声明:
      <P>for(int i = 1;i &lt;= 100;i++) ……
      <P> 
      <P>for 
      语句的复合结构,使得程序变得简捷。比如上面的例子中,原来 while或者do...while结构中,循环体内必须两句语句,现在只需一句(即:i++这一句被移到for的特定位置上),这样,我们可以去除花括号:
      <P>for(int i=0;i &lt;= 100;i++)
      <P>&nbsp;&nbsp; sum += 100;
      <P>当然,如果在其它情况下,for的循环体内仍需有多行语句时,{}仍是不可避免的。事实上,就算现在这种情况,我也建议大家使用花括号。这样可以让程序的结构看上去更清晰。
      <P> 
      <P>在本例中,如果非要讲究简捷,我们还可以将循环体内的那惟一的一行移到“条件改变”的位置:
      <P>for(int i=1; i&lt;=100;sum += i,i++);
      <P>sum += i和i++之间用逗号分开。而在for后面的()行末,则直接跟上分号,表示for不必再执行其它的语句。
      <P>考虑到后置++的特性(在完成表达式的求值后,才进行加1操作),也可以将sum += i和i++合为一句:
      <P>for(int i=1;i&lt;=100;sum += i++);
      <P> 
      <P>以上讲了for语句极尽合并之技巧,以求一个简捷。反过来,for语句也可以向 while或do...while语句一样拆开写:
      <P> 
      <P>int i = 1;
      <P>for(; i &lt;= 100;)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -