基礎プログラミングa 第5回 (10/24)
(Basic Programing)
* 力試しテスト
(を兼ねて 目的の図を描くべくプログラムを構想する練習)
- 右側の図は試しに作ってみた例なので、必ずしも
正確にこの通りの形でなくていい。
- 各問とも キーワード def (関数を定義する)を
一回以上使うことが条件。
1. 右上に向けて発達する四角 |
|
|
 |
 |
 |
2. 右向けてぐるぐる |
|
|
 |
 |
 |
3. 五弁の花(のように円を5つ。つながっていてもいい) |
|
|
 |
 |
 |
- 答え合わせ(プログラムの提示)は次回行いますが、
- それまでに各自、取り組んでおいて下さい

確認 プログラミングとは
- 例えば 四角を(亀君に)描かせるとき、図右のように
8つの動きを行い、4本の線分を描くことになる。
- この8つの動きをすべて順々に命令として書くことが、
(我々が学ぼうとしている)プログラミングではない。
- この動作は2つの動き(前、左)を4回繰り返すことである、
というパターンを見つけ出して、
極力コンパクトな記述でコンピュータを使役しよう、
というのがプログラミングの考え方である。
- すなわち、人間が楽をして(少ない記述で)、
機械に多くのことをさせる、その発想が必要となる。
0 補足
これまでの復習として、別ページの解説も、読んでおいて下さい。
補完について(再度)
- 最近になってもなお、関数名などのスペルミス等で
ちゃんと動作しないプログラムを作ってしまう人が散見される。

- 最近見た例では repeat を repeetと書いていたケース等。
- これは、(英単語に弱いという遠因もなくはないが、それよりもここで問題なのは)
すべての名標(関数名等)を自分で打鍵しようとしているのが原因。
- 前に述べたように、何文字か打鍵した時点で Ctrl+Space を押して、
コンピュータに正しい単語を補完させる(自分は候補の中から選択するだけ)という入力スタイルをマスターするといいだろう。
インデントについて
- (以前のバージョンでは メニューバーに source 項目があって、
インデント関連の細かい操作ができましたが、今は削除されてます。代わりに、)
- Ctrl+Shift+F (コンテキストメニューの「Format Source」)で一発でOKです。
(時々このキーをおして見るといい)
インスペクタ機能

- Scala(などの最近の言語)の処理系には、REPLと呼ばれるプログラムがあり、
入力したもの(オブジェクトや式)についての情報(式についてはその評価結果である値)
を表示してくれる。
- kojo では、Output Pane がそれと同等の役割を果たす
- Script Editor で 式などを選択(ドラッグして色を反転させる)して、
Ctrl+Enter(またはRunボタン)すると、Output Paneにその情報が表示される
関数の引数について(補足)

- 関数定義は、サービス業(など)に業務を依頼するときの
注文書・命令書のようなものと考えられる。
- その際に条件として何を指定する必要があるか(数量など)あらかじめ(業者の側が)想定し、
- それを注文書に記入欄として用意をしておくことが多い、
- それに相当するものが、関数での”仮引数” (かっこの中)。
- それぞれの記入欄にどんな種類の値が書けるか、についても
欄外に指示をしておくことが多い。
「ここは漢字で」「ここは整数」「ここはカタカナで」
- それに相当するのが、引数の型指定である。

- 呼出にあたって、右図のような流れで値が受け継がれていく
ことも見ておいて下さい。
型変換について

3 再帰
注)読みや字面が似ている単語として
があるが別の言葉なのでご注意。
b_2) 解説 再帰が必ず終了するために

- 上図のように、無限の呼出にならないよう、フェンスを設けることを考える。
- 再帰呼出の引数が、呼出毎に変化していき、遂にはその
フェンスとして設定した値を超えたら、その先には行かない
(これ以上の再帰呼出を行わない)ようにする。

- そのために、関数を右図のようなスタイルで書くといい。
- 関数の中身全体が if で囲まれた形にする。
- if の条件式(仮引数を含む式)が、
再帰呼出を継続するための条件を与えることになる。
- 再帰での引数の変化の方向によって 条件式の使い方が変わる
- 増えていく方向(上の例のように)なら if(len < 100) のように
仮引数がある値 より小さい(或いは ある値 を超えない)ことを条件とし (< か <=)
- 減っていく方向なら 逆に ある値より大きい(或いは ある値 より小さくない)を条件とする(> か >=)
c) 再帰の 練習(その1)
d)回数を決めた繰り返し
d_1) 補足
- ループの中のどこかに Thread.sleep(1000) を入れると、
そこで1秒(ずつ毎回)一時停止する。
- (ここでは確認するのは難しいかもしれない)
- バッファリングという処理が内部で行われているため、
停止しない再帰呼び出しをしたときにはこれが入っているほうが安心。
課題
(以下は次回扱います)
練習:
(ここは各自考えてみて下さい)
- println() の代わりに 関数 print() (やはりScalaの標準関数)
を使ったらどうなるか?
- 1からnまでカウントアップするプログラムを
書いて見て下さい(1からnまでコンソールに印字する)
e) 振動させるプログラム
def zigzag(n:Int, ang:Int) { // nは回数(number ) angは角度(angle )を想定
if(i>0) {
forward(100) ; right(ang)
zigzag(n-1, -ang)
}
}
// と定義する 呼び方はそれぞれ考えて見て下さい
// 仮引数が2つの関数なので2つ渡す必要がある
注)上の例は一箇所エラーがあります 実行してみて赤いメッセージが出たら対処して下さい
e’) 練習
-
左右にぐにゃぐにゃと振動する線
円弧を描く 反転した円弧を描く …
def arc(len:Int,ang:Int) {
repeat(10) {
forward(len)
left(ang)
}
}
このような下請け関数 arcを
交互の方向に呼び出すといい
(解説(プログラム例も)のページも参照)
- それがだんだん狭くなる
- 円(他の図形でも)が 互い違いに並ぶ
○ ○ ○ ○
○ ○ ○ ○

補足2)
- 亀の歩みが遅いと感じる短気な方は
kojoの関数リファレンス(レジュメページからリンクあり)に
setAnimationDelay() 関数があるので使ってみてください。(この項 既出)
- ただし、終了しない再帰関数呼出との併用は避ける方がいいだろう。
(メモリ等の資源消費が激しくなりプログラムが異常終了したりPCの動作が重くなったりする恐れがある)
補足3)
- プログラムは 関数定義 と 関数呼び出し から構成される。
- (他の要素もあるし 関数定義の中で別の関数を呼び出しているが)
関数定義だけでは何も動作しない
- 呼び出し側と 呼び出され側とで 引数<=>仮引数 の数と型が一致していること
- 同じ名前の関数で 仮引数の並びが違うものが複数用意されていることがある
- そのときは いずれかの並びに合致すればOK
練習 ジグザグ型の描画をするプログラムを作成する
- 1回折れて方向反転
- 2回折れて方向反転
- (例えば)20回折れて方向反転