Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
コンピュータ基礎とプログラミング(第四回)
2010年 秋学期
1
先週の復習&課題解答
2
どんなソースコードを書くべきか?
• ソースコードにはロジックそのものが書かれている
• いつも自分の書いたソースコードを読むとは限らない
• 自分の書いたソースでも,1ヶ月前に書いたコードは他人のコード
• ~~~の高いコードを書くことが大事!
3
どんなソースコードを書くべきか?
• ソースコードにはロジックそのものが書かれている
• いつも自分の書いたソースコードを読むとは限らない
• 自分の書いたソースでも,1ヶ月前に書いたコードは他人のコード
• 可読性の高いコードを書くことが大事!
4
可読性のためのテクニック• 一般に,if文などで中括弧{}が出てきた時には~~~を行うのが主流
before after プログラムの構造が分かりやすくなる
5
可読性のためのインデント• 一般に,if文などで中括弧{}が出てきた時にはインデント(字下げ)を行うのが主流
before after プログラムの構造が分かりやすくなる
6
可読性のための命名規則
• ~~~には意味のある名前をつける
before after変数の中身が想像できるようになる
7
可読性のための変数名• 変数名には意味のある名前をつける
before after変数の中身が想像できるようになる
8
可読性のまとめ
• 中括弧{}でインデントする
• 変数名はきちんとつける
• aとかbはできるだけ避ける(特に長いプログラムになる場合)
プログラムが大規模になればなるほど大事9
プログラムの制御• プログラムの基本的な構成
• ~~
• プログラムに書かれた順に実行していく
• ~~
• ある条件が成り立つとき処理Aを実行し,そうでなければ処理Bを実行する
• ~~
• ある条件を満たしている間処理を繰り返す.条件を満たさなくなった時点で繰り返しをやめる
10
プログラムの制御• プログラムの基本的な構成
• 順次
• プログラムに書かれた順に実行していく
• 分岐
• ある条件が成り立つとき処理Aを実行し,そうでなければ処理Bを実行する
• 反復
• ある条件を満たしている間処理を繰り返す.条件を満たさなくなった時点で繰り返しをやめる
11
whileによる繰り返し• while(条件式){ 処理 }で,~~~の評価結果が~~の間処理を繰り返す事ができる
• 処理順序
1. 条件式の評価を行う
2. もし1の値がtrueなら処理を実行.実行後1に戻る
3. 1の値がfalseの時,処理を実行せず次の文へ進む
12
whileによる繰り返し• while(条件式){ 処理 }で,条件式の評価結果がtrueの間処理を繰り返す事ができる
• 処理順序
1. 条件式の評価を行う
2. もし1の値がtrueなら処理を実行.実行後1に戻る
3. 1の値がfalseの時,処理を実行せず次の文へ進む
13
指定回数の繰り返し
• 「焼肉食べたい」と10回言ってみて
• 指で回数を数えた人?
• 頭の中で回数を数えた人?
• それが「~~(~~)」という概念
14
指定回数の繰り返し• 「焼肉食べたい」と10回言ってみて
• 指で回数を数えた人?
• 頭の中で回数を数えた人?
• それが「カウンタ(counter)」という概念
15
whileによる繰り返し
• 概念的にはこういうこと
16
それぞれの行をソースコードにしていく
whileによる繰り返し
• ソースコードに直すとこうなる
17
注意:無限ループ• ~~~~~となる様なコードを書くと,無限ループが発生する
• プログラムがずっと全力で動作し続け,止まらなくなる
• プログラムが暴走して操作を受け付けなくなる
iが常に0以上のため無限ループとなる18
注意:無限ループ• whileの条件式が常にtrueとなる様なコードを書くと,無限ループが発生する
• プログラムがずっと全力で動作し続け,止まらなくなる
• プログラムが暴走して操作を受け付けなくなる
iが常に0以上のため無限ループとなる19
無限ループ時の対処• for Windows
1. Ctrl + Alt + Deleteを押して「タスクマネージャ」を起動
2. 「プロセス」タブでCPU使用率順に並べ替え,暴走しているjavaw.exe及びjava.exeを強制終了する
• for Mac
1. DockのProcessingアイコンを右クリック(or Ctrl+クリック)
2. 「終了」を選択すると,プログラムと一緒に終了する
20
繰り返し条件の注意• それぞれ何回繰り返すか?
21
繰り返し条件の注意• 油断していると境界値を間違えやすいので注意
0から9までで10回 0から10までで11回
22
条件式色々• それぞれ何回繰り返すか?
手元で書いて確かめてもOK
23
先週の課題• 1つ目から20個目までのフィボナッチ数列を計算し,表示せよ
• ※フィボナッチ数列とは,前二つの数の和が次の項になる数列(0, 1, 1, 2, 3, 5, 8, ...)
• 詳細はググって調べて下さい
• フィボナッチ数列で最初に100000以上になるのは何番目の数か.またその数を求めよ
24
一問目の戦略• フィボナッチ数について(N番目のフィボナッチ数を考える)
• N == 1の時,0
• N == 2の時,1
• N > 2の時,Nはひとつ前と二つ前の数の和
• N <= 2の時はそれぞれ決まった値を出し,それ以上の数の場合,計算によって求める
25
この時点でのソースコード• N == 0, N == 1の時は自明なので,書けるところから書いていく
26
N > 2の時の戦略• いきなりプログラムを書こうとしてはいけない• ハマります
• まずはある程度手計算してみて,計算の傾向を洗い出す
• この時,なるべく図で計算ロジックが分かるようにすると分かりやすい
27
N > 2のフィボナッチ数
+
+
1.ひとつ前の行のbefore1を参照し,before2にコピー
2.ひとつ前の行のcurrentを参照し,before1にコピー
3.before2 + before1をcurrentにコピー
current: N番目のフィボナッチ数before1: N - 1番目のフィボナッチ数before2: N - 2番目のフィボナッチ数
current, before1, before2の三つの変数が必要
28
N == 3の時のフィボナッチ数
使う変数を宣言,初期化
N==1の時,currentは0固定
N==2の時,currentは1固定before1を忘れずに更新する
N==3の時,before2, before1を更新し,
before2 + before1をcurrentに代入
29
次なる戦略• N == 3のプログラムが出来たので,引き続きN == 4から先も書いてみる
•まだ繰り返しにはしない
•急がず,一手ずつ,確実に
30
N == 3からN == 6まで(前略)
N==3の時,before2, before1を更新し,
before2 + before1をcurrentに代入
N==4の時,before2, before1を更新し,
before2 + before1をcurrentに代入
N==5の時,before2, before1を更新し,
before2 + before1をcurrentに代入
N==6の時,before2, before1を更新し,
before2 + before1をcurrentに代入31
繰り返しの検討• いくつか書いてみたので,以下の手順で繰り返し処理を検討する
• 同じような処理が行われているか?
• 違う部分があれば,どこがどう違うか?
• その値は何によって定まるか?変数を用いて表現できるか?
32
比較
赤枠で囲った部分以外は全く同じまた,赤枠部分はNの値そのものである
N > 2の時,同じ処理の繰り返しで表現することができそう
33
繰り返し条件• まずは繰り返し条件を検討する• Nは3から20まで
34
とりあえず当てはめ
このままだと
計算結果は良さそうだが,すべて「N=3の時」になってしまう
→変数に置き換える
(N=1, N=2の時は省略)
35
最終版
1つ目から20個目までのフィボナッチ数36
二問目の戦略• 最初に100000以上になる時の値を求める
• →100000以上になったら繰り返ししないとすれば,その時のcurrentが求める値
フィボナッチ数を求める部分は変えないのが大事
37
二問目解答
currentが100000を超えたら繰り返しを止めたいので,currentが100000より小さい時に繰り返す
繰り返しを抜ける前にNの値は1進められてしまっているので,表示するNの値は-1する
38
今週の内容
39
Agenda
• SFCLib環境のインストール
• 繰り返し・二重の繰り返し再び
• いくつかの便利知識・テクニックを詳解
40
SFCLibのインストール• Processingの環境設定の「Sketchbook location」フォルダ内に「libraries」
フォルダを作成
• libraries内に以下のURLからダウンロードしたsfclib.zipを解凍する
• http://www.ht.sfc.keio.ac.jp/~morimori/compro10f/sfclib.zip
41
SFCLibの動作テスト• Processingを再起動した後,以下のソースコードを書いて実行してみる
42
SFCLibとは• コンピュータ基礎とプログラミングの授業で使われているライブラリ
• ライブラリ: よく使われる様な機能をまとめた便利プログラム集
• 期末試験でも使われるので,やっておきます
• できること
• N * Nの四角形を画面上に配置し,それぞれの色を任意に変化させることが出来る
43
SFCLibの座標系• 左上が(0, 0),右下が(9, 9)になる
(0, 0) (9, 0)
(9, 9)(0, 9)
44
Processing版SFCLibの使い方• C/C++版と違うので注意
SFCLibを使うための宣言
void setup(){}の中括弧内に以下の設定を記述ウィンドウサイズを280pixel * 280 pixelに設定(変更可能)Processingに一度だけ描画するように指定(気にしなくて良い)
void draw(){}の中括弧内にプログラムを記述最初にlib.sfcInit()を指定するその後,プログラムを書き始める
45
SFCLib使用例
この行を追加
46
SFCLibの命令• lib.sfcInit()
• 10 * 10個の四角形を描画する.最初に一回だけ呼ぶこと
• lib.sfcPoint(x, y)
• x, yの座標に黒点を描画する
• lib.sfcPoint(x, y, color)
• x, yの座標に以下のカラーコードに従ったcolorで点を描画する
0: black1: blue2: green3: cyan4: red5: magenta6: yellow7: white47
演習:SFCLibに慣れる• 以下の図を描画せよ
その1 その248
演習:繰り返し• 繰り返しを使って以下の図を描画せよ
その1 その2 その3
49
演習:二重の繰り返し• 二重の繰り返しを使って以下の図を描画せよ
その1 その2 その3
50
今週の課題その1
• 以下の図を描画するプログラムを作成せよ• ヒント: カラーコード表の数値に着目
• 設計図も添付すること0: black1: blue2: green3: cyan4: red5: magenta6: yellow7: white
51
設計図について• フリーフォーマット
• 紙に書いて写真に撮っても,Word等のファイルに書いても良い
• 必ず書くこと
• 自分の考えた戦略
• 問題をどう分割したか?自分なりの解釈など
• 試行錯誤の過程
• 失敗して,やり直した部分も入れる
• できれば後でなぜその戦略がダメだったのかも書く
配点の半分はここで付けます!!
繰り返しの制御• 要求その一
• 以下の図を描画するプログラムを作成せよ
53
continue文• 実行している繰り返し処理を強制的にスキップし,繰り返し条件式の評価に処理を飛ばす
i == 4の時だけこの先を実行しない
54
繰り返しの制御(2)
55
• 要求その二
• 以下の図を描画するプログラムを作成せよ
break文• 実行している繰り返し処理を条件式に関わらず強制的に脱出する
i == 4の時に繰り返しを止める
56
continue, break文について• 使わなくてもフラグ変数とif文を使うことで同等のことは出来る
• しかし,多くの場合ifの入れ子構造を浅くする事ができる
• →可読性が上がり,読みやすくなる使えば常に見やすくなるわけではないので,
必要なときにのみ使うこと57
まとめ• これまでの内容で順次,反復(while),分岐
(if-else)の全てを扱った
• これらはプログラミング言語C/C++,
Processingの構文の基礎であり,他の言語でも同じように応用できる
• すごく大事なので,必ずマスターしておくこと
58
とはいっても• これまでの内容だけだと表現し辛かったり,読みにくい・冗長になってしまうことがある
• ここから先はプログラミングを便利にする機能を解説
• とはいっても事実上必須の知識• 論理的にプログラミング言語の知識を身につけていきましょう
59
便利な演算子• インクリメント(デクリメント)演算子++(--)
• 「i++(i--)」はiに1を足す(引く)
• 単体で使ったときは「i = i + 1(i = i - 1)」と同じ意味
• 乗算**,除算//は無いので注意
• 複合代入演算子 +=, -=, *=, /=, %=
• 「i += n」は「i = i + n」と同じ意味(他も同じ)
慣れてきたら使うと便利60
今週の課題その2
• SFCLibを使って自由に絵を書きなさい.
• ドット絵,模様など,何を書くかはセンスに任せます
61