JAVA程序設(shè)計(jì)課件:Java結(jié)構(gòu)化程序設(shè)計(jì)_第1頁(yè)
JAVA程序設(shè)計(jì)課件:Java結(jié)構(gòu)化程序設(shè)計(jì)_第2頁(yè)
JAVA程序設(shè)計(jì)課件:Java結(jié)構(gòu)化程序設(shè)計(jì)_第3頁(yè)
JAVA程序設(shè)計(jì)課件:Java結(jié)構(gòu)化程序設(shè)計(jì)_第4頁(yè)
JAVA程序設(shè)計(jì)課件:Java結(jié)構(gòu)化程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩194頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java結(jié)構(gòu)化程序設(shè)計(jì)3.1項(xiàng)目任務(wù)3.2項(xiàng)目解析3.3技術(shù)準(zhǔn)備3.4項(xiàng)目學(xué)做3.5習(xí)題

單元概述

從程序流程角度來(lái)看,程序可以分成順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)三種基本結(jié)構(gòu)。任何復(fù)雜的程序,都可以用這三種結(jié)構(gòu)組合完成。盡管Java程序的最小單位是類,這并不妨礙Java在編程中使用結(jié)構(gòu)化程序設(shè)計(jì)的方法。

目的與要求

·了解Java結(jié)構(gòu)化程序設(shè)計(jì)的思想和方法

·了解流程圖的構(gòu)成元素及繪制方法

·掌握用順序結(jié)構(gòu)設(shè)計(jì)程序的方法

·掌握用分支結(jié)構(gòu)設(shè)計(jì)程序的方法

·掌握用循環(huán)結(jié)構(gòu)設(shè)計(jì)程序的方法

·了解跳轉(zhuǎn)語(yǔ)句break和continue的功能和語(yǔ)法

重點(diǎn)與難點(diǎn)

·用程序流程圖完成程序設(shè)計(jì)思路

·各種分支結(jié)構(gòu)的語(yǔ)法,能夠用多重分支和分支嵌套完成復(fù)雜的程序設(shè)計(jì)

·各種循環(huán)結(jié)構(gòu)的語(yǔ)法,能夠用多重循環(huán)和循環(huán)嵌套完成復(fù)雜的程序設(shè)計(jì)

3.1項(xiàng)目任務(wù)

每個(gè)人都有過(guò)超市購(gòu)物的經(jīng)歷,想想當(dāng)你把購(gòu)物車上的商品推到收銀臺(tái)時(shí),收銀員是怎么做的?用Java程序來(lái)模擬超市購(gòu)物。

3.2項(xiàng)目解析

當(dāng)你只買了一件商品,付款額恰好與商品價(jià)格相同,很簡(jiǎn)單,直接拎物走人。當(dāng)付款額大于商品價(jià)格時(shí),需用找零,這些過(guò)程簡(jiǎn)單地按順序做就可以完成,這就用到本章所講的順序結(jié)構(gòu)。而當(dāng)你是超市的VIP會(huì)員或者超市根據(jù)消費(fèi)額打折優(yōu)惠時(shí),雖然收銀員也是做順序的操作,但是計(jì)算機(jī)中的程序需要對(duì)你的會(huì)員情況和消費(fèi)額等進(jìn)行判斷,再做優(yōu)惠處理,這就用到本章所講的條件結(jié)構(gòu)。當(dāng)商品量大時(shí),模擬過(guò)程還應(yīng)該考慮用到循環(huán)結(jié)構(gòu)。

3.3技術(shù)準(zhǔn)備

3.3.1結(jié)構(gòu)化程序設(shè)計(jì)簡(jiǎn)介結(jié)構(gòu)化程序設(shè)計(jì)的目的是通過(guò)設(shè)計(jì)結(jié)構(gòu)良好的程序,以程序靜態(tài)的結(jié)構(gòu)保證程序動(dòng)態(tài)執(zhí)行的正確性,使程序易理解、易調(diào)試、易維護(hù),以提高軟件開(kāi)發(fā)的效率。結(jié)構(gòu)化程序設(shè)計(jì)主要強(qiáng)調(diào)的是“清晰第一,效率第二”。目的還是強(qiáng)調(diào)程序的易讀性和易理解性。

結(jié)構(gòu)化程序設(shè)計(jì)方法遵循以下四條基本原則。

(1)自頂向下原則:在程序設(shè)計(jì)時(shí),應(yīng)先考慮總體,后考慮細(xì)節(jié);先考慮全局目標(biāo),后考慮局部目標(biāo)。

(2)逐步求精原則:對(duì)于復(fù)雜的問(wèn)題,應(yīng)設(shè)計(jì)一些子目標(biāo)作為過(guò)渡,逐步細(xì)化。

(3)模塊化原則:一個(gè)復(fù)雜的問(wèn)題,可以看成是由若干個(gè)稍微簡(jiǎn)單的問(wèn)題構(gòu)成,要解決這個(gè)復(fù)雜問(wèn)題,先解決對(duì)應(yīng)的若干個(gè)稍微簡(jiǎn)單的問(wèn)題,把復(fù)雜問(wèn)題分解成若干個(gè)小的部分進(jìn)行解決。

(4)限制使用goto語(yǔ)句:事實(shí)上,Java已經(jīng)不再使用goto語(yǔ)句了。

結(jié)構(gòu)化程序設(shè)計(jì)方法主要由以下三種基本結(jié)構(gòu)組成。

(1)順序結(jié)構(gòu):一種線性的、有序的結(jié)構(gòu),它按時(shí)空順序依次執(zhí)行各語(yǔ)句模塊。

(2)分支結(jié)構(gòu)(又稱選擇結(jié)構(gòu)、條件結(jié)構(gòu)):根據(jù)條件成立與否選擇程序執(zhí)行的路徑。

(3)循環(huán)結(jié)構(gòu):重復(fù)地執(zhí)行一個(gè)或多個(gè)模塊,直到滿足某個(gè)條件為止。

采用結(jié)構(gòu)化程序設(shè)計(jì)方法,程序結(jié)構(gòu)清晰,易讀、易調(diào)試、易排錯(cuò)、易修改。由于每個(gè)模塊執(zhí)行單一的功能,模塊間聯(lián)系較少,使程序編制更加簡(jiǎn)單,程序更可靠,而且易于維護(hù)。

3.3.2程序流程圖

1.流程圖的概念

用特定的圖形符號(hào)加上說(shuō)明來(lái)表示算法的圖叫作流程圖或框圖。程序流程圖是程序分析和設(shè)計(jì)中最基本、最重要的分析技術(shù),它是進(jìn)行程序流程分析過(guò)程中最基本的工具。在流程圖中,圖框表示各種操作的類型,圖框中的文字和符號(hào)表示控件的內(nèi)容,流程線表示操作的先后順序或程序中數(shù)據(jù)的流向。

2.使用流程圖的優(yōu)缺點(diǎn)

使用流程圖的優(yōu)點(diǎn)是形象直觀,各種操作一目了然,不會(huì)產(chǎn)生“歧義性”,便于理解,當(dāng)算法出錯(cuò)時(shí)容易發(fā)現(xiàn),可以通過(guò)流程圖直接轉(zhuǎn)化為程序。

使用流程圖的缺點(diǎn)是所占篇幅較大,由于允許使用流線,過(guò)于靈活,不受約束,使用者可以使流程任意轉(zhuǎn)向,從而造成程序閱讀和修改上的困難,不利于結(jié)構(gòu)化程序設(shè)計(jì)。

3.流程圖常用的符號(hào)

美國(guó)國(guó)家標(biāo)準(zhǔn)化學(xué)會(huì)(AmericanNationalStandardsInstitute,ANSI)對(duì)流程圖中所用符號(hào)做了規(guī)定,這些符號(hào)已被各國(guó)程序設(shè)計(jì)者普遍使用。圖3-1是常用的一些流程圖符號(hào)。美國(guó)國(guó)家標(biāo)準(zhǔn)化學(xué)會(huì)(AmericanNationalStandardsInstitute,ANSI)對(duì)流程圖中所用符號(hào)做了規(guī)定,這些符號(hào)已被各國(guó)程序設(shè)計(jì)者普遍使用。圖3-1是常用的一些流程圖符號(hào)。圖3-1常用流程圖符號(hào)

