?? 教學--第十章 循環語句.htm
字號:
<P>{
<P> sum += i;
<P> i++;
<P>}
<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>
<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://d2school.com/bcyl/bhcpp/newls/ls10.htm#頁首">到頁首</A>]</P></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -