柚子快報(bào)邀請(qǐng)碼778899分享:大數(shù)據(jù) 用Scala計(jì)算級(jí)數(shù)
柚子快報(bào)邀請(qǐng)碼778899分享:大數(shù)據(jù) 用Scala計(jì)算級(jí)數(shù)
目錄
題目
分析
源碼
檢驗(yàn)
?編輯?? ??? ??? ??? ??? ??? ?
題目
/** ?* 請(qǐng)用腳本的方式編程計(jì)算并輸出下列級(jí)數(shù)的前n項(xiàng)和Sn,知道Sn剛好大于或等于q為止,其中,q為大于0的整數(shù),其值通過(guò)鍵盤(pán)輸入。 ?* Sn=2/1+3/2+。。。。。。+(n+1)/n ?*/
分析
//分析可得該題包含四個(gè)變量對(duì)象,和Sn,項(xiàng)An=(i+1)/i,項(xiàng)數(shù)n,限定值q。
源碼
源碼一,簡(jiǎn)單版
import scala.io.StdIn._
import scala.util.control.Breaks._
/**
?* 請(qǐng)用腳本的方式編程計(jì)算并輸出下列級(jí)數(shù)的前n項(xiàng)和Sn,知道Sn剛好大于或等于q為止,其中,q為大于0的整數(shù),其值通過(guò)鍵盤(pán)輸入。
?* Sn=2/1+3/2+。。。。。。+(n+1)/n
?*/
//分析可得該題包含四個(gè)變量對(duì)象,和Sn,項(xiàng)An=(i+1)/i,項(xiàng)數(shù)n,限定值q
object Series {
? def main(args:Array[String]): Unit ={
? ? println("請(qǐng)輸入一個(gè)整數(shù)")
? ? println("輸入q或Q時(shí)程序退出......")
? ? //用Breaks類實(shí)現(xiàn)對(duì)循環(huán)的控制
? ? breakable{
? ? ? //用一個(gè)死循環(huán)實(shí)現(xiàn)對(duì)鍵盤(pán)的掃描和鍵盤(pán)的連續(xù)輸入
? ? ? while(true){
? ? ? ? //從鍵盤(pán)輸入值,用val保證數(shù)據(jù)安全性
? ? ? ? val q = readLine()
? ? ? ? //當(dāng)輸入大小寫(xiě)的Q字母時(shí),程序退出
? ? ? ? if(q.toLowerCase()=="q") break
? ? ? ? //用Long(長(zhǎng)整型)增加數(shù)據(jù)輸入的長(zhǎng)度
? ? ? ? var Sn = 0.0
? ? ? ? var An = 1.0
? ? ? ? var n = 1
? ? ? ? while(Sn ? ? ? ? ? An = (n+1)/n.toDouble ? ? ? ? ? Sn = Sn+An ? ? ? ? ? n = n+1 ? ? ? ? } ? ? ? ? println(f"當(dāng) q=$q 時(shí),Sn=$Sn") ? ? ? } ? ? ? } ? ? } } 源碼二,加入容錯(cuò) import scala.io.StdIn._ import scala.util.control.Breaks._ import scala.util.{Try, Success, Failure} object Series { def main(args: Array[String]): Unit = { breakable { //通過(guò)一個(gè)死循環(huán),加一個(gè)循環(huán)控制實(shí)現(xiàn)實(shí)現(xiàn)連續(xù)輸入功能 while (true) { println("請(qǐng)輸入一個(gè)正整數(shù)") println("輸入q或Q退出......") //因?yàn)閺逆I盤(pán)輸入的數(shù)據(jù),包括各種類型,為了增加容錯(cuò),故選用readLine() val input = readLine() //調(diào)用Try類,通過(guò)模式匹配實(shí)現(xiàn)容錯(cuò)處理 Try(input.toLong) match { //判斷輸入值是否是正數(shù) case Success(q) if (q <= 0) => println("請(qǐng)輸入一個(gè)大于0的正整數(shù)。") case Success(q) => try { //實(shí)現(xiàn)級(jí)數(shù)計(jì)算的邏輯 var sn = 0.0 var n = 1 var an = 1.0 while (sn < q) { //通過(guò)Math.addExact()函數(shù)對(duì)數(shù)據(jù)溢出異常進(jìn)行處理 an = Math.addExact(n , 1) / n.toDouble sn = sn + an n = Math.addExact(n, 1) } println(s"當(dāng)q=$q, sn=$sn") } catch { //對(duì)捕獲的異常進(jìn)行處理 case _: ArithmeticException => println("計(jì)算中發(fā)生了溢出異常。請(qǐng)嘗試輸入較小的正整數(shù)。") case _: Exception => println("發(fā)生了未知異常。") } //實(shí)現(xiàn)程序退出功能 case Failure(_: NumberFormatException) if input.equalsIgnoreCase("q") => println("程序已退出......") break //異常處理 case Failure(_: NumberFormatException) => println("輸入無(wú)效,請(qǐng)輸入一個(gè)有效的正整數(shù)或q退出。") case Failure(exception) => println(s"發(fā)生了未知異常:${exception.getMessage}") } } } } } Math.addExact(a,b) 是 Java 中的一個(gè)方法,用于執(zhí)行精確的整數(shù)加法操作。它有以下好處: 溢出檢查:Math.addExact 方法會(huì)在加法操作導(dǎo)致溢出時(shí)拋出 ArithmeticException 異常。這可以幫助你在計(jì)算過(guò)程中檢測(cè)到溢出情況,從而避免得到錯(cuò)誤的結(jié)果。 明確的行為:在 Java 中,整數(shù)溢出是未定義的行為,可能會(huì)導(dǎo)致意外結(jié)果。使用 Math.addExact 可以確保在溢出時(shí)得到明確的異常,而不是不確定的結(jié)果。 代碼可讀性:在涉及到整數(shù)溢出檢查的代碼中,使用 Math.addExact 可以提高代碼的可讀性和可維護(hù)性。它傳達(dá)了你的意圖,即要執(zhí)行精確的整數(shù)加法操作。 使用 Math.addExact(n, 1) 用于執(zhí)行 n + 1 的加法操作,這可以確保在加法操作導(dǎo)致溢出時(shí)得到異常。這在處理數(shù)字計(jì)算時(shí)是一種良好的實(shí)踐,特別是當(dāng)你需要確保結(jié)果的準(zhǔn)確性和穩(wěn)定性時(shí)。 當(dāng)處理異常時(shí),Scala 提供了兩種主要的方法:使用 `Try` 和 `match`,以及使用 `try` 和 `catch` 塊。這兩種方法都可以用來(lái)捕獲和處理異常,但是它們?cè)谡Z(yǔ)法和用法上有一些不同。 **1. 使用 `Try` 和 `match`:** `Try` 是 Scala 中的一個(gè)特殊類,它用于嘗試執(zhí)行可能會(huì)引發(fā)異常的代碼塊,并將結(jié)果包裝在 `Success` 或 `Failure` 對(duì)象中,具體取決于代碼是否成功執(zhí)行或引發(fā)了異常。你可以使用 `match` 來(lái)匹配 `Try` 的結(jié)果并相應(yīng)地處理成功或失敗的情況。 ```scala import scala.util.{Try, Success, Failure} val result: Try[Int] = Try("123".toInt) result match { ? case Success(value) => ? ? println(s"成功:$value") ? case Failure(exception) => ? ? println(s"失?。?exception") } ``` **2. 使用 `try` 和 `catch`:** `try` 和 `catch` 是類似于其他編程語(yǔ)言中的異常處理機(jī)制,用于捕獲和處理代碼塊中的異常。在 Scala 中,你可以使用 `try` 塊來(lái)嘗試執(zhí)行可能會(huì)引發(fā)異常的代碼,并使用 `catch` 塊來(lái)捕獲并處理異常。 ```scala try { ? val value = "abc".toInt ? println(s"成功:$value") } catch { ? case e: NumberFormatException => ? ? println(s"捕獲異常:${e.getMessage}") } finally { ? println("無(wú)論是否有異常,這里的代碼都會(huì)執(zhí)行。") } ``` 在上面的示例中,`try` 塊嘗試將字符串轉(zhuǎn)換為整數(shù),但由于字符串無(wú)法轉(zhuǎn)換為整數(shù),將拋出 `NumberFormatException` 異常,然后被 `catch` 塊捕獲并處理。 總的來(lái)說(shuō),`Try` 和 `match` 更符合函數(shù)式編程的風(fēng)格,而 `try` 和 `catch` 更接近傳統(tǒng)的異常處理機(jī)制。選擇使用哪種方法取決于個(gè)人的偏好和項(xiàng)目的需求。無(wú)論哪種方法,異常處理都是編寫(xiě)健壯和可靠代碼的重要部分。 運(yùn)行測(cè)試 ?? ??? ? ?? ??? ? ?? ??? ? 柚子快報(bào)邀請(qǐng)碼778899分享:大數(shù)據(jù) 用Scala計(jì)算級(jí)數(shù) 精彩鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。