4.流程圖的畫(huà)法

繪制流程圖的習(xí)慣做法有:

·用圓角矩形表示“開(kāi)始”和“結(jié)束”。

·用矩形表示行動(dòng)方案或普通的工作環(huán)節(jié)。

·用菱形表示判斷、判定、審核等環(huán)節(jié)。

·用平行四邊形表示輸入/輸出。

·用帶箭頭的線表示工作流方向。

例3-1判斷某一年是不是閏年。

判斷閏年的條件是:

①年份能被4整除,但不能被100整除;

②年份能被4整除,又能被400整除。判斷閏年的算法流程圖如圖3-2所示。圖3-2判斷閏年的算法流程圖

3.3.3順序結(jié)構(gòu)

順序結(jié)構(gòu)是指通過(guò)安排語(yǔ)句的順序來(lái)決定程序流程的程序結(jié)構(gòu),也就是按照程序的書(shū)寫(xiě)順序,自上而下地逐條執(zhí)行的程序結(jié)構(gòu)。順序結(jié)構(gòu)的流程圖如圖3-3所示。圖3-3順序控制流程圖

順序結(jié)構(gòu)設(shè)計(jì)的步驟可以歸納為:

(1)導(dǎo)入必要的包和類(不是必須的);

(2)定義變量(為變量分配內(nèi)存空間);

(3)初始化變量(可以用賦值語(yǔ)句或輸入語(yǔ)句);

(4)計(jì)算;

(5)輸出結(jié)果(使用輸出語(yǔ)句)。

例3-2計(jì)算兩個(gè)數(shù)的和。從鍵盤上輸入兩個(gè)數(shù),求它們的和并把結(jié)果從控制臺(tái)輸出。

分析:不妨假設(shè)這兩個(gè)數(shù)是整數(shù),因此要設(shè)計(jì)三個(gè)整型變量分別保存兩個(gè)加數(shù)和結(jié)果。由于要通過(guò)鍵盤錄入數(shù)據(jù),因此要導(dǎo)入java.util.Scanner。

程序清單如下:

執(zhí)行該程序,當(dāng)輸入3和4時(shí),運(yùn)行結(jié)果如下:

讀者可以依照此例完成減法、乘法、除法等運(yùn)算。

3.3.4分支結(jié)構(gòu)

分支結(jié)構(gòu)又稱選擇結(jié)構(gòu)或條件結(jié)構(gòu)。分支結(jié)構(gòu)是一種由特定的條件決定執(zhí)行哪個(gè)語(yǔ)句分支的程序結(jié)構(gòu)。也就是說(shuō),在程序執(zhí)行時(shí),先對(duì)給定條件進(jìn)行判斷,然后根據(jù)判斷結(jié)果執(zhí)行相應(yīng)的語(yǔ)句或語(yǔ)句序列。

使用分支結(jié)構(gòu)可以使程序根據(jù)不同的情況執(zhí)行不同的動(dòng)作,如同運(yùn)用“紅燈停,綠燈行”的規(guī)則來(lái)確定是否過(guò)馬路一樣。

在Java語(yǔ)言中,實(shí)現(xiàn)分支結(jié)構(gòu)程序設(shè)計(jì)的結(jié)構(gòu)有:簡(jiǎn)單的if結(jié)構(gòu)、if…else結(jié)構(gòu)和if…elseif結(jié)構(gòu)、多分支switch結(jié)構(gòu)等。而switch結(jié)構(gòu)可以與if結(jié)構(gòu)相互替代。

1.簡(jiǎn)單的if結(jié)構(gòu)

簡(jiǎn)單if結(jié)構(gòu)控制流程圖如圖3-4所示。

語(yǔ)法格式:

if(<表達(dá)式>)

{

<程序塊>

}

功能:當(dāng)表達(dá)式的值為true時(shí),執(zhí)行程序塊語(yǔ)句;為false時(shí),跳過(guò)該語(yǔ)句塊。無(wú)論真假與否,后續(xù)的語(yǔ)句都要執(zhí)行。圖3-4簡(jiǎn)單if結(jié)構(gòu)控制流程圖

說(shuō)明:

①?if后面的表達(dá)式必須是條件表達(dá)式或邏輯表達(dá)式,且必須用圓括號(hào)括起來(lái),不能省略,否則將不能通過(guò)編譯。

②?if后面的如果是條件表達(dá)式,且是相等關(guān)系時(shí),一定要用“=?=”,如果用成賦值“=”的話,就有編輯錯(cuò)誤提示。

③?if結(jié)構(gòu)中的程序塊,如果是單條語(yǔ)句,可以不用“{}”括起來(lái);如果是語(yǔ)句序列,就必須用“{}”括起來(lái)。建議無(wú)論是單條語(yǔ)句還是復(fù)合語(yǔ)句,都用“{}”括起來(lái),以免造成理解上的歧義,而且便于程序的擴(kuò)展。

例3-3編寫(xiě)一個(gè)程序:對(duì)于輸入的兩個(gè)數(shù)x和y,輸出其中較大者。

分析:如果只有一個(gè)數(shù),這個(gè)數(shù)本身就是所求的較大數(shù)。當(dāng)有多于一個(gè)數(shù)時(shí),先把第一個(gè)數(shù)看作最大數(shù)max,再與后邊的數(shù)進(jìn)行比較,將較大的數(shù)賦給max,這樣就可以求出所給數(shù)中的最大數(shù)。

以整數(shù)為例,編程如下:

說(shuō)明:通過(guò)鍵盤輸入兩個(gè)整數(shù),首先將第一個(gè)數(shù)賦給變量max(其實(shí)就是x),然后再用這個(gè)數(shù)max與另一個(gè)數(shù)y進(jìn)行比較。當(dāng)max<y時(shí),將y賦給max,此時(shí)max中存放的是較大的數(shù);否則的話,繼續(xù)執(zhí)行之后的語(yǔ)句,輸出max。無(wú)論如何,輸出的總是兩個(gè)數(shù)中較大的一個(gè)。

執(zhí)行程序,當(dāng)從鍵盤上輸入兩個(gè)整型數(shù)據(jù)8和9時(shí),輸出較大數(shù)為9。

2.if…else結(jié)構(gòu)

if…else結(jié)構(gòu)控制流程圖如圖3-5所示。

語(yǔ)法格式:

if(表達(dá)式)

語(yǔ)句1;

else

語(yǔ)句2;

功能:如果表達(dá)式的值為true,則執(zhí)行語(yǔ)句1,否則執(zhí)行語(yǔ)句2。

例3-4編寫(xiě)一個(gè)程序,求輸入的兩個(gè)數(shù)的商的運(yùn)算。

分析:在除法運(yùn)算中,除數(shù)不能為0,否則沒(méi)有意義。比較以下兩個(gè)程序。

程序1:

程序2:

說(shuō)明:

①兩個(gè)程序都能完成正常運(yùn)算。但前者不具有良好的人機(jī)界面。當(dāng)除數(shù)為0時(shí),程序結(jié)束,什么信息也沒(méi)有,會(huì)讓使用者不知所措;而后者給出了當(dāng)除數(shù)為0時(shí)的提示信息。

②對(duì)于整型數(shù)a和b,求其商時(shí),結(jié)果仍然是整數(shù),即只取商的整數(shù)部分。要想求出其算術(shù)結(jié)果,可以用1.0*a/b或者(double)a/b強(qiáng)制將其轉(zhuǎn)換成小數(shù)形式。

3.if…elseif結(jié)構(gòu)

if…elseif結(jié)構(gòu)控制流程圖如圖3-6所示。

語(yǔ)法格式:

if(表達(dá)式1)

語(yǔ)句1;

elseif(表達(dá)式2)

語(yǔ)句2;

elseif(表達(dá)式m)

