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

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

📁 《白话c++网页版》是一本用浅显易懂的并具有点幽默的语调来讲述c++的高深的内容
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      <P>{
      <P>&nbsp; sum += i;
      <P>&nbsp; i++;
      <P>}
      <P> 
      <P>看,条件初始化语句被移出for的结构,而条件改变语句则被当成一行普通语句,直接加入到循环体内。而在相应的位置上,只留下分号,用于表示空语句(请注意这一行中有2个分号,分别在 
      i&lt;=100前后):
      <P>for (; i &lt;= 100;)
      <P>如上行所示,for循环结构中的“条件初始”和“条件的改变”表达式都被省略,在这种情况下for和while或do...while循环完全一样。比如求1~100累加和: 

      <TABLE height=100 cellSpacing=0 width="54%" border=1>
        <TBODY>
        <TR>
          <TD width="50%" height=94>int i=1,sum=0; 
            <P>for(;i&lt;=100;)</P>
            <P>{</P>
            <P>&nbsp; sum += i;</P>
            <P>&nbsp; i++;</P>
            <P>}</P></TD>
          <TD width="50%" height=94>int i=1,sum=0; 
            <P>while(i&lt;=100)</P>
            <P>{</P>
            <P>&nbsp; sum += i;</P>
            <P>&nbsp; i++;</P>
            <P>}</P></TD></TR></TBODY></TABLE>
      <P>
      <P>下面分析几个实例:(用于分析的实例不提供上机的完整代码,请同学们自行创建空白工程,然后加入需要代码,确保每个实例都可运行,这是初学者逐步熟练的必经之路……信不信由你。打开CB吧)。
      <P> 
      <P><B>题一:</B>用for循环在屏幕上逐行输出数字:1~200。
      <P><B>分析:</B>这需要一个变量,其值从1变到200,并且每变一次新值,就用 cout 语句在屏幕上输出其值。
      <P><B>答案:</B>
      <P>
      <P>for(int i=1;i&lt;=200;i++)
      <P>&nbsp;&nbsp; cout &lt;&lt; i &lt;&lt; endl;
      <P> 
      <P>由于循环中执行的动作只有一句,所以我们省略了{}。
      <P> 
      <P><B>题二:</B>6能被1、2、3、6整除,这些数称为6的因子,请循环列出36的所有因子。
      <P><B>分析:</B>因子?忘了吗?求36的因子,就是求1~36中哪些整数可以整除36。我们学过 % 操作符,它用于求两数相除的余数。所以整除不整除,只要看余数是否为0即可。
      <P><B>答案:</B>
      <P> 
      <P>for(int i=1;i&lt;=36;i++)
      <P>{
      <P>&nbsp;&nbsp; if(36 % i == 0)&nbsp;&nbsp; //余数为0,说明整除
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; i &lt;&lt; " 
      "; //多输出一个空格,用于做两数之间的间隔
      <P>}
      <P> 
      <P>如果运行程序,得到结果应是:
      <P><FONT color=#ffffff><SPAN 
      style="BACKGROUND-COLOR: #000000">1 2 3 4 6 9 12 18 36 </SPAN></FONT>
      <P> 
      <P>在这道题中,我们也看到了两种流程的结合:for循环流程和if条件分支流程。复杂问题的解决,往往就是条件流程和循环流程的种种组合,下面要讲的多层循环也是这些组合中一种。
      <P> 
      <H3><A name=10.4>10.4</A> 多层循环</H3>
      <P> 
      <P>有些问题需要多层循环嵌套才能解决。前面可以多次统计的程序,就使用了两层循环。外层的do...while实现重复统计,内层的while循环实现一次统计。
      <P> 
      <P>继续分析一些题目:
      <P><B>题三:</B>输出以下内容,要求使用两种方法,第一种方法采用单层循环,第二种方法采用双层循环。
      <P> 
      <P>123
      <P>456
      <P>789
      <P> 
      <P>方法一:
      <P><B>分析:</B>单层循环的思路是:从1输出到9,并且,每当输出三个数字时,多输出一个换行符。
      <P><B>答案:</B>
      <P>for(int i=1;i&lt;=9;i++)
      <P>{
      <P>&nbsp; cout &lt;&lt; i;
      <P> 
      <P>&nbsp; if( i % 3 == 0) //又一次用到“求余”操作。
      <P>&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;
      <P>}
      <P> 
      <P>方法二:
      <P><B>分析:</B>双层循环的思路是:输出三行,每行输出三个数字。
      <P><B>答案:</B>
      <P>for(int i=1;i&lt;=3;i++)
      <P>{
      <P>&nbsp;&nbsp;&nbsp; for(int j=i;j&lt;=i+3;j++)
      <P>&nbsp;&nbsp;&nbsp; {
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; j;
      <P>&nbsp;&nbsp;&nbsp; }
      <P>&nbsp;&nbsp;&nbsp; 
      <P>&nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;
      <P>}
      <P>代码中,内层的for用于输出每一行的数字,而外层的for则在每一行输出完成后,输出一个换行符,用于换行.需要另加注意的是,内层循环的条件初始化,和外层循环有关。即这一句:int 
      j=i; 正是。每次开始内层循环时,j的值都将从当前i的值开始。
      <P>这道题似乎让人留恋于用单层循环解决一切,因为看上去用双层循环并不是很直观?
      <P> 
      <P><B>题四:</B>请用输出以下内容:
      <P> 
      <P>1
      <P>12
      <P>123
      <P>1234
      <P>12345
      <P>123456
      <P>1234567
      <P>12345678
      <P>123456789
      <P> 
      <P>题目刚出,只见一同学噼噼啪啪开始输入代码,并且很快在屏幕上输出正确的内容,他的答案是:
      <P> 
      <P>cout &lt;&lt; "1" &lt;&lt; endl;
      <P>cout &lt;&lt; "12" &lt;&lt; endl;
      <P>cout &lt;&lt; "123" &lt;&lt; endl;
      <P>cout &lt;&lt; "1234" &lt;&lt; endl;
      <P>cout &lt;&lt; "12345" &lt;&lt; endl;
      <P>cout &lt;&lt; "123456" &lt;&lt; endl;
      <P>cout &lt;&lt; "1234567" &lt;&lt; endl;
      <P>cout &lt;&lt; "12345678" &lt;&lt; endl;
      <P>cout &lt;&lt; "123456789" &lt;&lt; endl;
      <P> 
      <P>如果谁在有关循环的作业中交上类似这样的答案,我准备给他一个“鸭蛋”呵。
      <P>这道题目,除非跟自已过不去,否则没有人会非要硬去用一层循环来实现(用一层循环不如用上面的“答案”,笨是笨点,却最为直观)。本题使用双层循环来实现实为最佳方法。
      <P> 
      <P><B>分析:</B>外层循环用于控制输出9行;内层循环用于输出每行的数字。每一行都是从1开始,但第一行输出1个数字,第二行输出2个,第三行输出3个……
      <P> 
      <P><B>答案:</B>
      <P>for(int i=1; i&lt;=9; i++)
      <P>{
      <P>&nbsp;&nbsp;&nbsp; for(int j=1; j&lt;=i; j++)
      <P>&nbsp;&nbsp;&nbsp; {
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; j;
      <P>&nbsp;&nbsp;&nbsp; } 
      <P> 
      <P>&nbsp;&nbsp; cout &lt;&lt; endl;
      <P>}
      <P> 
      <P>看,在这道中,内层循环的条件初始化和外层循环无关,但循环条件判断却和外层的i有关了(j&lt;=i)。当然,这并不是必要条件,但内层循环的条件初始化或条件判断,和外层循环的某些因素有关,这是很多多层循环的解决问题的关键!继续一个经典的题目。
      <P> 
      <P><B>题五:</B>请输出以下九九口诀表:
      <P> 
      <P>1*1=1
      <P>1*2=2 2*2=4
      <P>1*3=3 2*3=6 3*3=9
      <P>1*4=4 2*4=8 3*4=12 4*4=16
      <P>1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
      <P>1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
      <P>1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
      <P>1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=24 7*8=56 8*8=64
      <P>1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=36 7*9=63 8*9=72 9*9=81
      <P> 
      <P><B>分析:</B>你可以看出,本题和题四有很大的类似,都是要输出一个“三角形”(严格说是梯形?),所以解题思路也大致一样:输出九行。你可能会说,输出九列也可以吧?的确可以,不过由于我们现在使用控制台(DOS)窗口来输出,所以被限定只能由上到下一行一行输出,而不能由左到右一列列输出。
      <P>既然是按行输出,我们来看每一行的内容有什么特点:
      <P>每一行输出的内容都是: i*j=k,其中k是积,由i和j决定,所以我们可以不必看:
      <P> 
      <P>第1行:1*1,只有一个,看不出有什么特点。
      <P>第2行:1*2 2*2&nbsp; ……1,2 分别乘以2
      <P>第3行: 1*3 2*3 3*3&nbsp; ……1,2,3分别乘以3
      <P>所以,各行的内容的规律是:设当前为第line行,则输出 n*line ,n为1到line.
      <P> 
      <P>for(int line=1; line &lt;= 9;line++)
      <P>{
      <P>&nbsp;&nbsp; for(int n=1; n&lt;=line;line++)
      <P>&nbsp;&nbsp; {
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; n &lt;&lt; '*' &lt;&lt; 
      line &lt;&lt; '=' &lt;&lt; n * line &lt;&lt;' ';
      <P>&nbsp;&nbsp; }
      <P> 
      <P>&nbsp; cout &lt;&lt; endl;
      <P>}
      <P> 
      <P>把line换成i,n换成j,本题的循环控制部分的代码和题四完全一样。
      <P> 
      <P>理解以上各分析题,最好的方法是实际上机,然后运行,并且最好自已尝试按F8来一步步运行。所以再说以遍,本章内容可以宣告结束,但如果你没有上机操作这些循环题,就不能说你学好本章。
      <P> 
      <H3><A name=10.5>10.5</A> 小结及一点问题</H3>
      <P> 
      <P>学习了三种循环流程:while,do...while,for。
      <P> 
      <P>while在每一遍循环开始时检查条件是否成立,如果一开始条件就不成立,则循环中的语句将一次也没有执行。
      <P> 
      <P>do...while的特殊之处在于,第一遍循环前,并不检查条件,所以,就算条件根本就不成立,循环也将并执行一次,如:
      <P>do
      <P>{
      <P>&nbsp; ...
      <P>}
      <P>while(false);
      <P>条件是“false”?这也是条件吗?是的,这也是条件,一个摆明了就是不成立的条件,常见的还有:while(0)。0可以看false。相反的,摆明是真的条件是:while(true)或while(1)等。
      <P> 
      <P>for 
      的特殊之处在于,它除了条件判断以外,还明确地留出了条件初始化,条件变化的位置。所以,有关计数的循环最适于用for来实现,请参看课程中用for实现1到100累加的实例。
      <P>至于for的各种“变体”,只须了解,以后用得熟了,再去卖弄不迟 :) 。
      <P> 
      <P>循环就象绕圈子。比如,体育课,跑1200米,跑道一圈400米,所以我们要做的事就是一边跑一边在心里计数(当然要已数,否则老师万一少计一圈,我们可就玩完了),当计数到3圈时,“循环”结束。
      <P>在这个例子,条件初始化就将计数设为0;循环的条件则是计数小于3;条件变化则是指在每跑完一圈时,心里将计数加1;至于循环的动作,自然就是跑步了……
      <P>用while实现:
      <P> 
      <P>int js = 0; //js 取意“计数”,而不是“奸商”,也不是“句神”
      <P> 
      <P>while( js &lt; 3)
      <P>{
      <P>&nbsp; 跑一圈……;
      <P>&nbsp; js++;
      <P>}
      <P> 
      <P>用do...while实现:
      <P> 
      <P>int js = 0;
      <P> 
      <P>do
      <P>{
      <P>&nbsp; 跑一圈……
      <P>&nbsp; js++;
      <P>}
      <P>while( js &lt;3);
      <P> 
      <P>用 for 实现(最适合了)
      <P> 
      <P>for(int i=0;i&lt;3;i++)
      <P>{
      <P>&nbsp;&nbsp; 跑一圈……;
      <P>}
      <P> 
      <P>如果,我在跑步时不幸由于体力不支而晕倒……怎么办?下一章见! 
      <P>  </P></TD></TR></TBODY></TABLE></CENTER>
<P align=center>[<A 
href="http://d2school.com/bcyl/bhcpp/newls/ls10.htm#页首">到页首</A>]</P></BODY></HTML>

⌨️ 快捷键说明

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