(これまでに3種類の繰り返し方を習ったが、ここでは3のforを使った繰り返し についておさらいしておく)
for() の構文 括弧内は(基本的な使い方の場合)
// 名標(ループ変数) <- 範囲を生成する式
for( n <- 1 to 30 ) {
// ここに繰り返すべき文や式
} // のように使う
1つずつ増やす以外に 増分を指定する書き方もある
for( n <- 1 to 30 by 3) // などのように by で指定
for(n <- 1.0 to 30 by 0.2)
などのように 初期値も実数で与えること
練習:
関数の入力は kojo画面で行い、
結果の確認は Scala REPL上で行う、
という使い方をするときには、
関数定義は kojoで Ctrl-C(コピー)して
REPL画面で Alt-SPACE, E, P (貼付)するといい。
なお、x2 は、
* 図のように math.powメソッドを使って、
math.pow(10,2)
とも書けるが、
表にして見やすく印字するときは、以下のように TAB文字(\tと表記される)を間に挟む。
for( ... )
println(n+"\t"+f(n))
上記のプログラム例は、正しくは下の例のように toStringをつけて
数値を文字列に変換した上で連結すべきところだが、
ここでは言語処理系が適切に判断して暗黙変換してくれるので省略しても動作する。
for( ... )
println(n.toString+"\t"+f(n).toString)
また、下のようにそれぞれのパーツに分けて個別にprint系関数を読んでもいい (最後だけ printlnで改行する)。
for( ... ) {
print(n) ; print("\t") ; println(f(n))
}
或は、s"..."
, f"..."
という表記を用いて、
s"${n}\t${f(n)}"
という記法もできる。
* 文字列の中に ${ }
という部分があると、その中の式が
評価され、その結果の値(を toStringしたもの)に置き換えられる。
* これは「文字列の補間」という比較的新しい機能だが有用なので活用して下さい。
詳細はこういう情報源を見ましょう。
moveTo(x,y)
という関数で亀を動かすjumpTo(x,y)
を使う方が簡単かもしれない。(様々な数学的関数を考える際に参考にして下さい)
Math パッケージに 多くの関数が用意されている。
(Math は Mathematics(数学)の略称としてプログラミング界でよく使われる名称)
主な関数:
![]() |
importの書き方 |
名前 | 意味 | 名前の由来になった単語 | ||
pow | べき乗 | power | ||
sqrt | 平方根 | squre root | ||
abs | 絶対値 | absolute | ||
sin cos tan | 三角関数 | sine cosine tangent |
math.sqrt(math.abs(x))
import math._
としておくと(Mathパッケージにあるすべての関数をインポート)
(文字 _ は Scalaでは ワイルドカード文字として、
「全て」「何でも」という意味で使われる)
以下 sqrt(abs(x))
のように書ける。
これを組み合わせて使ってみよう(組み合わせ方の例の一部を右図板書に示した)。
例えば
sqrt(abs(x))
は と同じ意味。
ここまでの プログラム例
と、 その改良版(変数を使ったもの)
変数を使う意味:
変数の宣言と初期値の代入は、変数1つずつについて val文(やvar文)を
発行することも可能だが、
改良版の例のように、1つの文にまとめて宣言と代入することもできる。
補足:
パラメータ t (名前は何でもいいが)を for で変化させながら、
x座標 y座標 の両方を 何かの関数の値として動かす。例えば、
for(t <- 0.0 to 20 by 0.1) moveTo(cos(t), sin(t))
テレビ(昔のブラウン管方式)はこの原理で作られた(右図)。
ただし、上記のプログラムはそのままでは動作しない。
前項のMathパッケージについての解説を考慮して変更して下さい。
cos(t)
, sin(t)
の代わりに、例えば cos(t*0.3)
, sin(t*0.5)
のような値
(定数はcosとsinで違う値にするほうが面白いだろう)を使ってみて下さい。
そのまま動作するサンプルはここに1つ置いてある。
(s to e by step).map(f).max
のような書き方で求められますdef f(x:Double):Double= x*x
(1.0 to 3.0 by 0.1).map(f).max
ここまでの プログラム例
関数名をそのまま渡すことができる(型があっていれば)
例:
def drawGraph(start:Double, end:Double, step:Double, fnc:Double=>Double) {
// ここにこれまでに書いた描画部分が全部収まる
}
def f(x:Double):Double={ ... }
drawGraph(-1, 1, 0.1, f)
![]() |
関数に関数を渡す |
または: この例のように、関数f だけを引数にして、 関数 drawGraph(名前は自由につけていい)を作ってみよう。