語(yǔ)句m;

else

語(yǔ)句n;圖3-6if…elseif結(jié)構(gòu)控制流程圖

功能:依次判斷表達(dá)式的值,當(dāng)出現(xiàn)某個(gè)值為true時(shí),則執(zhí)行該條件之后對(duì)應(yīng)的語(yǔ)句,然后跳到整個(gè)if結(jié)構(gòu)之外繼續(xù)執(zhí)行程序;如果所有的表達(dá)式均為false時(shí),則執(zhí)行語(yǔ)句n,然后繼續(xù)執(zhí)行后續(xù)程序。多分支if結(jié)構(gòu)可以通過(guò)分段函數(shù)來(lái)解析。

例3-5編寫(xiě)一個(gè)程序,對(duì)學(xué)生的考試成績(jī)給出評(píng)定信息。成績(jī)大于或等于90分,輸出“優(yōu)秀”;成績(jī)大于或等于80分而小于90分,輸出“優(yōu)良”;成績(jī)大于或等于70分而小于80分,輸出“中等”;成績(jī)大于或等于60分而小于70分,輸出“及格”;小于60分的,輸出“不及格”。

分析:百分制的有效成績(jī)是0~100分。把成績(jī)劃分成五個(gè)區(qū)段,每個(gè)區(qū)段有唯一對(duì)應(yīng)的值,相當(dāng)于數(shù)學(xué)中的分段函數(shù)。

程序清單如下:

該程序的執(zhí)行過(guò)程為提示用戶輸入一個(gè)學(xué)生成績(jī),將其存放在變量score中,然后使用if…elseif結(jié)構(gòu)逐個(gè)判斷score變量中的值滿足了哪個(gè)條件,就執(zhí)行之后的輸出語(yǔ)句;不滿足則檢查之后的else子句,直到找到匹配的條件或者到達(dá)程序結(jié)尾。

事實(shí)上,當(dāng)我們給出一個(gè)問(wèn)題的時(shí)候,其變量的定義域也就確定了,如本例中成績(jī)變量的定義域中整數(shù)[0,100],這就是全集,我們給的測(cè)試數(shù)據(jù)都在這個(gè)范圍內(nèi)。else(或elseif)執(zhí)行的情況就是前面全部if語(yǔ)句條件并在了全集中的補(bǔ)集,因此該結(jié)構(gòu)保證了條件的互不相容且完備。而多重if就不一樣了,雖然各個(gè)條件清晰明了,但有可能不小心某些條件有交集或者落掉某個(gè)條件。

建議盡量用if…elseif結(jié)構(gòu)而少用多重if結(jié)構(gòu)編程,特別是對(duì)于定義域是連續(xù)區(qū)域的情況。

4.if分支嵌套

分支結(jié)構(gòu)中,如果一個(gè)if語(yǔ)句中又包含一個(gè)或多個(gè)if語(yǔ)句,則構(gòu)成了if嵌套。一般有如下兩種情形:

當(dāng)嵌套內(nèi)的if結(jié)構(gòu)可能又是if…else結(jié)構(gòu)時(shí),將會(huì)出現(xiàn)多個(gè)if和多個(gè)else交疊使用的情況,這時(shí)要特別注意if和else的配對(duì)問(wèn)題,例如:

Java語(yǔ)言規(guī)定,else總是與它前面最近的if配對(duì),因此對(duì)上述例子應(yīng)按后一種情況理解。為了避免產(chǎn)生二義性,一般情況下,無(wú)論是單行語(yǔ)句還是多行語(yǔ)句,無(wú)論是簡(jiǎn)單的條件語(yǔ)句還是條件嵌套語(yǔ)句,編程時(shí)都用“{}”括起來(lái)。

例3-6求一元二次方程式ax2+bx+c=0的根。

分析:輸入一元二次方程的系數(shù)a、b、c,利用求根公式求得方程的解或判斷無(wú)實(shí)數(shù)解。首先要看所給的三個(gè)數(shù)能否構(gòu)成一個(gè)一元二次方程,即看數(shù)a是否不為0;如果能,再判斷該方程有無(wú)實(shí)數(shù)根,即判別式的值是否非負(fù);如果非負(fù),通過(guò)求根公式計(jì)算出根并輸出,否則輸出該方程無(wú)實(shí)數(shù)根。程序流程圖如圖3-7所示。圖3-7求解方程ax2+bx+c=0的根的流程圖

程序清單如下:

說(shuō)明:該程序中使用了if嵌套,在else中有另一個(gè)if語(yǔ)句。先是判斷是否能構(gòu)成一個(gè)一元二次方程,不能的話輸出“不能構(gòu)成一元二次方程”;在能構(gòu)成一元二次方程的情況下,再判斷是否有實(shí)數(shù)根,無(wú)實(shí)數(shù)根時(shí)輸出“該方程無(wú)實(shí)數(shù)根!”;在有實(shí)數(shù)根的情況下,再求算出實(shí)數(shù)根并輸出。sqrt()方法是定義在java.lang包中的publicfinalMath類中的方法,可直接加前綴Math調(diào)用。

執(zhí)行程序:輸入三組數(shù)據(jù)(0,-1,-2),(2,3,4)和(1,-4,3),執(zhí)行結(jié)果分別如下所示。

例3-7健康健美的體格是大家都追求的。身體質(zhì)量指數(shù)(BodyMassIndex,BMI)是通過(guò)體重(千克數(shù))和身高(米數(shù))這兩個(gè)參數(shù),計(jì)算出BMI值,從而量化地給出身體胖瘦的指數(shù)。

體重指數(shù)標(biāo)準(zhǔn)參照以下分段函數(shù):

分析:該程序條件判斷比較多,先要判斷性別,然后不同性別有不同的BMI判斷條件,非常適合用條件嵌套。程序代碼如下:

說(shuō)明:

①?String是字符串類型,屬于引用數(shù)據(jù)類型,在第4章會(huì)詳細(xì)介紹。

②?Stringstr1這個(gè)字符串對(duì)象用于保存性別的中文值;str用于保存體型特征。用sex==0為真判斷為女性,否則為男性,也就是說(shuō)除0以外其他的整型數(shù)都是男性。

③外層的if…else是判斷男女的兩個(gè)分支,而分支內(nèi)部又嵌套了各自的if…elseif結(jié)構(gòu),用來(lái)判斷BMI所代表的體型特征。

執(zhí)行程序:當(dāng)按提示依次輸入1、65、1.70后,運(yùn)行過(guò)程及結(jié)果如下:

按提示依次輸入0、52、1.62后,運(yùn)行過(guò)程及結(jié)果如下:

5.switch…case結(jié)構(gòu)

在判斷過(guò)程中,有時(shí)會(huì)用到很多條件,需要使用多個(gè)else語(yǔ)句,這樣將會(huì)導(dǎo)致程序邏輯復(fù)雜、代碼過(guò)于冗長(zhǎng),甚至影響到程序的可讀性。Java語(yǔ)言提供了另一種多分支結(jié)構(gòu)switch來(lái)優(yōu)化程序的結(jié)構(gòu)。

switch結(jié)構(gòu)控制流程圖如圖3-8所示。

圖3-8switch結(jié)構(gòu)控制流程圖

語(yǔ)法格式:

功能:計(jì)算出表達(dá)式的值。當(dāng)與某個(gè)常量表達(dá)式的值匹配時(shí),就執(zhí)行其后的語(yǔ)句,當(dāng)執(zhí)行到“break;”語(yǔ)句時(shí),跳出switch結(jié)構(gòu),繼續(xù)執(zhí)行switch結(jié)構(gòu)之后的語(yǔ)句;當(dāng)表達(dá)式的值與所有的值都不匹配時(shí),執(zhí)行default之后的語(yǔ)句。從程序流程上看,switch結(jié)構(gòu)可以用點(diǎn)函數(shù)來(lái)解析。

說(shuō)明:

①關(guān)鍵字switch后面的表達(dá)式可以是整型或字符型的,也可以是枚舉類型的。

