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

下載本文檔

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

文檔簡介

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

單元概述

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

目的與要求

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

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

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

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

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

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

重點與難點

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

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

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

3.1項目任務(wù)

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

3.2項目解析

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

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

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

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

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

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

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

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

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

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

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

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

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

3.3.2程序流程圖

1.流程圖的概念

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

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

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

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

3.流程圖常用的符號

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

4.流程圖的畫法

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

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

·用矩形表示行動方案或普通的工作環(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)是指通過安排語句的順序來決定程序流程的程序結(jié)構(gòu),也就是按照程序的書寫順序,自上而下地逐條執(zhí)行的程序結(jié)構(gòu)。順序結(jié)構(gòu)的流程圖如圖3-3所示。圖3-3順序控制流程圖

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

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

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

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

(4)計算;

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

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

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

程序清單如下:

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

讀者可以依照此例完成減法、乘法、除法等運算。

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

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

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

在Java語言中,實現(xiàn)分支結(jié)構(gòu)程序設(shè)計的結(jié)構(gòu)有:簡單的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.簡單的if結(jié)構(gòu)

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

語法格式:

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

{

<程序塊>

}

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

說明:

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

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

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

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

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

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

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

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

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

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

語法格式:

if(表達(dá)式)

語句1;

else

語句2;

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

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

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

程序1:

程序2:

說明:

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

②對于整型數(shù)a和b,求其商時,結(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所示。

語法格式:

if(表達(dá)式1)

語句1;

elseif(表達(dá)式2)

語句2;

elseif(表達(dá)式m)

語句m;

else

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

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

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

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

程序清單如下:

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

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

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

4.if分支嵌套

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

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

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

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

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

程序清單如下:

說明:該程序中使用了if嵌套,在else中有另一個if語句。先是判斷是否能構(gòu)成一個一元二次方程,不能的話輸出“不能構(gòu)成一元二次方程”;在能構(gòu)成一元二次方程的情況下,再判斷是否有實數(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)是通過體重(千克數(shù))和身高(米數(shù))這兩個參數(shù),計算出BMI值,從而量化地給出身體胖瘦的指數(shù)。

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

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

說明:

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

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

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

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

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

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

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

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

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

語法格式:

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

說明:

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

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

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

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

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

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

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

⑧多個case可以共用一段程序。

⑨一個case可以有多條語句時,不必用“{}”括起來。

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

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

程序清單如下:

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

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

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

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

程序清單如下:

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

例3-10用switch結(jié)構(gòu)改寫學(xué)生成績評定程序。

分析:學(xué)生成績的取值范圍是0~100,如果僅限于整數(shù),就有101種情況;如果是1位小數(shù),就有1001種情況。直接用switch結(jié)構(gòu),case太多。由于成績評定是以10為臺階的,根據(jù)整數(shù)運算的特點,用score/10就把整型情況變成11種不同的case(如果是一位小數(shù),可以用(int)(score*10)/100)。但是超出范圍的數(shù)據(jù)(大于100或小于0)用default不能完全解決,因為100~109除以10均得10,-9~0除以10均得0。為了彌補(bǔ)這個漏洞,可以用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è)計任務(wù)。

程序清單如下:

說明:

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

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

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

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

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

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

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

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

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

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

1.for循環(huán)

語法格式:

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

語句;

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

說明:

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

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

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

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

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

語句;

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

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

⑥三個表達(dá)式中都可使用由逗號(?,?)運算符將多個表達(dá)式組成的表達(dá)式。

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

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

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

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

程序清單如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

2.while循環(huán)

語法格式:

while(表達(dá)式)

語句塊;

其中,表達(dá)式是循環(huán)條件,語句塊為循環(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)時要注意以下幾點:

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

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

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

(4)循環(huán)次數(shù)的控制要正確。使用循環(huán)結(jié)構(gòu)時,可以通過循環(huán)變量來控制循環(huán)次數(shù)。使用循環(huán)變量控制循環(huán)次數(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)體中,語句的先后順序必須符合邏輯,否則會影響結(jié)果。

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

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

程序清單如下:

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

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

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

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

程序清單如下:

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

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

語法格式:

do{

語句;

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

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

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

說明:

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

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

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

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

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

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

例3-15用do…while計算1+2+…+100。

程序清單如下:

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

編制一個程序,模擬這個猜價格游戲過程。

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

程序清單如下:

說明:

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

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

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

4.跳轉(zhuǎn)語句

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

(1)?break語句。

語句格式:

break;

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

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

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

(2)?continue語句。

語句格式:

continue;

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

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

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

程序清單如下:

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

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

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

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

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

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

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

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

6.變量的作用域

Java變量的作用范圍有類級、對象實例級、方法級和塊級四個級別。

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

·對象實例級變量就是屬性變量(詳見第6章)。

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

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

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

說明:

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

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

③方法級和塊級的變量必須被顯式初始化,否則不能訪問。

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

若循環(huán)體中又包含有另一個循環(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é)束時,外層循環(huán)才進(jìn)入下一次循環(huán)。

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

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

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

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

程序清單如下:

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

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

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

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

程序清單如下:

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

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

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

程序清單如下:

例3-23九九乘法表。

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

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

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

3.4項目學(xué)做

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

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

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

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

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

這是一個分支嵌套問題。程序控制流程如圖3-16所示。圖3-16購物付款流程圖

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

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

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

執(zhí)行程序如下:

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

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

2.填空題

(1)有程序段:

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

sum+=i;

}

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

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

,循環(huán)體是

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

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

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

,sum的值是。

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

。

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

(3)有以下程序

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

。

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

。

(5)如果執(zhí)行

if(x>3)

System.out.println("A");

else

System.out.println("B");

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

。

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

、

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

個*號。

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

。

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

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

。

3.選擇題

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

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

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

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

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

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

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

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

A.?23 B.?24

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

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

A.?0 B.?1

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

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

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

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

inti=8,j=16;

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

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

溫馨提示

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

評論

0/150

提交評論