java中能构成循环的语句_《编程导论(Java)#183;3.2.4 循环语句》
本文全然復制《編程導論(Java)·3.2.4 循環語句》的內容。除【】中的說明文字。請閱讀和比較其它編程教材。
我知道。假設我是一個剛開始學習的人,《編程導論(Java)》非常不適合自學。建議同學們閱讀時,一定選擇一本其它的書同一時候看,或上網。
,由于太一般或簡單的內容、或我不想留在書中占用篇幅的東西,都省略了。
畢竟,網絡上相關的一般描寫敘述的內容。大把大把。
卓別林在《摩登時代》中。說明流水線上的工人在高強度下重復運行同一個動作是多么令人郁悶。然而循環/迭代(loop/iteration) 即重復運行一個或者多個操作卻是計算機擅長的。學習編程最重要的內容之中的一個,是克服人類對循環結構的不適感,徹底掌握循環結構。【對于剛開始學習的人,循環是一個小坎】
1. 循環基礎:while語句
循環/迭代語句是依據某個表達式的值重復運行某段代碼塊。循環語句有3種形式: while、do-while 和for語句。最主要的循環語句是while語句。
例程 3-5最原始的循環語句
package semantics.statement;
public class WhileDemo{
/**打印[0,10) */
public static void loopPrint(){
int n = 0;
while(n < 10) System.out.println(n++);
}
/**求[0,n)的整數和. */
public static void sum(int n){
int total=0; //保存結果
while(n > 0) total += n--;
System.out.println(total);
}
}
while語句和單選的if語句結構同樣。把if改成while就成了while語句。
其語法為:
while ( b-e ) {
statement(s)T
}
其語意為:遇到keywordwhile,求b-e的值。當/僅僅要(while) b-e為true,則運行隨后的代碼塊——循環體。循環體運行后再次求b-e的值。直到b-e為false則跳過代碼塊。
while語句如同一個可以重復運行的單選if語句。
布爾表達式b-e在這里稱為循環條件。遇到if(true)或while(true),單選if的代碼塊僅運行一次,而while語句則可能永遠運行。
有效地終止循環是掌握循環的關鍵。
2???????while ( (i = in.read()) !=-1 ) 。在讀取文件時,一旦讀取的數據為-1,表示文件結束,因而循環就結束。
循環由一個哨兵監控。稱為哨兵結束模式。哨兵(sentinel)是使循環結束的特殊的值,用戶輸入該值,或通過計算得到該值導致循環結束。哨兵結束模式通常不可以事先確定循環的次數。
讀取文件時。-1為哨兵。
在編寫哨兵結束模式的循環語句時,要特別注意確保循環可以有效地結束。假設在BuleJ中出現無限循環,右擊JVM工作狀態條,重新啟動JVM (Ctrl+Shift+R) 。
哨兵結束模式的還有一個典型應用是在接受鍵盤輸入時。定義一個特殊的字符串如"886"表示終止程序。
2???????for(int i =0; i
對數組array的處理,參數array的長度為循環結束條件。
N次結束模式是又一種循環結束模式,它意味著循環將運行能夠預知的次數。程序會自己主動運行直到結束而不依賴外界條件。再比如求一個正整數的各個數字之和。
任一正數如12345。12345/10為1234。隨著每次循環運行n /=10則n變成了1234、123、12、1、0。因而循環結束的條件為n != 0。【注意,大量關于整數的程序。都用到n
/=10和n %10】
例程 3-6 N次結束模式
public static void dSum(int n){
int total=0;
while(n != 0){
total += n%10;
n /=10;
}
System.out.println(total);
}
程序中while(n !=0)通常表達為while(n> 0)。效果一樣。
如果將循環條件改成while(n> =0),當n變成0后,計算機將一直運行循環體一遍又一遍又一遍,每一次n都等于0。這樣的情況稱為現無限循環(infinite loop)。
在求[0,n)的整數和、求一個正整數的各個數字之和的樣例中,都有改變n的值(目的是改變b-e的值)的某個表達式如n++,該表達式稱為計數表達式( counting expression)。它使得循環傾向于結束。
練習3-1.:例程3-5中循環語句能夠寫成單句如while(n > 0) total += n--;
在該單句中計數表達式是什么?是否能用--n?
練習3-2.:編程。semantics.statement .WhileDemo中加入方法,計算n的階乘(factorial)。
/**
* 求n的階乘。
階乘的數學定義: n>0,n!= 1*2*…*n。
* @param n 自然數n. (n>0)
* @return n的階乘。假設n<1。返回為0;假設n>=13,注意溢出。
*/
public static int factorial ( int n )
練習3-3.:編程計算[1,n]之間奇數的和。提示:計數表達式為賦值表達式n+=2。
練習3-4.:編程驗證3x+1問題。將任一自然數x按下面規則進行計算,終于可得到1。
規則:若數為偶數。則除以2;若為奇數。則乘以3并加1。
將得到的數按本規則反復運算。終于可得到1。
該問題被稱為3x+1問題、敘拉古(Syracuse)猜想、科拉茲(Collatz)猜想或角谷猜想。
提示:循環測試表達式為x!=1。或2的其它冪如x!=2。
假設b-e一開始就為false,while語句的循環體運行0次。
為了保證循環體至少運行一次,能夠採用do-while語句:
do{
statements;
} while (be);
注意:do-while語句須要一個分號。
2. for語句
最經常使用的循環語句是for語句。
它將與循環相關的3個表達式——初始化表達式、循環測試表達式和計數表達式集中在for后面一個()中。這樣的3表達式的for循環(Three-expression for loops)自C語言起,差點兒在全部語言中被採用。
for ( [ForInit]; [ b-e]; [ ForUpdate] ) {
}
2???????測試表達式b-e。與while語句中的b-e循環測試一樣。僅僅要其值為true,則運行隨后的循環體。若循環測試表達式省略,則默覺得true。而while語句中則不可以省略。至少為while(true){}。
2???????初始化表達式ForInit,主要指明循環中使用的索引變量(index variable)怎樣初始化。如for(int i=0;i<10; i++)中。索引變量i被初始化為0。索引變量表示了循環的輪次。它參與循環體計算時。體現每一輪循環的不同。
2???????計數表達式通常稱為step,表示步進的幅度和方向。指定每一輪后循環索引變量怎樣變化,如i++、i -=2等。
for語句的運行流程如圖3-4所看到的。【略。
本書中少見的幾個流程圖之中的一個】
將for語句還原成while語句的形式,有助于熟悉for語句的運行流程。
for (init; test; step){statements;}等價于以下的while語句:
init;
while(test){
statements;
step;
}
對于編程剛開始學習的人,理解for語句不難,關鍵是須要重復和大量的練習。畢竟人不太擅長也不喜歡循環地做事情。而為了利用計算機的任勞任怨,就須要編寫各種循環語句。
例程 3-7素數
package semantics.statement;
import static java.lang .Math.*;
public class Prime{
/**
* 推斷參數n是否為素數
*/
public static boolean isPrime(int n){
if(n==1) return false;
for(int j=2; j< Math.sqrt(n+1); j++){
if (n%j==0) return false;
}
return true;
}
}
3. for語句的變體
3-表達式的for循環,其每個表達式都是可選的(能夠省略的)。
如:for( ; ; ) break;//
for循環的語法要求為:ForInit能夠是1)局部變量聲明, 2)能夠構成表達式語句的表達式組。
而ForUpdate能夠是表達式組。表達式組是由分隔符逗號切割的多個表達式語句。
表達式組只用于for循環(while中不存在這些組成元件)。因而能夠編寫例如以下的for語句:
intx=10,y=0;
for(System.out.println(x),y++; x>y; x=x-2,y=y*2,System.out.println(y));
編譯沒有問題, BlueJ 會在類圖上出現紅色警告:This class cannotcurrently be parsed,可是不影響該代碼的執行。
為了保持代碼的可讀性,須要約束自己不在ForInit中用法調用、自增自減語句。而只使用局部變量聲明或賦值語句;在ForUpdate中,只使用自增自減和賦值語句。
假設循環被兩個相互影響的變量控制,使用逗號則比較合理。
for(int i=0,j=10; i
System.out.println(i + ""+j);
}
在某些專業程序猿編寫的Java代碼中,會出現各種循環語句的變體,包含空循環體、逗號和自增或自減用于各表達式中。比如求i和j的中間值,能夠例如以下:
int i=0;
for(int? j=10 ; ++i < --j ; ) ; //空語句
System.out.println("中間數為 "+i);
練習3-1.:將while部分的練習題用for語句實現。
練習3-2.:以for(;循環測試表達式;){ 循環體}模擬標準的while語句。說明for語句較while的優勢。
練習3-3.:說明在循環語句中使用浮點數進行循環條件測試可能帶來的問題。
練習3-4.:使用級數求近似值。
已知【公式】
編程e(double x),使用do-while語句計算e^x的近似值。
練習3-5.:編程fibonacci()。分別使用while語句和for語句輸出Fibonacci序列的前10項。已知【公式】
4. 嵌套循環結構
各種循環體內又出現循環語句。能夠構成嵌套循環結構。
有興趣能夠先翻閱[第11章排序],當中有大量的樣例。
這里打印九九乘法表。共9行9列,外循環索引i控制行,內循環索引j控制列。
例程 3-8 九九乘法表
package semantics.statement;
import static tips.Print.*;
public class ForDemo{
/**打印出九九乘法表 */
public static void mul99() {
for (int i=1; i<10; i++){
for (int j=1; j<=i; j++)///j<=i 三角,j<10 矩形
System.out.printf("%d*%d=%2d ",i, j, i * j);
pln();
}
}
public static void Table99() {
for (int i=1,j=1; i<10; j = (j==9)?
(++i):(j+1)){
p(i+"*"+j+"="+i*j+ (j==9 ?
'\n' : ' '));
}
}
}
調用mul99()的輸出為:
1*1= 1
2*1= 2 2*2= 4
3*1= 3 3*2= 6 3*3= 9
4*1= 4 4*2= 8 4*3=12 4*4=16
……
調用Table99()的輸出為:
1*1=1 1*2=2 1*3=3 1*4=4 ?1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=162*9=18
……
總結
以上是生活随笔為你收集整理的java中能构成循环的语句_《编程导论(Java)#183;3.2.4 循环语句》的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mm_server.exe是什么进程 有
- 下一篇: 网友偶遇胡歌考驾照:科目二一把过 98分