基礎プログラミングa 第6回 (10/31)
(Basic Programing)
0 はじめに
前回の要約
- 力試しテストを行った。
出来が不十分だった人はこれから挽回しましょう
- 再帰を使って回数を決めた繰り返しをさせる方法を学んだ。

前回の積み残し
e) 振動させるプログラム
これまでの例題について
別ページに解答例を示す
1 Scala言語の基本
1.0 関数呼出での、値の受け渡し
- 右図
のように、呼出の際に渡した数値 100 が、
関数の引数 a として保持され、関数内で参照される。
1.1 変数
- 変数は キーワード val または var で宣言する。
- (定義する 作成する と言い換えてもいい)

- 名前は、適当な名標でいいが、ルールと慣習は知って置くこと
- 使える文字に制限がある。(文法上の制約)
- 数字は先頭には来ない。(同上)
- 先頭文字は小文字にする。(慣習)

- ループ等で使う一時的なものを除いて、
読む人に意味の通じる名前であることが望ましい

値が不変の変数

val a=1 // 右図のように、代入ができる
val b="abc"

値が変化する変数
var x : Double // この書き方(初期値なし)が使えるケースは例外的
var x = 1.0
...
x = 2.0 // 後から値を変更することができる(val変数では禁止事項)

1.2 条件分岐(2)
===»

2分岐する if文 または if式:
if ( n > 0 ) {
// 条件を満たした時の処理 (括弧内の式の値が 真 true yes)
} else {
// 条件を満たさない時の処理 (括弧内の式の値が 偽 false no)
}


文法について補足
- (再掲):
数値の比較の時に使う(数学で一般的に使われる)等号は、
プログラミングの際は == の二文字で1つの演算子(比較演算子)で表現する(右図)。
- if による条件分岐の構文は殆どのプログラミング言語で用意されている。
ただし、以下のような点で、言語によってばらつきがある
- 単文のときは { } で囲まなくていいかどうか、
- 条件式を () で包むかどうか

- else if を続けて書く時の略記法があるかどうか(elseif elsif など)
- 一方、場合分けを記述するためのもう1つの構文が用意されている言語も多いが、
(match, case, switch など、キーワードからすでにばらばら)その構文は
言語によって違いが激しい。(Scalaでは matchの構文)
- 少し古い言語(CやJava)では変数や関数の宣言の際に、型名 変数名(や関数名)の順に指定していたが、
最近の潮流としては、キーワード 名前 型指定 の順であることが多い。

1.3 値を返す関数

// 単純な記法
def abc={ 計算式 }
// 或いは、返す値の型を指定する書き方もある(こちらの方が一般的)
def someStr: String={ "abc" }
// 勿論、引数のある関数も値を返すことができる
def sine(x: Double) : Double = { 式 }
値を返す関数の使用例:

def rancol={ // 色をランダムに生成する
color(random(256),
random(256),
random(256))
} // この関数が返す値の型を確認されたし
clear
repeat(30) {
setPenColor(rancol)
forward(100)
left(162)
}
この結果、関数と変数は似たものになる。

なお、数値関数の主要なものも、Scalaでは math.sqrt(), math.abs(), math.pow()
などの形で用意されている。
1.4 実習にあたって
- 今日の課題は、kojoの中で実行しますが
亀を動かしません(なので他の環境でも実行できる題材ですが)。

- 整数値を入力するためには、関数 readInt(プロンプト文字列) を使って下さい。
- なお、関数readInt()は、今はScalaの標準組込み関数ではなく、
kojo独自に提供されているものです。
- 結果は println(値) で印字させて下さい。
- 印字させたもの(コンソール出力)は、kojoでは Output Paneに表示されます。
1.5 例題:成績判定プログラム

- 点数を引数として渡し、
- 判定を “秀”、”優”などの文字列として返す関数、を作成する。
- その関数に(引数として)渡す値(点数)は、readInt() で入力。
- 結果は println() で出力。
- 入力された値と、出力すべき値を、それぞれ変数(val変数)に一時保管するとしたら、
上図の*印のついたそれぞれの要素に名前(関数名、変数名、引数名)をつけることになる。
-
点数と成績の対応関係は以下のものを想定する。

点 |
成績 |
90~ |
秀 |
80~89 |
優 |
70~79 |
良 |
60~69 |
可 |
~59 |
不可 |
補足:
- 関数呼び出しを複数含むプログラム片では、
- 順々に呼び出し結果を変数(たいていval変数)にセットし、
次の関数呼び出しに渡す、

- という書き方もできるし、
- 関数の結果を次の関数の仮引数として使う、
という考え方で書くこともできる
- 概ね以下のような枠組みで書けるだろう
def hantei(p:Int) :String ={
}
val p=readInt("点数:")
println("成績:"+hantei(p))
課題
- 以下の2つを完成させて、
- 振動させるプログラムを(できれば自分なりのオリジナルで)一題
- 成績判定プログラム
結果を(ソースコードも添えて)提出下さい。
ーーー
以下は次回にまわします
2 再帰関数の応用(2)

- 再帰を使ったプログラムは、例えば右図のように、
呼び出しが深くなる毎に引数の値が徐々に小さくなり、
ある条件を超えるとそれ以上の再帰を行わない、などの条件付けが必要となる。
- kojoで、タートルをゆっくり移動させるforward()を使った例では、
kojoの停止ボタンで無理やり停止することができたが、そうでないプログラムでは、
エラーを引き起こしたり、コンピュータの動作が極端に重くなるというような
望ましい結果となる可能性が高い。
プログラム例
なるべく丸写しをせず自分で考えるところは考えるように。