②每個(gè)case后面的常量表達(dá)式只能是常量組成的表達(dá)式,當(dāng)switch后面的表達(dá)式的值與某一個(gè)常量表達(dá)式的值一致時(shí),程序就轉(zhuǎn)到此case后面的語(yǔ)句開(kāi)始執(zhí)行。如果沒(méi)有一個(gè)常量表達(dá)式的值與switch后面的值一致,就執(zhí)行default后面的語(yǔ)句;當(dāng)default缺省時(shí),就直接跳到switch結(jié)構(gòu)后面的語(yǔ)句。

③每個(gè)case后面的常量表達(dá)式的值必須互不相同,否則會(huì)出現(xiàn)編譯錯(cuò)誤。

④各個(gè)case的次序不影響執(zhí)行結(jié)果,一般情況下,盡量將出現(xiàn)概率大的case放在前面。

⑤在執(zhí)行完一個(gè)case后面的語(yǔ)句后,程序流程轉(zhuǎn)到下一個(gè)case后面的語(yǔ)句開(kāi)始執(zhí)行。千萬(wàn)不要理解成執(zhí)行完一個(gè)case后,程序就轉(zhuǎn)到switch后面的語(yǔ)句去執(zhí)行了。只有執(zhí)行的過(guò)程中遇到“break;”語(yǔ)句時(shí),才跳出switch結(jié)構(gòu)。執(zhí)行完某個(gè)case后,如果沒(méi)有“break;”語(yǔ)句,會(huì)順序執(zhí)行之后的其他case及switch結(jié)構(gòu)之后的語(yǔ)句。

⑥?switch結(jié)構(gòu)中,“case常量表達(dá)式:”后面是英文冒號(hào)。

⑦?default這個(gè)標(biāo)記可以省略,且與case的先后順序可以變動(dòng),不影響程序的執(zhí)行結(jié)果。

⑧多個(gè)case可以共用一段程序。

⑨一個(gè)case可以有多條語(yǔ)句時(shí),不必用“{}”括起來(lái)。

例3-8簡(jiǎn)單的計(jì)算器設(shè)計(jì)。輸入兩個(gè)數(shù),計(jì)算出它們的和、差、積、商。

分析:簡(jiǎn)單計(jì)算器只有兩個(gè)操作數(shù)和一個(gè)運(yùn)算符,運(yùn)算符有四種情況:+、-、*、/。在Java語(yǔ)言中,由于沒(méi)有直接獲得字符的方法,要借助字符串及其函數(shù)來(lái)實(shí)現(xiàn)。

程序清單如下:

說(shuō)明:注意程序中print()方法與println()方法用法的不同。前者不換行,后者回車換行。

執(zhí)行該程序,按提示輸入數(shù)據(jù),對(duì)各種情況進(jìn)行執(zhí)行,結(jié)果分別如下所示。

6.if結(jié)構(gòu)和switch結(jié)構(gòu)的比較

多重if結(jié)構(gòu)或if…elseif結(jié)構(gòu)和switch結(jié)構(gòu)都可以用來(lái)實(shí)現(xiàn)多路分支。多重if結(jié)構(gòu)或if…elseif結(jié)構(gòu)在實(shí)現(xiàn)兩路、三路分支結(jié)構(gòu),且條件變量是在一個(gè)連續(xù)的區(qū)域時(shí)較為方便;而switch結(jié)構(gòu)在實(shí)現(xiàn)三路以上分支結(jié)構(gòu),且處理的數(shù)據(jù)是可枚舉型時(shí)比較方便。在使用switch結(jié)構(gòu)時(shí),應(yīng)注意分支條件必須是整型表達(dá)式或字符變量,case標(biāo)識(shí)后面必須是常數(shù)表達(dá)式。在使用switch結(jié)構(gòu)時(shí)很多問(wèn)題都不能滿足這一要求,必須先做轉(zhuǎn)換。對(duì)條件是一個(gè)范圍或不是整型的情況時(shí),往往需要用if結(jié)構(gòu)來(lái)解決,甚至只能用if結(jié)構(gòu)來(lái)實(shí)現(xiàn)。

例3-9判斷輸入字符的分類(用多重if結(jié)構(gòu))。

分析:此問(wèn)題中,條件變量是字符型的。字符型可以轉(zhuǎn)換成整型。因?yàn)樗鼈兊拇鎯?chǔ)和取值范圍都相同。在ASCII編碼中,當(dāng)碼值小于32時(shí)為控制字符;碼值為48~57時(shí),對(duì)應(yīng)數(shù)字字符0~9;當(dāng)碼值為65~90時(shí),對(duì)應(yīng)大寫(xiě)字母A~Z;當(dāng)碼值為97~122時(shí),對(duì)應(yīng)小寫(xiě)字母a~z;其余的為其他字符。

程序清單如下:

該程序中,不同種類的數(shù)據(jù)都有一個(gè)取值范圍,所以使用if…elseif結(jié)構(gòu)比較好。如果使用switch結(jié)構(gòu),那對(duì)應(yīng)的case就有128條之多,程序顯得過(guò)于龐大。對(duì)于不同類型的數(shù)據(jù),運(yùn)行結(jié)果如下所示。

例3-10用switch結(jié)構(gòu)改寫(xiě)學(xué)生成績(jī)?cè)u(píng)定程序。

分析:學(xué)生成績(jī)的取值范圍是0~100,如果僅限于整數(shù),就有101種情況;如果是1位小數(shù),就有1001種情況。直接用switch結(jié)構(gòu),case太多。由于成績(jī)?cè)u(píng)定是以10為臺(tái)階的,根據(jù)整數(shù)運(yùn)算的特點(diǎn),用score/10就把整型情況變成11種不同的case(如果是一位小數(shù),可以用(int)(score*10)/100)。但是超出范圍的數(shù)據(jù)(大于100或小于0)用default不能完全解決,因?yàn)?00~109除以10均得10,-9~0除以10均得0。為了彌補(bǔ)這個(gè)漏洞,可以用if…else結(jié)構(gòu)將有效數(shù)據(jù)規(guī)范在0~100的范圍內(nèi),在有效的范圍內(nèi)再用switch…case結(jié)構(gòu),即使用if結(jié)構(gòu)嵌套switch結(jié)構(gòu)完成本程序設(shè)計(jì)任務(wù)。

程序清單如下:

說(shuō)明:

①程序中可以不設(shè)計(jì)rank對(duì)象,“rank="及格!";”等語(yǔ)句可以直接用println()輸出,但是看起來(lái)程序繁瑣得多。而使用rank對(duì)象,對(duì)不同的情況統(tǒng)一處理,非常簡(jiǎn)捷。

②分支的并行與嵌套對(duì)于完美地解決復(fù)雜問(wèn)題是很有必要的。在程序設(shè)計(jì)前,先對(duì)待處理的數(shù)據(jù)進(jìn)行分析,設(shè)計(jì)合理的算法,這是我們要掌握的關(guān)鍵所在。

3.3.5循環(huán)結(jié)構(gòu)

循環(huán)結(jié)構(gòu)是指在程序中需要反復(fù)執(zhí)行某個(gè)功能而設(shè)計(jì)的一種程序結(jié)構(gòu)。它由循環(huán)體中的條件來(lái)判斷是否繼續(xù)執(zhí)行某個(gè)功能還是退出循環(huán)。

循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書(shū)寫(xiě)的工作量,用來(lái)解決重復(fù)執(zhí)行某段算法的問(wèn)題,這是程序設(shè)計(jì)中最能發(fā)揮計(jì)算機(jī)特長(zhǎng)的程序結(jié)構(gòu)。循環(huán)結(jié)構(gòu)可以看成是一個(gè)條件判斷語(yǔ)句和一個(gè)向回轉(zhuǎn)向語(yǔ)句的組合。循環(huán)結(jié)構(gòu)的三個(gè)要素是循環(huán)變量、循環(huán)體和循環(huán)終止條件。

常見(jiàn)的循環(huán)結(jié)構(gòu)有以下兩種。

