- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2016-10-19T14:19:34+09:00","default:kyo-in","kyo-in")
[[プログラミング基礎]]
#author("2016-10-19T15:34:37+09:00","default:kyo-in","kyo-in")
*講義資料の予習 [#i0f87ff4]
以下のプログラムを見やすくすることを考えると,
// 定数
final float gravity = 9.8 / 60; // <-- 1/60秒あたりの重力加速度
// 変数
float y; // <-- ボールのy座標
float vy; // <-- ボールの速度のy成分
void setup() {
size(200, 480);
noStroke();
fill(0, 0, 0);
y = 0;
vy = 0;
}
void draw() {
vy += gravity; // <-- 速度に重力加速度を加算する
y += vy; // <-- ボールが速度ぶん移動する
background(255, 255, 255);
ellipse(100, y, 40, 40);
}
ボールを描いている,
ellipse(100, y, 40, 40);
は,引数に直接値を指定しており,プログラムの見やすさとしてはよろしくない.そこで,変数を使用し,
ellipse(x, y, d, d);
とする.
~
~
~
課題を進めていくと,ボールのために
float x; //x座標
float y; //y座標
float vx; //x方向速度
float vy; //y方向速度
という4つのグローバル変数ができる.しかしながら,再度プログラムの見やすさという観点からすれば,
float ボールの情報;
として,まとめたい.そこで配列の出番である.
float[] ball0;
ただし,配列はnew演算子を使用し,メモリ上に実際に値を記憶する領域を作らなければ使えない.また,プログラム中にball0[0]と書かれても,この値が何を示しているのか分からないので,添え字に定数を使用する.
...
final int X = 0;
final int Y = 1;
final int VX = 2;
final int VY = 3;
float[] ball0;
...
void setup(){
...
ball0 = new float[4];
ball0[X] = ...;
ball0[Y] = ...;
...
...
}
~
~
~
さらに課題を進めていくと,
void draw(){
background(0, 0, 100); //画面を白(HSB)でぬりつぶす
//ボールを動かす
...
...
...
...
//ボールを描く
ellipse(ball0[X], ball0[Y], d, d);
}
となっていく.またプログラムを見やすくるのであれば,自分で関数を作り,
void draw(){
background(0, 0, 100); //画面を白(HSB)でぬりつぶす
//ボールを動かす
ボールを動かす(動かすボール);
//ボールを描く
ellipse(ball0[X], ball0[Y], d, d);
}
としたい.
ボールを動かす関数を作ることを考える.
+関数名はboundBallとする
+戻り値は不要
+引数には動かす対象のボールを指定できるようにする
1と2から,
void boundBall(){
}
3は,今,1個のボールの情報を1つのfloatの配列にまとめているので,引数(入力)にはfloatの配列を指定できるようにしなければならない.よって,
void boundBall(float[] b){
//ボールbを動かす処理
...
...
...
}
となる.
*再帰 [#t839a26e]
基本的な再帰を使ったプログラム(階乗を計算する).使いどころによっては,プログラムを見やすく短くすることができる.
void setup(){
int x = 5;
int y;
y = factorial(x);
println(x + "!=" + y);
}
int factorial(int x){
if (x <= 0)
return 1;
else
return x * factorial(x-1);
}