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