十五:實(shí)戰(zhàn)2-分式計(jì)算器

概述

通過前幾節(jié)課我們學(xué)習(xí)了Java中對(duì)象類的屬性鹤啡,方法,構(gòu)造方法蹲嚣,封裝等相關(guān)知識(shí)递瑰,這節(jié)課通過一個(gè)分式計(jì)算器項(xiàng)目來練習(xí)Java類的知識(shí)。分式由兩個(gè)部分組成:分子和分母隙畜,在本項(xiàng)目中需要定義兩個(gè)類抖部,Fraction類,是一個(gè)對(duì)象類议惰,這個(gè)類中定義了分式的屬性慎颗,構(gòu)造方法和分式的運(yùn)算方法。FrationCalculator類是一個(gè)客戶類言询,這個(gè)類主要處理與用戶的交互俯萎,調(diào)用Fraction類獲取分式計(jì)算結(jié)果,并將結(jié)果返回給用戶运杭。

Fraction

屬性

  • 定義兩個(gè)private的整型變量夫啊,名稱分別為numerator和denominator

構(gòu)造方法

  • 第一個(gè)構(gòu)造方法是有兩個(gè)形參,通過兩個(gè)形參來初始化類的numerator和denominator屬性
    • 如果用戶輸入的denominator是0辆憔,則拋出IllegalArgumentException()的異常
    • 如果用戶輸入的denominator是負(fù)值撇眯,則將符號(hào)轉(zhuǎn)移到numerator中,例如虱咧,輸入-3/-5叛本,則返回3/5,輸入3/-5彤钟,則返回-3/5
      例如: Fraction myFraction = new Fraction(3, 5)来候, 則myFraction的numerator = 3, denominator = 5逸雹。
  • 第二個(gè)構(gòu)造方法是有一個(gè)形參营搅,通過該形參來初始化類的numerator屬性
    • 將denominator的值設(shè)為默認(rèn)值1
      例如:Fraction myFraction = new Fraction(3) ,則myFraction的numerator = 3梆砸, denominator = 1
  • 第三個(gè)構(gòu)造方法是沒有形參
    • 將numerator的值設(shè)為默認(rèn)值0转质,將denominator的值設(shè)為默認(rèn)值1
      例如: Fraction myFraction = new Fraction(), 則myFraction的numerator = 0帖世,denominator = 1休蟹,分式的值為0

在程序的后兩個(gè)構(gòu)造方法中,我們要盡量借助this關(guān)鍵字利用前一個(gè)構(gòu)造方法來簡(jiǎn)化代碼。

方法

方法名 參數(shù) 返回值 描述
getNumerator() none int 返回分式中numerator的值
getDenominator() none int 返回分式中denominator的值
toString() none String 以"numerator/denominator"的格式返回分式的值
toDouble() none double 計(jì)算分式的值赂弓,返回double類型的計(jì)算結(jié)果
add() Fraction other Fraction 返回與另一個(gè)分式相加以后的分式
subtract() Fraction other Fraction 返回與另一個(gè)分式相減以后的分式
multiply() Fraction other Fraction 返回與另一個(gè)分式相乘以后的分式
divide() Fraction other Fraction 返回與另一個(gè)分式相除以后的分式
equals() Object other boolean 檢查兩個(gè)分式是否相等
toLowestTerms() none none 對(duì)分式進(jìn)行約分
gcd() int num, int den int 返回兩個(gè)整數(shù)的最大公約數(shù)绑榴,定義為static方法

equals()
重寫Object類的public boolean equals(Object other)方法。首先判斷對(duì)象是否是Fraction類盈魁,然后判斷傳入的分式與當(dāng)前分式是否相等翔怎。
注意: 1/2與2/4比較,結(jié)果返回true杨耙。
toLowestTerms()
將分式的分子與分母進(jìn)行約分操作赤套,更新分式numerator和denominator的屬性值,保持分式整體的值不變珊膜。約分的關(guān)鍵是找到分子與分母的最大公約數(shù)容握,關(guān)于求最大公約數(shù)的算法,以下是輾轉(zhuǎn)相除法的偽代碼:

if a equals b
    return a or b;