(1)當(dāng)型循環(huán):先判斷所給條件是否成立,若條件成立(為true時(shí)),則執(zhí)行循環(huán)體;之后再次判斷條件是否成立,若條件成立,則再次執(zhí)行循環(huán)體。如此反復(fù),直到條件不成立(為false)時(shí)終止循環(huán)。

(2)直到型循環(huán):先執(zhí)行循環(huán)體,再判斷所給條件是否成立,若條件不成立,則再執(zhí)行循環(huán),如此反復(fù),直到循環(huán)條件成立,該循環(huán)過(guò)程結(jié)束。

循環(huán)的兩種結(jié)構(gòu)流程圖如圖3-9所示。圖3-9循環(huán)的兩種基本結(jié)構(gòu)

Java語(yǔ)言中,常用的循環(huán)結(jié)構(gòu)有for循環(huán)、while循環(huán)和do…while循環(huán)三種。

1.for循環(huán)

語(yǔ)法格式:

for(表達(dá)式1;表達(dá)式2;表達(dá)式3)

語(yǔ)句;

for循環(huán)結(jié)構(gòu)的流程圖如圖3-10所示。圖3-10for循環(huán)結(jié)構(gòu)流程圖

說(shuō)明:

①首先計(jì)算表達(dá)式1的值,這個(gè)表達(dá)式通常是初始化變量,整個(gè)循環(huán)過(guò)程中該表達(dá)式只執(zhí)行一次。

②表達(dá)式2通常是循環(huán)結(jié)束條件,一般為關(guān)系表達(dá)式或邏輯表達(dá)式,如果該表達(dá)式的值為true,則執(zhí)行循環(huán)體語(yǔ)句,然后計(jì)算表達(dá)式3,之后再次進(jìn)行循環(huán)條件(表達(dá)式2)的判斷,形成循環(huán);否則,不執(zhí)行循環(huán)體中的語(yǔ)句,退出循環(huán)。

③表達(dá)式3通常用于修改循環(huán)變量,一般是賦值語(yǔ)句。

基于以上三點(diǎn),也可以把for循環(huán)結(jié)構(gòu)理解成:

for(循環(huán)變量賦初值;循環(huán)終止條件;循環(huán)變量步長(zhǎng)增量)

語(yǔ)句;

④?for循環(huán)是Java語(yǔ)言中功能最強(qiáng)、應(yīng)用最廣、使用最靈活的一種循環(huán)結(jié)構(gòu)。它不僅可以用于循環(huán)次數(shù)確定的情況,也可以用于循環(huán)次數(shù)不確定而只給出了循環(huán)結(jié)束條件的情況。

⑤三個(gè)表達(dá)式之間必須用分號(hào)(?;?)隔開(kāi),表達(dá)式可以省略,但分號(hào)不能省略。括號(hào)后不能加“;”,否則表示循環(huán)體為空,即執(zhí)行空循環(huán)。

⑥三個(gè)表達(dá)式中都可使用由逗號(hào)(?,?)運(yùn)算符將多個(gè)表達(dá)式組成的表達(dá)式。

例3-11求1+2+…+100的值。

分析:設(shè)計(jì)兩個(gè)變量,一個(gè)保存加數(shù)i,一個(gè)保存前i個(gè)數(shù)的和sum。i的初始化值為1,sum的初始化值為0。程序可以用簡(jiǎn)單語(yǔ)句順序地執(zhí)行如下:

在此程序中,反復(fù)使用的就是“i++;”和“sum+=i;”這兩條語(yǔ)句。使用循環(huán)結(jié)構(gòu),程序的書(shū)寫(xiě)就要簡(jiǎn)單得多?!癷++;”就是循環(huán)變量的迭代;“sum+=i;”就是循環(huán)體。

循環(huán)體語(yǔ)句可以是空語(yǔ)句、單條語(yǔ)句或多條語(yǔ)句,是多條語(yǔ)句時(shí),必須用{}括起來(lái)。for語(yǔ)句的執(zhí)行過(guò)程還可以用如圖3-11所示的三角模型來(lái)表示,上面例子中的“i++;”是末尾循環(huán)體;“sum+=i;”是中間循環(huán)體。圖3-11for循環(huán)三角模型

程序清單如下:

說(shuō)明:在初始化時(shí),和的初值一般設(shè)定為0,積的初值一般設(shè)定為1。讀者還可以依照此例完成100以內(nèi)的奇數(shù)(偶數(shù))的和,注意初始值的設(shè)定(求奇數(shù)和時(shí),循環(huán)變量初值設(shè)定為1;求偶數(shù)和時(shí),循環(huán)變量初值設(shè)定為2)和循環(huán)變量的迭代(i+=2)。

例3-12Fibonacci序列。Fibonacci序列是意大利數(shù)學(xué)家斐波那契在1202年提出的一個(gè)關(guān)于兔子繁殖問(wèn)題的遞歸模型。如果一對(duì)兔子每月能生一對(duì)小兔(一雄一雌),而每對(duì)小兔在它出生后的第三個(gè)月里,又開(kāi)始生一對(duì)小兔。假定在不發(fā)生死亡的情況下,從第一對(duì)出生的小兔開(kāi)始,50個(gè)月后會(huì)有多少對(duì)兔子。

分析:從遞歸表達(dá)式可以看出,從第三個(gè)月開(kāi)始,每月兔子的總對(duì)數(shù)就等于前兩個(gè)月兔子對(duì)數(shù)的和。程序的關(guān)鍵在于如何把本月和上個(gè)月的數(shù)目表示成下個(gè)月的前兩個(gè)月的數(shù)目,程序清單如下:

為什么會(huì)有負(fù)數(shù)出現(xiàn)?這是因?yàn)閕nt類型數(shù)占32位,而在內(nèi)存存儲(chǔ)時(shí),最高位為1表示負(fù)數(shù),0表示正數(shù),所以當(dāng)數(shù)據(jù)值長(zhǎng)度超過(guò)二進(jìn)制31位時(shí),再增加就可能成負(fù)數(shù)了,這就是數(shù)據(jù)溢出。因此在程序設(shè)計(jì)時(shí),要選擇合適的數(shù)據(jù)類型,以取得正確的結(jié)果。

注意:在for循環(huán)中,三個(gè)表達(dá)式都是可以缺省的,但無(wú)論如何,分號(hào)是不可缺省的。以1+2+…+100為例,解釋表達(dá)式缺省的情況。

①缺省表達(dá)式1。

從for循環(huán)的執(zhí)行過(guò)程可知,表達(dá)式1的功能是給循環(huán)變量初始化,僅執(zhí)行一次,因此在for結(jié)構(gòu)之前給循環(huán)變量賦了初值,表達(dá)式1就可以缺省。改寫(xiě)例3-11,程序清單如下:

②缺省表達(dá)式2。

缺省此表達(dá)式即不判斷循環(huán)結(jié)束條件,也就是認(rèn)為循環(huán)條件始終為真,這樣循環(huán)就無(wú)法自動(dòng)結(jié)束,即進(jìn)入死循環(huán)。因此必須在循環(huán)體中加入終止條件,每次執(zhí)行循環(huán)體時(shí),都判斷循環(huán)是否結(jié)束。一般使用if+break結(jié)構(gòu)來(lái)實(shí)現(xiàn)循環(huán)結(jié)束。改寫(xiě)例3-11,程序清單如下:

③缺省表達(dá)式3。

缺省此表達(dá)式即省去修改循環(huán)變量的值。每次執(zhí)行完循環(huán)體之后執(zhí)行表達(dá)式3。如果把表達(dá)式3放在循環(huán)體的最后一行,即在循環(huán)體內(nèi)改變循環(huán)變量的值,可以達(dá)到同樣的效果。改寫(xiě)例3-11,程序清單如下:

④三個(gè)表達(dá)式缺省兩個(gè)或全缺省。

