CrisのScalaノート(五):プロセス制御

32153 ワード

文書ディレクトリ
  • 5. プロセス制御
  • 5.1分岐制御
  • 単一分岐
  • ダブルブランチ
  • マルチブランチ
  • 分岐制御if-else注意事項
  • 5.2 forサイクル制御
  • 範囲データループ方式1
  • 範囲データループ方式2
  • サイクルガード
  • 変数
  • を導入
  • ネストループ
  • サイクル戻り値
  • 詳細注意
  • 5.3 whileサイクル
  • whileサイクル
  • do...whileサイクル
  • 5.4多重サイクル
  • 5.5循環中断(重点)
  • 5.プロセス制御
    5.1分岐制御
    シングルブランチ
    if(条件式){
    実行コードブロック
    }
    説明:条件式がtureの場合、{}のコードが実行されます.
    ダブルブランチ
    if(条件式){
    実行コードブロック1
    ​ } else {
    実行コードブロック2
    }
    マルチブランチ
    if(条件式1){
    実行コードブロック1
    ​ }
    else if(条件式2){
    実行コードブロック2
    ​ }
    ​ ……
    ​ else {
    実行コードブロックn
    ​ }
    分岐制御if-else注意事項
  • カッコ{}内の論理コードが1行しかない場合、カッコは省略できますが、javaの規定と同じです.
  • Scalaの任意の式には戻り値があり、if else式には戻り結果があることを意味し、具体的な戻り結果の値は条件を満たすコード体の最後の行の内容
  • に依存する.
  • Scalaには三元演算子はありませんが、var result=if(a>0)「a」else「b」
  • と書くことができます.
  • はscalaにおいてswitchではなく、パターンマッチングを用いて
  • を処理する.
    小さな練習:
    二元一次方程式のグループの解を求めます(ax^2+bx+c=0)
    def main(args: Array[String]): Unit = {
    
      println("   a:")
      val a = StdIn.readInt()
      println("   b:")
      val b = StdIn.readInt()
      println("   c:")
      val c = StdIn.readInt()
    
      val d = math.pow(b, 2) - 4 * a * c
    
      if (d > 0) {
        val x1 = (-b + math.sqrt(b * b - 4 * a * c)) / (2 * a)
        var x2 = (-b - math.sqrt(b * b - 4 * a * c)) / (2 * a)
        println(x1.formatted("%.2f") + "," + x2.formatted("%.2f"))
      } else if (d == 0) {
        val x = (-b + math.sqrt(b * b - 4 * a * c)) / (2 * a)
        println(x)
      } else {
        println("  ")
      }
    
    }
    

    5.2 forサイクル制御
    Scalaはまた、forループという一般的な制御構造に非常に多くの特性を提供し、これらのforループの特性をfor導出式(for comprehension)またはfor式(for expression)と呼ぶ.
    範囲データループ方式1
    for(i
    print(i + "")
    }
  • iはループの変数を表し、
  • iは1-3サイクルから前後に
  • 閉じる.
    範囲データループ方式2
    for(i
    print(i + "")
    }
  • この方式と前述の違いは、iが1から3-1までの
  • であることである.
  • 前閉鎖後開の範囲
  • じゅんかんガード
    for(i
    print(i + "")
    }
    ループガード、すなわちループガード式(条件判断式、ガードとも呼ばれる).保護式がtrueであれば循環体内部に入りfalseであればスキップしcontinueに類似する
    上のコードは等価です
    for (i <- 1 to 3){
    	if (i != 2) {
    		print(i + "")
    	}
    

    導入変数
    for(i
    print(j + "")
    }
  • はキーワードがないので、範囲後に必ず追加しなければなりません.論理
  • を遮断する
  • 上のコード等価
  • for (i <- 1 to 4) {
      val j = i + 1
      println(j)
    }
    

    もう一つの書き方があります
    for {
      i <- 1.to(2)
      j = i + 2} {
      println(i + "****" + j)
    }
    

    ネストされたループ
    for (i <- 1.to(3); j <- 1 to 2) {
      println(s"i=${i},j=${j}")
    }
    
  • はキーワードがないので、範囲後に必ず追加しなければなりません.論理
  • を遮断する
  • 上のコード等価
  • for (i <- 1.to(3)) {
      for (j <- 1 to 2) {
        println(i + "--" + j)
      }
    }
    

    練習:九九乗算表を印刷する
    /*       */
    for (i <- 1.to(9); j <- 1 to i){
      print(i+"*"+j+"="+(i*j)+"\t")
      if (i == j){
        println()
      }
    }
    

    ループ戻り値
    val ints = for (i <- 1.to(3)) yield i * 2
    println(ints) // Vector(2, 4, 6)
    

    遍歴中に処理された結果を新しいVectorセットに戻し、yieldキーワードを使用します.
    詳細注意
  • scalaのforループ形式はjavaと大きく異なりますので、注意してください.しかし、基本的な原理は同じです.
  • scalaのforループは式であり、戻り値がある.JAvaのforループは式ではなく、戻り値はありません.
  • scalaのforサイクルのステップ長はどのように制御しますか![for(i
  •     /*  */
        for (i <- 1.to(5, 2)) {
          println(i)
        }
    
        /*  */
        for (i <- Range.apply(1, 5, 2)) {
          println("===" + i)
        }
    

    5.3 whileサイクル
    whileサイクル
    ループ変数の初期化
    while(サイクル条件){
    じゅんかんたい
    ループ変数反復
    }
  • ループ条件は、ブール値を返す式
  • である.
  • whileループは、まず判断してから文
  • を実行する.
  • If文と異なり、While文自体に値はありません.つまり、While文全体の結果はUnitタイプの()
  • です.
  • whileには戻り値がないため、この文で計算して結果を返すには変数の使用が避けられないが、変数はwhileサイクルの外部に宣言する必要があり、それはサイクルの内部が外部の変数に影響を及ぼすことに等しく、関数式プログラミングの重要な思想(純関数思想)に反しているため、使用を推奨しない.forループ
  • の使用を推奨します
    do...whileサイクル
  • ループ条件は、ブール値を返す式
  • である.
  • do...whileループは先に実行し、
  • と判断する.
  • はwhileと同様にdo...whileには戻り値がないため、この文で計算して結果を返すには変数の使用が避けられないが、変数はdo...whileサイクルの外部に宣言する必要があり、それはサイクルの内部が外部の変数に影響を与えることに等しく、関数式プログラミングの重要な思想(純関数思想)に反している.したがって、使用を推奨するのではなく、forループ
  • を推奨する.
    /*while   */
    var i = 1
    while (i < 2) {
      println(i)
      i += 1
    }
    
    /*do while   */
    do {
      println("*" + i)
      i += 1
    } while (i < 4)
    

    5.4多重サイクル
    紹介する
  • は、1つのサイクルを別のサイクル内に置くと、ネストされたサイクルを形成する.ここで、for,while,do...whileはいずれも外層サイクルと内層サイクルとして用いることができる.【一般的に2層を使用することを推奨し、最大3層を超えないこと】
  • 実質的に、ネストサイクルは、内層サイクルを外層サイクルとするサイクル体である.内層サイクルのサイクル条件がfalseである場合にのみ、内層サイクルから完全に飛び出し、外層の当サイクルを終了し、次のサイクルを開始することができる.
  • 外層循環回数をm回、内層をn回とすると、内層循環体は実際にm*n=mn回実行する必要がある.

  • 5.5循環中断(重点)
    Scalaの内蔵制御構造はわざわざbreakとcontinueを取り除いて、もっと良い適応の関数式のプログラミングのためで、関数式の風格を使ってbreakとcontineの機能を解決することを推薦して、1つのキーワードではありません
    詳細
  • break()関数コードは
  • です.
    def break(): Nothing = { throw breakException }
    
  • breakable(op:=>Unit)関数は、高次関数であり、別の関数またはセグメントを受け入れて実行することができ、breakExceptionがキャプチャされた場合にthrow ex
  • を処理する
    def breakable(op: => Unit) {
      try {
        op
      } catch {
        case ex: BreakControl =>
          if (ex ne breakException) throw ex
      }
    }
    
  • scalaにはこのスタイルがあります.もし私たちがパラメータ【コード】を入力し、複数行であれば、私たちの代わりに{}を使用することができます()
  • scalaでcontinueの論理を使用する場合はif-elseを使用して
  • を処理する.
  • forサイクルにおいて、同様にbreakable(break()
  • を用いることができる.
    練習する
  • 100以内の数の合計は、第1回が20より大きい現在数
    //       Scala        
    var sum = 0
    var flag = true
    for (i <- 1.to(100);if flag) {
        sum += i
        if (sum >= 20) {
            println(i)
            flag = false
        }
    }
    
    //      Scala        
    breakable {
        var sum = 0
        for (i <- 1 to 100) {
            sum += i
            if (sum >= 20) {
                println(i)
                break()
            }
        }
    }
    
  • を求める.
  • ログイン検証を実現し、3回の機会があり、ユーザー名が「cris」の場合、パスワード123」はログイン成功を提示します.そうしないと、提示には何回かの機会があります.forループを使用して
    //       Scala        
        var flg = true
    for (i <- 1 to 3; if flg) {
    
        println("     :")
        val name = StdIn.readLine()
        println("     :")
        val password = StdIn.readLine()
        if ("cris".equals(name) && "123".equals(password)) {
            println("    !")
            flg = false
        } else {
            if (i != 3) {
                println("    !    " + (3 - i) + "   !")
            } else {
                println("    !        !")
            }
        }
    }
    }
    
    //      Scala        
    breakable {
        for (i <- 1 to 3) {
            println("     :")
            val name = StdIn.readLine()
            println("     :")
            val password = StdIn.readLine()
            if ("cris".equals(name) && "123".equals(password)) {
                println("    !")
                break()
            } else {
                if (i != 3) {
                    println("    !    " + (3 - i) + "   !")
                } else {
                    println("    !        !")
                }
            }
        }
    }
    
    を完了してください.
    言い換えれば,Scalaは異常な割り込み機構によってループの終端を達成し,この機構が実現される前提は関数式プログラミングである.
  • 規則に基づいて交差点の通過総回数を統計する:金額は50000より大きく、毎回5%減少する.そうでなければ、金額から1000
    var money = 100000.0
    var count = 0
    while (money >= 1000) {
        count += 1
        if (money > 50000) {
            money *= 0.95
        } else {
            money -= 1000
        }
    }
    println("    " + count + "   ")
    
  • を差し引く.