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

📄 第10章 循环语句.htm

📁 用非常通俗的语言介绍了C++和C
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      <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://www.d2school.com/bcyl/bhcpp/newls/ls10.htm#页首">到页首</A>]</P></BODY></HTML>

⌨️ 快捷键说明

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