既不為循環(huán)變量賦初值,也不設(shè)置循環(huán)條件或循環(huán)變量的改變,這樣就形成一個(gè)死循環(huán)??此茮](méi)有意義,其實(shí)不然,正是for(;;)結(jié)構(gòu)給出了循環(huán)的機(jī)制,才能實(shí)現(xiàn)循環(huán)。改寫(xiě)例3-11,程序清單如下:

2.while循環(huán)

語(yǔ)法格式:

while(表達(dá)式)

語(yǔ)句塊;

其中,表達(dá)式是循環(huán)條件,語(yǔ)句塊為循環(huán)體,其結(jié)構(gòu)流程圖如圖3-12所示。

功能:用于在特定條件為真的情況下重復(fù)執(zhí)行某些操作。在執(zhí)行循環(huán)體之前先檢查條件,一旦條件為假,立即停止循環(huán)。圖3-12while循環(huán)結(jié)構(gòu)流程圖

使用while結(jié)構(gòu)時(shí)要注意以下幾點(diǎn):

(1)循環(huán)條件可以是任何表達(dá)式,但常用的是關(guān)系型或邏輯型表達(dá)式。條件括號(hào)之后不能直接跟“;”,除非你想做的是空循環(huán)。

(2)循環(huán)體語(yǔ)句可以是空語(yǔ)句、單條語(yǔ)句或多條語(yǔ)句。當(dāng)為多條語(yǔ)句時(shí),必須用“{}”括起來(lái)。

(3)?while循環(huán)的循環(huán)體至少執(zhí)行0次。

(4)循環(huán)次數(shù)的控制要正確。使用循環(huán)結(jié)構(gòu)時(shí),可以通過(guò)循環(huán)變量來(lái)控制循環(huán)次數(shù)。使用循環(huán)變量控制循環(huán)次數(shù)時(shí),要注意保證控制的準(zhǔn)確性。在while循環(huán)中,循環(huán)變量的取值決定了結(jié)果的正確與否。比如條件若是i<100,結(jié)果就不是5050,而是4950了。

(5)在循環(huán)體中,一定要有使循環(huán)趨于結(jié)束的操作(如例3-12中的i++)。

(6)在循環(huán)體中,語(yǔ)句的先后順序必須符合邏輯,否則會(huì)影響結(jié)果。

(7)可以在循環(huán)體中使用if+break語(yǔ)句組合,控制循環(huán)。

例3-13用while循環(huán)計(jì)算1+2+…+100的值。

程序清單如下:

例3-14愛(ài)因斯坦階梯問(wèn)題。設(shè)有一個(gè)階梯,每步跨2級(jí),最后余1級(jí);每步跨3級(jí),最后余2級(jí);每步跨5級(jí),最后余4級(jí);每步跨6級(jí),最后余5級(jí);每步跨7級(jí),正好到梯頂。問(wèn)至少有多少級(jí)階梯。

分析:可以用for循環(huán),從1開(kāi)始逐個(gè)驗(yàn)證這個(gè)數(shù)是否除以2余1(每步跨2級(jí),最后余1級(jí))、除以3余2(每步跨3級(jí),最后余2級(jí))、除以5余4(每步跨5級(jí),最后余4級(jí))、除以6余5(每步跨6級(jí),最后余5級(jí))、能被7整除(每步跨7級(jí),正好到梯頂)。到第一個(gè)滿足條件時(shí),就是最少的階梯數(shù)。這就是暴力破解的思想。

顯然階梯數(shù)是7的倍數(shù),又是奇數(shù)(每步跨2級(jí),最后余1級(jí))。這樣可以依次對(duì)7、7+14、7+14+14……進(jìn)行測(cè)試,看是否除以3余2、除以5余4、除以6余5……直到找到適合條件的數(shù)。這樣程序執(zhí)行次數(shù)就大大減少了。

這個(gè)問(wèn)題還可以這樣理解,多一級(jí)階梯時(shí),階梯的級(jí)數(shù)就是2、3、5、6的倍數(shù),也就是說(shuō)比2、3、5、6公倍數(shù)少1。這樣,階梯變量的初值可以設(shè)為29,每次增加30,循環(huán)結(jié)束的條件為階梯的級(jí)數(shù)能被7整除。這樣程序就更簡(jiǎn)單了。

程序清單如下:

說(shuō)明:循環(huán)條件設(shè)為i<10000。有讀者會(huì)問(wèn),你怎么知道是10000以內(nèi)呢?其實(shí)你擔(dān)心超出10000也可以給再大點(diǎn),因?yàn)楫?dāng)有滿足條件的數(shù)出現(xiàn)時(shí),就“break;”了,沒(méi)有必要為這個(gè)數(shù)該取多大而糾結(jié)。其實(shí)在實(shí)際操作中,第一種方法完全可以完成任務(wù),即暴力破解是可行的,而且現(xiàn)在計(jì)算機(jī)的內(nèi)存和速度也不需要節(jié)省,有正確的結(jié)果才是王道。這里只是告訴大家,在程序設(shè)計(jì)時(shí),算法的合理與優(yōu)化是需要下工夫去探索的。

3.do…while循環(huán)

語(yǔ)法格式:

do{

語(yǔ)句;

}while(表達(dá)式);

do…while循環(huán)的結(jié)構(gòu)流程圖如圖3-13所示。

功能:先進(jìn)入循環(huán)體,執(zhí)行一次循環(huán),然后再計(jì)算表達(dá)式的值。若值為假(false),則終止循環(huán);否則返回到do,開(kāi)始下一次的循環(huán)。圖3-13do…whil循環(huán)的結(jié)構(gòu)流程圖

說(shuō)明:

①?do是Java語(yǔ)言中的關(guān)鍵字,必須與while配對(duì)使用,實(shí)現(xiàn)循環(huán)。

②?do…while循環(huán)是從do開(kāi)始,到while結(jié)束,while(表達(dá)式)后必須有“;”,表示do…while循環(huán)是一條完整的語(yǔ)句。

③當(dāng)循環(huán)體中包含多條語(yǔ)句時(shí),必須用“{}”括起來(lái)。

④循環(huán)中的條件必須是關(guān)系型或邏輯型表達(dá)式。

⑤由于該語(yǔ)句執(zhí)行時(shí),先執(zhí)行一次循環(huán),故最少執(zhí)行次數(shù)為1,這也是與while結(jié)構(gòu)的最大區(qū)別。

⑥一般情況下,while循環(huán)和do…while循環(huán)編寫(xiě)的程序可以互相改寫(xiě)。

例3-15用do…while計(jì)算1+2+…+100。

程序清單如下:

例3-16猜數(shù)字游戲。電視娛樂(lè)節(jié)目中有一個(gè)購(gòu)物游戲,讓你看物品猜價(jià)格。在一定的條件下,你有多次猜測(cè)的機(jī)會(huì),每次猜完后提示價(jià)格“高了”或是“低了”,直到猜中,根據(jù)花費(fèi)的時(shí)間和被提示的次數(shù)來(lái)打分。

編制一個(gè)程序,模擬這個(gè)猜價(jià)格游戲過(guò)程。

分析:這是一個(gè)典型的do…while結(jié)構(gòu)應(yīng)用案例,因?yàn)闊o(wú)論如何,你得猜一次。在猜的過(guò)程中,由于要判斷是否與要猜的數(shù)字相同,所以需要用到if…else結(jié)構(gòu)。在猜完之后,要根據(jù)猜的次數(shù)給出評(píng)語(yǔ),這又可以用到switch…case結(jié)構(gòu)。采用循環(huán)與分支的結(jié)合,可以完美地完成這個(gè)任務(wù)。

程序清單如下:

說(shuō)明:

①?java.util.Random類是用于產(chǎn)生隨機(jī)數(shù)的,它的nextInt(100)方法是隨機(jī)產(chǎn)生一個(gè)100以內(nèi)的非負(fù)整數(shù)。

②?count變量在程序中起到了計(jì)數(shù)器的作用,每猜一次,計(jì)數(shù)器加1。

執(zhí)行該程序,結(jié)果如下:

4.跳轉(zhuǎn)語(yǔ)句

