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