📄 第10章 循环语句.htm
字号:
<P>
<P>看,条件初始化语句被移出for的结构,而条件改变语句则被当成一行普通语句,直接加入到循环体内。而在相应的位置上,只留下分号,用于表示空语句(请注意这一行中有2个分号,分别在
i<=100前后):
<P>for (; i <= 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<=100;)</P>
<P>{</P>
<P> sum += i;</P>
<P> i++;</P>
<P>}</P></TD>
<TD width="50%" height=94>int i=1,sum=0;
<P>while(i<=100)</P>
<P>{</P>
<P> sum += i;</P>
<P> 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<=200;i++)
<P> cout << i << 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<=36;i++)
<P>{
<P> if(36 % i == 0) //余数为0,说明整除
<P> cout << i << "
"; //多输出一个空格,用于做两数之间的间隔
<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<=9;i++)
<P>{
<P> cout << i;
<P>
<P> if( i % 3 == 0) //又一次用到“求余”操作。
<P> cout << endl;
<P>}
<P>
<P>方法二:
<P><B>分析:</B>双层循环的思路是:输出三行,每行输出三个数字。
<P><B>答案:</B>
<P>for(int i=1;i<=3;i++)
<P>{
<P> for(int j=i;j<=i+3;j++)
<P> {
<P> cout << j;
<P> }
<P>
<P> cout << 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 << "1" << endl;
<P>cout << "12" << endl;
<P>cout << "123" << endl;
<P>cout << "1234" << endl;
<P>cout << "12345" << endl;
<P>cout << "123456" << endl;
<P>cout << "1234567" << endl;
<P>cout << "12345678" << endl;
<P>cout << "123456789" << endl;
<P>
<P>如果谁在有关循环的作业中交上类似这样的答案,我准备给他一个“鸭蛋”呵。
<P>这道题目,除非跟自已过不去,否则没有人会非要硬去用一层循环来实现(用一层循环不如用上面的“答案”,笨是笨点,却最为直观)。本题使用双层循环来实现实为最佳方法。
<P>
<P><B>分析:</B>外层循环用于控制输出9行;内层循环用于输出每行的数字。每一行都是从1开始,但第一行输出1个数字,第二行输出2个,第三行输出3个……
<P>
<P><B>答案:</B>
<P>for(int i=1; i<=9; i++)
<P>{
<P> for(int j=1; j<=i; j++)
<P> {
<P> cout << j;
<P> }
<P>
<P> cout << endl;
<P>}
<P>
<P>看,在这道中,内层循环的条件初始化和外层循环无关,但循环条件判断却和外层的i有关了(j<=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 ……1,2 分别乘以2
<P>第3行: 1*3 2*3 3*3 ……1,2,3分别乘以3
<P>所以,各行的内容的规律是:设当前为第line行,则输出 n*line ,n为1到line.
<P>
<P>for(int line=1; line <= 9;line++)
<P>{
<P> for(int n=1; n<=line;line++)
<P> {
<P> cout << n << '*' <<
line << '=' << n * line <<' ';
<P> }
<P>
<P> cout << 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> ...
<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 < 3)
<P>{
<P> 跑一圈……;
<P> js++;
<P>}
<P>
<P>用do...while实现:
<P>
<P>int js = 0;
<P>
<P>do
<P>{
<P> 跑一圈……
<P> js++;
<P>}
<P>while( js <3);
<P>
<P>用 for 实现(最适合了)
<P>
<P>for(int i=0;i<3;i++)
<P>{
<P> 跑一圈……;
<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 + -