有時(shí)可能不知道循環(huán)執(zhí)行的次數(shù),沒(méi)有辦法給出確定的退出條件。有時(shí)在循環(huán)的過(guò)程中,不必要每次都順序地執(zhí)行完循環(huán)體,而需要跳過(guò)循環(huán)體中的一些語(yǔ)句,這時(shí)就要用到流程跳轉(zhuǎn)語(yǔ)句了。

(1)?break語(yǔ)句。

語(yǔ)句格式:

break;

功能:跳出當(dāng)前的switch結(jié)構(gòu)或循環(huán)結(jié)構(gòu)。

break語(yǔ)句對(duì)于減少循環(huán)次數(shù)、加快程序執(zhí)行起著重要的作用。break語(yǔ)句在switch語(yǔ)句中的用法已經(jīng)講過(guò),其功能是跳過(guò)匹配的case之后的語(yǔ)句而結(jié)束switch結(jié)構(gòu),繼續(xù)執(zhí)行switch結(jié)構(gòu)后面的語(yǔ)句。break語(yǔ)句在循環(huán)結(jié)構(gòu)中與在switch中的功能類似,在循環(huán)體中遇到break,結(jié)束循環(huán),執(zhí)行循環(huán)結(jié)構(gòu)之后的語(yǔ)句。前邊的例子中已經(jīng)使用過(guò),這里不再贅述。在循環(huán)嵌套中,break語(yǔ)句用于結(jié)束本層循環(huán),向外跳到下一層循環(huán)。

以while結(jié)構(gòu)為例,break語(yǔ)句的功能流程圖如圖3-14所示。圖3-14break語(yǔ)句的控制流程圖

(2)?continue語(yǔ)句。

語(yǔ)句格式:

continue;

功能:結(jié)束本次循環(huán),即跳過(guò)本輪循環(huán)結(jié)構(gòu)中尚未執(zhí)行的語(yǔ)句,接著進(jìn)行循環(huán)條件的判定,準(zhǔn)備下一次的循環(huán)。以while結(jié)構(gòu)為例,continue語(yǔ)句的控制流程圖如圖3-15所示。圖3-15continue語(yǔ)句的控制流程圖

例3-17輸出1~100間所有7的倍數(shù)的數(shù),每行輸出10個(gè)。

分析:遍歷1~100這100個(gè)數(shù),如果是7的倍數(shù),即%7=0,就輸出,否則就丟棄。利用for+continue語(yǔ)句完成這項(xiàng)任務(wù)。

程序清單如下:

5.三種循環(huán)的比較

while、do…while和for這三種循環(huán)在用來(lái)處理同一問(wèn)題時(shí),一般情況下它們可以互相代替。while循環(huán)、do…while循環(huán)屬于當(dāng)型循環(huán),for循環(huán)屬于直到型循環(huán)。

用while循環(huán)和do…while循環(huán)時(shí),循環(huán)變量的初始化操作應(yīng)在循環(huán)體之前,而for循環(huán)一般在語(yǔ)句1中進(jìn)行;while循環(huán)和for循環(huán)都是先判斷表達(dá)式,后執(zhí)行循環(huán)體;而do…while循環(huán)是先執(zhí)行循環(huán)體后判斷表達(dá)式。也就是說(shuō)do…while的循環(huán)體最少被執(zhí)行一次,而while循環(huán)和for循環(huán)的循環(huán)體就可能一次都不執(zhí)行。

例3-18用循環(huán)結(jié)構(gòu)的三種形式來(lái)完成1!+2!+…+10!的程序設(shè)計(jì)。

分析:使用變量的好處之一就是它的值可以動(dòng)態(tài)地變化。這個(gè)看似兩重循環(huán)的問(wèn)題其實(shí)一個(gè)循環(huán)就可以搞定。

(1)用for循環(huán)程序清單如下:

(2)用while循環(huán)程序清單如下:

(3)用do…while循環(huán)程序清單如下:

6.變量的作用域

Java變量的作用范圍有類級(jí)、對(duì)象實(shí)例級(jí)、方法級(jí)和塊級(jí)四個(gè)級(jí)別。

·類級(jí)變量又稱全局級(jí)變量,在對(duì)象產(chǎn)生之前就已經(jīng)存在,它要用static修飾。

·對(duì)象實(shí)例級(jí)變量就是屬性變量(詳見(jiàn)第6章)。

·方法級(jí)就是在方法內(nèi)部定義的變量,是局部變量。

·塊級(jí)變量就是定義在一個(gè)塊內(nèi)部的變量,變量的生存周期就是這個(gè)塊,出了這個(gè)塊就消失了,如if、for語(yǔ)句塊中聲明的變量。

例3-19四種級(jí)別的變量使用,程序清單如下:

說(shuō)明:

①方法內(nèi)部除了能訪問(wèn)方法級(jí)的變量,還可以訪問(wèn)類級(jí)和實(shí)例級(jí)的變量。

②塊內(nèi)部能夠訪問(wèn)類級(jí)、實(shí)例級(jí)變量,如果塊被包含在方法內(nèi)部,它還可以訪問(wèn)方法級(jí)的變量。也可以這樣理解,塊級(jí)變量只在定義的塊中(且在定義點(diǎn)之后)有效,當(dāng)出了這個(gè)塊,該變量就失效了。

③方法級(jí)和塊級(jí)的變量必須被顯式初始化,否則不能訪問(wèn)。

7.多重循環(huán)與循環(huán)嵌套

若循環(huán)體中又包含有另一個(gè)循環(huán)結(jié)構(gòu),則稱之為循環(huán)嵌套,或嵌套的循環(huán)結(jié)構(gòu),或多重循環(huán)。

嵌套的外循環(huán)結(jié)構(gòu)稱為外循環(huán),被嵌套在外循環(huán)之內(nèi)的循環(huán)結(jié)構(gòu)稱為內(nèi)循環(huán)。必須注意,內(nèi)循環(huán)要完全包含在外循環(huán)體內(nèi)。

前面介紹了while、do…while和for三種類型的循環(huán),它們自己本身可以嵌套,也可以互相嵌套。

注意:

①外循環(huán)執(zhí)行一次,內(nèi)循環(huán)執(zhí)行一輪。即只有當(dāng)內(nèi)層循環(huán)結(jié)束時(shí),外層循環(huán)才進(jìn)入下一次循環(huán)。

②使用跳轉(zhuǎn)語(yǔ)句可以從循環(huán)體內(nèi)轉(zhuǎn)至循環(huán)體外,提前結(jié)束循環(huán)。

③可以用不同的嵌套方法實(shí)現(xiàn)同一個(gè)功能。

例3-20輸出100以內(nèi)的全部素?cái)?shù)。

分析:質(zhì)數(shù)也叫素?cái)?shù),是指除了1和本身之外沒(méi)有其他因數(shù)的正整數(shù),如7是素?cái)?shù)而8不是。1既不是質(zhì)數(shù)也不是合數(shù),最小的也是唯一的偶質(zhì)數(shù)是2。外循環(huán)i遍歷2~100,而內(nèi)循環(huán)j從2~i-1驗(yàn)證是不是i的因數(shù),如果是,直接跳出內(nèi)循環(huán)進(jìn)入下一輪循環(huán);如果全部都不是,那么這個(gè)i就是素?cái)?shù)了。事實(shí)上,j沒(méi)有必要從2~i-1驗(yàn)證,由于乘法滿足交換律,所以到i的平方根就可以了。

程序清單如下:

程序執(zhí)行結(jié)果如下:

例3-21組合數(shù)的計(jì)算。

組合數(shù)的計(jì)算,實(shí)際上是階乘的運(yùn)算,其公式為

分析:這是一個(gè)簡(jiǎn)單的多重循環(huán)問(wèn)題。階乘可以用循環(huán)來(lái)完成,三個(gè)階乘就是三個(gè)循環(huán),最后做乘除運(yùn)算就可以了。這個(gè)問(wèn)題的結(jié)果一定是整數(shù),所以不用擔(dān)心是否會(huì)有誤差。唯一擔(dān)心的是可能會(huì)溢出。