find the reminder of a dived by b
if reminder equals zero
    return b
else
    set a to b
    set b to reminder

FractionCalculator

在這個(gè)類中车柠,我們打印信息到控制臺(tái)剔氏,接收用戶從控制臺(tái)輸入的信息,對(duì)信息進(jìn)行處理堪遂,并返回結(jié)果。

程序邏輯

  • 首先萌庆,輸出提示信息溶褪,讓用戶輸入操作符(+,-,/,*,=),如果用戶輸入q或Q践险,則退出程序猿妈。
  • 用戶輸入操作符,檢查用戶輸入的操作符是否合法巍虫,不合法則提示用戶重新輸入彭则,直到用戶輸入合法操作符
  • 提示用戶輸入第一個(gè)分式,檢查用戶輸入的分式是否合法占遥,不合法則提示用戶重新輸入俯抖,直到用戶輸入的分式合法
  • 提示用戶輸入第二個(gè)分式,檢查用戶輸入的分式是否合法瓦胎,不合法則提示用戶重新輸入芬萍,直到用戶輸入的分式合法
  • 打印計(jì)算結(jié)果

This program is a fraction calculator
It will add, subtract, multiply and divide fractions until you type Q to quit.
Please enter your fractions in the form a/b, where a and b are integers.


Please enter an operation (+, -, /, *, = or Q to quit)+
Please enter first fraction (a/b) or integer (a): 1/2
Please enter second fraction (a/b) or integer (a): 1/4
1/2 + 1/4 = 3/4
Please enter an operation (+, -, /, *, = or Q to quit)-
Please enter first fraction (a/b) or integer (a): 2/3
Please enter second fraction (a/b) or integer (a): 1/3
2/3 - 1/3 = 1/3
Please enter an operation (+, -, /, , = or Q to quit)
Please enter first fraction (a/b) or integer (a): 1/4
Please enter second fraction (a/b) or integer (a): 3/5
1/4 * 3/5 = 3/20
Please enter an operation (+, -, /, *, = or Q to quit)/
Please enter first fraction (a/b) or integer (a): 3/5
Please enter second fraction (a/b) or integer (a): 2/5
3/5 / 2/5 = 3/2
Please enter an operation (+, -, /, *, = or Q to quit)=
Please enter first fraction (a/b) or integer (a): 1/4
Please enter second fraction (a/b) or integer (a): 2/8
1/4 = 2/8 is true
Please enter an operation (+, -, /, *, = or Q to quit)q

Process finished with exit code 0

附錄

關(guān)于該項(xiàng)目的示例代碼,可以從GitHub中下載Project - FracCalc搔啊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柬祠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子负芋,更是在濱河造成了極大的恐慌漫蛔,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異莽龟,居然都是意外死亡蠕嫁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門轧房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拌阴,“玉大人,你說我怎么就攤上這事奶镶〕僭撸” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵厂镇,是天一觀的道長(zhǎng)纤壁。 經(jīng)常有香客問我,道長(zhǎng)捺信,這世上最難降的妖魔是什么酌媒? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮迄靠,結(jié)果婚禮上秒咨,老公的妹妹穿的比我還像新娘。我一直安慰自己掌挚,他們只是感情好雨席,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吠式,像睡著了一般陡厘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上特占,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天糙置,我揣著相機(jī)與錄音,去河邊找鬼是目。 笑死谤饭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的懊纳。 我是一名探鬼主播网持,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼长踊!你這毒婦竟也來了功舀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤身弊,失蹤者是張志新(化名)和其女友劉穎辟汰,沒想到半個(gè)月后列敲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帖汞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年戴而,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翩蘸。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡所意,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出催首,到底是詐尸還是另有隱情扶踊,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布郎任,位于F島的核電站秧耗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舶治。R本人自食惡果不足惜分井,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霉猛。 院中可真熱鬧尺锚,春花似錦、人聲如沸惜浅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)赡矢。三九已至杭朱,卻和暖如春阅仔,著一層夾襖步出監(jiān)牢的瞬間吹散,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工八酒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留空民,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓羞迷,卻偏偏與公主長(zhǎng)得像界轩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衔瓮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容