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)
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
print(j + "")
}はキーワードがないので、範囲後に必ず追加しなければなりません.論理 を遮断する上のコード等価
もう一つの書き方があります
ネストされたループはキーワードがないので、範囲後に必ず追加しなければなりません.論理 を遮断する上のコード等価
練習:九九乗算表を印刷する
ループ戻り値
遍歴中に処理された結果を新しいVectorセットに戻し、yieldキーワードを使用します.
詳細注意 scalaのforループ形式はjavaと大きく異なりますので、注意してください.しかし、基本的な原理は同じです. scalaのforループは式であり、戻り値がある.JAvaのforループは式ではなく、戻り値はありません. scalaのforサイクルのステップ長はどのように制御しますか![for(i
5.3 whileサイクル
whileサイクル
ループ変数の初期化
while(サイクル条件){
じゅんかんたい
ループ変数反復
}ループ条件は、ブール値を返す式 である. whileループは、まず判断してから文 を実行する. If文と異なり、While文自体に値はありません.つまり、While文全体の結果はUnitタイプの() です. whileには戻り値がないため、この文で計算して結果を返すには変数の使用が避けられないが、変数はwhileサイクルの外部に宣言する必要があり、それはサイクルの内部が外部の変数に影響を及ぼすことに等しく、関数式プログラミングの重要な思想(純関数思想)に反しているため、使用を推奨しない.forループ の使用を推奨します
do...whileサイクルループ条件は、ブール値を返す式 である. do...whileループは先に実行し、 と判断する.はwhileと同様にdo...whileには戻り値がないため、この文で計算して結果を返すには変数の使用が避けられないが、変数はdo...whileサイクルの外部に宣言する必要があり、それはサイクルの内部が外部の変数に影響を与えることに等しく、関数式プログラミングの重要な思想(純関数思想)に反している.したがって、使用を推奨するのではなく、forループ を推奨する.
5.4多重サイクル
紹介するは、1つのサイクルを別のサイクル内に置くと、ネストされたサイクルを形成する.ここで、for,while,do...whileはいずれも外層サイクルと内層サイクルとして用いることができる.【一般的に2層を使用することを推奨し、最大3層を超えないこと】 実質的に、ネストサイクルは、内層サイクルを外層サイクルとするサイクル体である.内層サイクルのサイクル条件がfalseである場合にのみ、内層サイクルから完全に飛び出し、外層の当サイクルを終了し、次のサイクルを開始することができる. 外層循環回数をm回、内層をn回とすると、内層循環体は実際にm*n=mn回実行する必要がある.
5.5循環中断(重点)
Scalaの内蔵制御構造はわざわざbreakとcontinueを取り除いて、もっと良い適応の関数式のプログラミングのためで、関数式の風格を使ってbreakとcontineの機能を解決することを推薦して、1つのキーワードではありません
詳細 break()関数コードは です. breakable(op:=>Unit)関数は、高次関数であり、別の関数またはセグメントを受け入れて実行することができ、breakExceptionがキャプチャされた場合にthrow ex を処理する scalaにはこのスタイルがあります.もし私たちがパラメータ【コード】を入力し、複数行であれば、私たちの代わりに{}を使用することができます() scalaでcontinueの論理を使用する場合はif-elseを使用して を処理する. forサイクルにおいて、同様にbreakable(break() を用いることができる.
練習する 100以内の数の合計は、第1回が20より大きい現在数 を求める.ログイン検証を実現し、3回の機会があり、ユーザー名が「cris」の場合、パスワード123」はログイン成功を提示します.そうしないと、提示には何回かの機会があります.forループを使用して
言い換えれば,Scalaは異常な割り込み機構によってループの終端を達成し,この機構が実現される前提は関数式プログラミングである.
規則に基づいて交差点の通過総回数を統計する:金額は50000より大きく、毎回5%減少する.そうでなければ、金額から1000 を差し引く.
5.1分岐制御
シングルブランチ
if(条件式){
実行コードブロック
}
説明:条件式がtureの場合、{}のコードが実行されます.
ダブルブランチ
if(条件式){
実行コードブロック1
} else {
実行コードブロック2
}
マルチブランチ
if(条件式1){
実行コードブロック1
}
else if(条件式2){
実行コードブロック2
}
……
else {
実行コードブロックn
}
分岐制御if-else注意事項
小さな練習:
二元一次方程式のグループの解を求めます(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 + "")
}
範囲データループ方式2
for(i
print(i + "")
}
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キーワードを使用します.
詳細注意
/* */
for (i <- 1.to(5, 2)) {
println(i)
}
/* */
for (i <- Range.apply(1, 5, 2)) {
println("===" + i)
}
5.3 whileサイクル
whileサイクル
ループ変数の初期化
while(サイクル条件){
じゅんかんたい
ループ変数反復
}
do...whileサイクル
/*while */
var i = 1
while (i < 2) {
println(i)
i += 1
}
/*do while */
do {
println("*" + i)
i += 1
} while (i < 4)
5.4多重サイクル
紹介する
5.5循環中断(重点)
Scalaの内蔵制御構造はわざわざbreakとcontinueを取り除いて、もっと良い適応の関数式のプログラミングのためで、関数式の風格を使ってbreakとcontineの機能を解決することを推薦して、1つのキーワードではありません
詳細
def break(): Nothing = { throw breakException }
def breakable(op: => Unit) {
try {
op
} catch {
case ex: BreakControl =>
if (ex ne breakException) throw ex
}
}
練習する
// 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()
}
}
}
// 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は異常な割り込み機構によってループの終端を達成し,この機構が実現される前提は関数式プログラミングである.
var money = 100000.0
var count = 0
while (money >= 1000) {
count += 1
if (money > 50000) {
money *= 0.95
} else {
money -= 1000
}
}
println(" " + count + " ")