《數據結構與抽象:Java語言描述(原書第4版)》一練習
本節書摘來華章計算機《數據結構與抽象:Java語言描述(原書第4版)》一書中的第1章 ,[美]弗蘭克M.卡拉諾(Frank M. Carrano) 蒂莫西M.亨利(Timothy M. Henry) 著 羅得島大學 新英格蘭理工學院 辛運幃 饒一梅 譯 更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。
練習
1.考慮接口NameInterface。我們隻為兩個方法寫了注釋。為其他每個方法寫出符合javadoc風格的注釋。
2.考慮接口Circular和類Circle。
a.是客戶還是方法setRadius負責保證圓的半徑是正數?
b.為方法setRadius寫一個前置條件和一個後置條件。
c.為方法setRadius寫適合於javadoc風格的注釋。
d.修改方法setRadius及它的前置條件和後置條件,改變問題a.中提到的職責。
3.為稱為Counter的類寫一個CRC卡及類圖。這個類的對象用於統計,所以它將記錄次數,這是一個非負整數。包括的方法有:為給定整數設置計數器;計數器加1;計數器減1。另外,還包括將當前計數器作為整數返回的方法;將當前計數器作為可顯示在屏幕上的字符串返回的方法toString;測試當前計數器是否為0的方法。
4.假定想為餐館設計軟件。給出下單及結賬的用例。列出可能類的列表。挑選其中的兩個類,為它們寫CRC。
項目
1.為練習3設計的類Counter創建一個接口。包括適用於javadoc的說明類中方法的注釋。所有的方法都不允許計數器的值為負數。
2. a.為附錄D中程序清單D-3給出的類CollegeStudent寫一個Java接口。
b.類CollegeStudent要實現問題a.中所定義的接口,需要做哪些修改?
3.假定你想設計一個類,每次給它一個數。類計算到目前為止所給數的最小值、次小值及平均值。為這個類創建一個接口。包括說明類中方法的符合javadoc風格的注釋。
4.考慮分數類Fraction。每個分數都有符號,且有整數的分子和分母。你的類應該能對兩個分數進行加法、減法、乘法和除法運算。這些方法應該有一個分數作為參數,且應該將操作結果作為分數返回。類還應該能查找分數的倒數、比較兩個分數、確定兩個分數是否相等,以及將分數轉換為字符串等。
這個類應該能處理分母為0的情況。分數總應該表示為最簡的形式,且類應該負責檢查這個條件。例如,如果用戶試圖創建一個如4/8這樣的分數,則類應該將分數設置為1/2。同樣,所有算術運算的結果也應該是最簡的形式。注意,一個分數可能是不正確的,即,分子大於分母。這樣的分數應該表示為最簡的形式。
設計但不實現類Fraction。從為這個類寫CRC卡入手。然後寫一個Java接口,它聲明每個公有方法。包括說明每個方法的javadoc風格的注釋。
5.寫一個Java類Fraction,它實現前一個項目中設計的接口。從寫合理的構造方法入手。設計並實現有用的私有方法,包括說明它們的注釋。
為將像4/8這樣的分數化為最簡形式,需要將分子和分母都除以它們的最大公約數。4和8的最大公約數是4,所以當將4/8的分子和分母都除以4時,得到分數1/2。下列遞歸算法找到兩個正整數的最大公約數:
如果強製讓分數的分母為正數,則很容易確定分數的正確符號。但是你的實現必須處理客戶可能提供負數分母的情況。
寫一個充分展示你的類的程序。
6.混合數包含整數部分和分數部分。使用前一個項目中設計的類Fraction,為混合數設計類MixedNumber。為MixedNumber提供類似於Fraction的操作。即,為混合數提供設置、獲取、加法、減法、乘法及除法操作。混合數的分數部分應該是最簡形式,分子應嚴格小於分母。
為這個類寫一個Java接口,包括javadoc注釋。
7.實現前一個項目設計的類MixedNumber。盡可能使用Fraction中的操作。例如,為了讓兩個混合數相加,將它們轉換為分數,使用Fraction類的加法操作進行相加,然後將結果分數轉換為混合數。其他的算術操作使用類似的技術實現。
如果不仔細,混合數的符號可能是一個難處理的問題。數學上,整數部分的符號與分數部分的符號相一致是有意義的。例如,如果有一個負數分數,混合數的toString方法將得到字符串“-5 -1/2”,而不是“-5 1/2”,這是通常所期望的。下麵的解決方案可能大大簡化計算。
混合數的符號表示為字符數據域。一旦設置了這個符號,則讓整數和分數部分都為正。當創建混合數時,如果給定的整數部分為非零,則讓整數部分的符號與混合數的符號一樣,而忽略分數的分子和分母的符號。但是,如果給定的整數部分為零,則讓所給分數的符號與混合數的符號一致。
8.考慮兩個相同的桶。一個桶掛在天花板的鉤子上,裝有液體。另一個桶是空的,放在地板上,正對在第一個桶的下麵。突然在第一隻桶的底部有一個小洞。液體從滿桶流向地板上的空桶,如右圖所示。液體不斷地流出,直到上麵的桶為空時為止。
為說明這個動作的程序設計一個類。當程序開始執行時,它應該顯示泄漏發生前兩個桶的原始條件。判斷泄漏是否是自然發生還是當用戶給出信號時,例如按下回車鍵或按下鼠標。如果是後者,應該讓用戶將光標放在桶底,用來指出泄漏發生的位置。
寫CRC卡及Java接口,包括javadoc風格的注釋。
9.實現前一個項目中泄漏桶程序的設計。
10.裏程表記錄汽車的行駛裏程。機械式裏程表包含多個轉盤,當汽車行駛時它們會轉動。每個轉盤顯示0~9的一位數字。最右側的轉盤轉得最快,每行駛1英裏其數加1。一旦轉盤轉到9後,下一英裏時它又轉回0,而它左側轉盤的值增1。可以推廣這種轉盤的行為,賦給它們的符號不僅僅是0~9。這種轉盤計數器的示例包括:
- 一個二進製裏程表,其每個轉盤顯示0或1。
- 有3個轉盤的桌麵日期顯示表,分別用於顯示年、月和日。
- 擲骰子顯示器,每個轉盤顯示一個骰子上的點數。
寫一個用於通用轉盤計數器的Java接口,最多有4個轉盤。另外,寫一個Java接口,用於表示轉盤的類。包括javadoc風格的注釋。
11.實現前一個項目中描述的通用轉盤計數器的設計。寫程序計算4個骰子所顯示的值的和大於12的概率。(和大於12的骰子數,除以可能的骰子總數。)使用轉盤計數器實例得到所有可能的4個六麵骰子。例如,如果轉盤從[1, 1, 1, 1]開始,則轉盤計數器將如下增加:[1, 1, 1, 2]、[1, 1, 1, 3]、[1, 1, 1, 4]、[1, 1, 1, 5]、[1, 1, 1, 6]、[1, 1, 2, 1],等等。
12.使用前兩個項目描述的通用轉盤計數器的設計和實現,寫一個類來表示有4個轉盤的桌麵日期顯示器,每個轉盤分別表示星期、月、日和年。注意,一天的星期名和日期數的變化速度是一樣的,但它們的基點數是不一樣的。它們不屬於同一個轉盤計數器。
自測題答案
1.客戶接口描述如何使用類。它含有類中公有方法的頭;告訴你如何使用這些方法的注釋;以及類的公有定義常量。其實現由所有的數據域和所有方法的定義組成,包括公有的、私有的及保護的。
2.電視是一個例子。遙控器和電視上的控製鍵形成客戶接口。電視的內部就是實現。
3.可能有3種:
7.在接口和類中,在setStudent、setName和getName中用NameInterface替換Name。另外在類中,在數據域fullName的聲明和帶參數的構造方法中,用NameInterface替換Name。
8.不能。類Pet必須在implements子句中聲明它實現了Nameable。
9.
11.增加一個從AllCourses到Course的無向關聯(箭頭),尾部的基數是1,頭部的基數是*。
最後更新:2017-06-26 15:32:49