差分
このページの2つのバージョン間の差分を表示します。
| 両方とも前のリビジョン前のリビジョン | |||
| tutorial:nim:control_flow [2024/08/20 02:05] – ↷ tutorial:nim:control-flow から tutorial:nim:control_flow へページを名称変更しました。 freemikan | tutorial:nim:control_flow [2025/05/20 11:21] (現在) – 削除 freemikan | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| - | ====== 制御フロー ====== | ||
| - | プログラムの流れを制御するための構造を制御フローと呼ぶことにします。Nimの制御フローには、条件分岐とループに大別できます。条件分岐にはifとcaseがあります。ループにはwhileとforがあります。 | ||
| - | |||
| - | ===== if文 ===== | ||
| - | |||
| - | 条件によってプログラムの流れを制御するには、if文を使います。if文は次のように書きます。 | ||
| - | |||
| - | <file nim> | ||
| - | let x = 99 | ||
| - | if x < 100: | ||
| - | echo "x is less than 100" | ||
| - | </ | ||
| - | |||
| - | このプログラムを実行すると、// | ||
| - | |||
| - | Nimではブロックを表現するために[[wpjp> | ||
| - | |||
| - | '' | ||
| - | |||
| - | <file nim> | ||
| - | let x = 200 | ||
| - | if x < 100: | ||
| - | echo "x is less than 100" | ||
| - | elif x < 200: | ||
| - | echo "x is less than 200" | ||
| - | elif x < 300: | ||
| - | echo "x is less than 300" | ||
| - | else: | ||
| - | echo " | ||
| - | </ | ||
| - | |||
| - | このプログラムを実行すると、// | ||
| - | |||
| - | |||
| - | ===== case文 ===== | ||
| - | |||
| - | 条件分岐にはもう一つcase文があります。一つの変数に対して多数の条件で処理を分岐する場合には、if文よりもcase文の方が適しています。先のifを使った例は、次のように書き換えられます。 | ||
| - | |||
| - | <file nim> | ||
| - | let x = 200 | ||
| - | case x | ||
| - | of low(int)..99: | ||
| - | echo "x is less than 100" | ||
| - | of 100..199: | ||
| - | echo "x is less than 200" | ||
| - | of 200..299: | ||
| - | echo "x is less than 300" | ||
| - | else: | ||
| - | echo " | ||
| - | </ | ||
| - | |||
| - | '' | ||
| - | |||
| - | この場合、elseのブロックは必須です。case文では、条件となる値の全てのケースをカバーしなければなりません。カバーしていない場合はコンパイルエラーとなります。 | ||
| - | |||
| - | <file nim> | ||
| - | let x = 100 | ||
| - | case x | ||
| - | of 0..99: | ||
| - | echo "x is less than 100" | ||
| - | </ | ||
| - | |||
| - | コンパイルすると次のようなエラーになります。 | ||
| - | |||
| - | Error: not all cases are covered | ||
| - | |||
| - | elseで何もやることがない場合は、'' | ||
| - | |||
| - | <file nim> | ||
| - | let x = 100 | ||
| - | case x | ||
| - | of 0..99: | ||
| - | echo "x is less than 100" | ||
| - | else: | ||
| - | discard | ||
| - | </ | ||
| - | |||
| - | このプログラムは正常にコンパイルされ、実行すると何も出力されません。 | ||
| - | |||
| - | case文では、範囲以外にも複数の値を一つの分岐に使用したり、 | ||
| - | |||
| - | <file nim> | ||
| - | let x = 100 | ||
| - | case x | ||
| - | of 10, 100, 1000: | ||
| - | echo "x is power of 10 (but limited to very small range)" | ||
| - | else: | ||
| - | discard | ||
| - | </ | ||
| - | |||
| - | 文字列を条件に使用したり出来ます。 | ||
| - | |||
| - | <file nim> | ||
| - | let s = " | ||
| - | case s | ||
| - | of "": | ||
| - | echo " | ||
| - | of " | ||
| - | echo "You say ", s | ||
| - | else: | ||
| - | discard | ||
| - | </ | ||
| - | |||
| - | ===== while文 ===== | ||
| - | |||
| - | while文は条件が成立する間、ブロックを実行し続けます。 | ||
| - | |||
| - | <file nim> | ||
| - | var x = 0 | ||
| - | while x < 10: | ||
| - | echo " | ||
| - | x += 1 | ||
| - | </ | ||
| - | |||
| - | 実行すると、次の出力が得られます。 | ||
| - | |||
| - | hello0 | ||
| - | hello1 | ||
| - | hello2 | ||
| - | hello3 | ||
| - | hello4 | ||
| - | hello5 | ||
| - | hello6 | ||
| - | hello7 | ||
| - | hello8 | ||
| - | hello9 | ||
| - | |||
| - | 条件には、任意の式を使用することが出来ます。 | ||
| - | |||
| - | |||
| - | |||
| - | ===== for文 ===== | ||
| - | |||
| - | for文は、while文よりも一定のパターンに従ったループを表現するのに適しています。先のwhileループをforループに置き換えると次のようにまります。 | ||
| - | |||
| - | <file nim> | ||
| - | for i in countup(0, 9): | ||
| - | echo " | ||
| - | </ | ||
| - | |||
| - | あるいは、次のようにも出来ます。 | ||
| - | |||
| - | <file nim> | ||
| - | for i in 0..<10: | ||
| - | echo " | ||
| - | </ | ||
| - | |||
| - | どちらも先のwhileループと同じ出力が得られます。 | ||
| - | |||
| - | '' | ||
| - | |||
| - | <file nim> | ||
| - | for fruit in [" | ||
| - | echo fruit | ||
| - | </ | ||
| - | |||
| - | このプログラム実行すると、次の出力が得られます。 | ||
| - | |||
| - | apple | ||
| - | orange | ||
| - | grape | ||
| - | |||
| - | インデックスと値を同時に取得することも出来ます。 | ||
| - | |||
| - | <file nim> | ||
| - | for (i, fruit) in [" | ||
| - | echo i, " => ", fruit | ||
| - | </ | ||
| - | |||
| - | このプログラム実行すると、次の出力が得られます。 | ||
| - | |||
| - | 0 => apple | ||
| - | 1 => orange | ||
| - | 2 => grape | ||
| - | |||
| - | 他にもいろいろなケースがあります。 | ||
| - | |||
| - | ===== break文とcontinue文 ===== | ||
| - | |||
| - | break文はループを終了します。 | ||
| - | |||
| - | <file nim> | ||
| - | var x = 0 | ||
| - | while true: | ||
| - | if x < 10: | ||
| - | echo x | ||
| - | else: | ||
| - | break | ||
| - | inc x | ||
| - | </ | ||
| - | |||
| - | このプログラムを実行すると、次の出力が得られます。 | ||
| - | |||
| - | 0 | ||
| - | 1 | ||
| - | 2 | ||
| - | 3 | ||
| - | 4 | ||
| - | 5 | ||
| - | 6 | ||
| - | 7 | ||
| - | 8 | ||
| - | 9 | ||
| - | |||
| - | continue文は、現在のブロックの残りの処理をスキップして、次のループ開始位置まで戻ります。 | ||
| - | |||
| - | <file nim> | ||
| - | for x in 0..<10: | ||
| - | if x %% 2 == 0: | ||
| - | continue | ||
| - | echo x | ||
| - | </ | ||
| - | |||
| - | このプログラムを実行すると、次の出力が得られます。 | ||
| - | |||
| - | 1 | ||
| - | 3 | ||
| - | 5 | ||
| - | 7 | ||
| - | 9 | ||
| - | |||
| - | break文もcontinue文も、対象となるループ文は現在実行している位置の直近のループ文のみであることに注意してください。 | ||
| - | |||
| - | <file nim> | ||
| - | var x = 0 | ||
| - | while x < 10: | ||
| - | while true: | ||
| - | if x %% 3 == 0: | ||
| - | echo x | ||
| - | else: | ||
| - | break # もっとも内側のwhileから抜ける | ||
| - | inc x | ||
| - | inc x | ||
| - | </ | ||
| - | |||
| - | このブログラムを実行すると、次の出力が得られます。 | ||
| - | |||
| - | 0 | ||
| - | 3 | ||
| - | 6 | ||
| - | 9 | ||
| - | |||
| - | 外側のwhile文からは抜け出ませんので、外側のwhileの条件である'' | ||