程序清單如下:

例3-22雞兔同籠問(wèn)題。?《孫子算經(jīng)》中有這樣一道題,今有雉兔同籠,上有三十五頭,下有九十四足。問(wèn):雉兔各幾何??(雉:雞)。

分析:雞兔各有一個(gè)頭,雞有兩只足,而兔有4只,各自的頭一旦確定,則足也確定了,當(dāng)頭和足同時(shí)滿足給定的條件時(shí),問(wèn)題就解決了。

在用Java語(yǔ)言編程解決實(shí)際問(wèn)題時(shí),如果能先做出它的數(shù)學(xué)表達(dá)式(模型),問(wèn)題就簡(jiǎn)單得多了。下列的編程就是基于一元一次方程的求解思路完成的。

程序清單如下:

例3-23九九乘法表。

分析:九九乘法表是一張二維表,所以總體上應(yīng)該使用循環(huán)嵌套完成。細(xì)節(jié)上,乘法表主體部分直接用循環(huán)嵌套;左上角的“*”要單獨(dú)輸出;表列頭1~9可以用循環(huán)一次完成;每行的頭需要在內(nèi)嵌循環(huán)中單獨(dú)輸出,然后循環(huán)輸出此行中表的內(nèi)容;要使表內(nèi)容排列整齊,可以用“\t”定位;每行結(jié)束要換行,可以單獨(dú)輸出。

程序執(zhí)行結(jié)果如下:

程序執(zhí)行結(jié)果如下:

3.4項(xiàng)目學(xué)做

該任務(wù)從只購(gòu)買一件商品到一次購(gòu)買多件商品、從普通顧客到VIP會(huì)員,用本章學(xué)習(xí)的結(jié)構(gòu)化程序設(shè)計(jì)的三種結(jié)構(gòu)來(lái)完成。模擬收銀臺(tái)操作的內(nèi)容,把掃碼和收銀員的錄入都看成是鍵盤錄入,對(duì)顧客在屏上顯示的內(nèi)容作為控制臺(tái)輸出。(1)僅購(gòu)買一件商品,付款額與價(jià)錢一樣,不用找零。這是一個(gè)簡(jiǎn)單的順序控制流程的例子。參考代碼如下:

(2)如果從超市購(gòu)得多件商品(比如三件),付款后需要找零,這仍然是順序控制的例子。程序清單如下:

(3)超市購(gòu)物打折計(jì)算。某超市規(guī)定,凡一次購(gòu)物在1000元及以上的打九折,在500元以上的打九五折,500元以下不打折。這里我們只考慮消費(fèi)總額,不考慮商品細(xì)節(jié)。使用分支結(jié)構(gòu)的if…elseif結(jié)構(gòu)完成。程序清單如下:

執(zhí)行程序,當(dāng)消費(fèi)額為1200元、840元、331元時(shí)的運(yùn)行結(jié)果如下所示:

(4)某超市規(guī)定,如果是VIP會(huì)員且消費(fèi)超過(guò)1000元的按8折優(yōu)惠,不是VIP會(huì)員且消費(fèi)超過(guò)1000元的按9折優(yōu)惠;是VIP會(huì)員且消費(fèi)不超過(guò)1000元的按9折優(yōu)惠,不是VIP會(huì)員且消費(fèi)不超過(guò)1000元的不優(yōu)惠。

這是一個(gè)分支嵌套問(wèn)題。程序控制流程如圖3-16所示。圖3-16購(gòu)物付款流程圖

若只考慮消費(fèi)總額,不考慮購(gòu)物細(xì)節(jié),程序清單如下:

對(duì)于消費(fèi)額為1200元的會(huì)員,程序的執(zhí)行結(jié)果如下:

(5)購(gòu)物件數(shù)不確定。當(dāng)你推著一車商品到收銀臺(tái),收銀員一件件的掃碼,最后計(jì)算出消費(fèi)總額,這個(gè)收銀過(guò)程可以用do…while來(lái)模擬實(shí)現(xiàn)??梢栽O(shè)定價(jià)格是-1時(shí)為循環(huán)結(jié)束條件。參考關(guān)鍵代碼如下:

執(zhí)行程序如下:

讀者可以結(jié)合這幾個(gè)小任務(wù),把模擬超市購(gòu)物的程序進(jìn)一步完善。打印小票目前只能做到例子中的樣子,當(dāng)學(xué)了JBDC之后,條形碼與商品信息關(guān)聯(lián)起來(lái),到時(shí)候,錄入的不是價(jià)格,而是條形碼,小票中就不會(huì)出現(xiàn)價(jià)格為-1的字樣了。另外,同樣的商品可能一次購(gòu)買很多件,逐個(gè)掃碼太慢,可以加上商品數(shù)量這個(gè)變量。這些讀者自行完成。

3.5習(xí)題1.簡(jiǎn)答題(1)程序流程圖的功能是什么?有什么優(yōu)缺點(diǎn)?(2)繪制流程圖有哪些基本步驟?(3)結(jié)構(gòu)化程序設(shè)計(jì)的原則有哪些?(4)?if語(yǔ)句后面的表達(dá)式有什么要求?(5)?switch結(jié)構(gòu)中為什么要用break?break是否可以缺???(6)?if結(jié)構(gòu)與switch結(jié)構(gòu)有什么異同?(7)跳轉(zhuǎn)語(yǔ)句break和continue有什么異同?(8)簡(jiǎn)述三種循環(huán)結(jié)構(gòu)的應(yīng)用場(chǎng)合。

2.填空題

(1)有程序段:

for(inti=1,sum=0;i<100;i++){

sum+=i;

}

其中,循環(huán)條件是

,循環(huán)控制變量是

,循環(huán)體是

,修改循環(huán)條件的語(yǔ)句是

,該循環(huán)執(zhí)行

次,循環(huán)結(jié)束時(shí),循環(huán)變量的值是

,sum的值是。

(2)學(xué)生成績(jī)變量s取值88,下列語(yǔ)句輸出結(jié)果是

。

System.out.printf("%s\n",s>=85?"優(yōu)秀":"良好");

(3)有以下程序

程序的輸出結(jié)果是

。

(4)下列程序運(yùn)行后的輸出結(jié)果是

。

(5)如果執(zhí)行

if(x>3)

System.out.println("A");

else

System.out.println("B");

后,輸出結(jié)果是B,表明x>3的值是

。

(6)借助于臨時(shí)變量t,交換x和y兩個(gè)變量的值,應(yīng)順序執(zhí)行的三條賦值語(yǔ)句是

(7)執(zhí)行“for(inti=0;i<99;i++);System.out.print("*");”后,將輸出

個(gè)*號(hào)。

(8)與“inti=10;while(i<100){System.out.print("P");i++;}”等價(jià)的for語(yǔ)句是

。

(9)執(zhí)行下列switch語(yǔ)句后y的值是

。

(10)下列程序輸出的結(jié)果是

3.選擇題

(1)以下程序的輸出結(jié)果是()。

A.?0 B.?1 C.?2 D.?3

(2)分析以下程序片段,給出所表示的數(shù)學(xué)函數(shù)關(guān)系式是()。

(3)分析下列程序代碼,若week=6,則正確的輸出選項(xiàng)是()。

(4)分析下列程序代碼,執(zhí)行后,正確的輸出選項(xiàng)是()。

A.?y=-1 B.?y=0

C.?y=1 D.?while構(gòu)成無(wú)限循環(huán)

(5)下列程序的運(yùn)行結(jié)果是():

A.?23 B.?24

C.無(wú)任何結(jié)果 D.死循環(huán)

(6)以下程序的輸出結(jié)果是()。

A.?0 B.?1

C.?2 D.死循環(huán)

(7)在switch結(jié)構(gòu)中,()子句不是必選項(xiàng)。

A.?default? B.?switch C.?case D.?else

(8)執(zhí)行下列語(yǔ)句序列后,i的值是()。

inti=8,j=16;

if(i-1>j)i--;elsej--;

A.15? B.16 C.?7 D.?

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論