![]() |
市松 |
i+j が奇数ならば白抜き(何もしない)、
偶数ならば色つき(後からsetFillColor() を呼ぶ)としよう。
if((i+j)%2==1) | s.setFillColor( □ □ □ ) | |
^^^奇数^^ | ||
else | s.setFillColor( ■ ■ ■ ) |
縦横に線を引くと格子模様になる
for(i<-0 to 10) {
s.line(0,i*10,100,i*10)
s.line(i*10,0,i*10,100)
}
![]() |
wとh |
ここでは Pointを使わないものを選択しよう
rectangle(x, y, w, h)
と入力補完される。
ここで、x,y,w,h として何を与えることを想定されているか、 その名前から推測できる所は推測しよう(右,図)
![]() |
depth |
つまり、以下のように2重ループで正方形を敷き詰めることができる。
for(i<-0 to 9;j<-0 to 9) // for(i<-0 to 9) for(j<-0 to 9) でも同じ
s.rectangle(i*10, j*10, 10, 10)
図を見て考える素直な考え方は、
i, j のどちらも偶数、または、どちらも奇数のときに着色
![]() |
剰余 |
%
を用いて、
2で割った余りが0であるか1であるか、で判断する。これをプログラムにすると、例えば以下のよう書き方になるだろう。
![]() |
4つに場合分け |
for(i<-1 to 10;j<-1 to 10) {
if(i%2==0 && j%2==0 || i%2==1 && j%2==1)
s.setFillColor(blue)
else
s.setFillColor(white)
s.rectangle(i*10,j*10,10,10)
}
&&
(かつ) ||
(または)といった論理演算子で
式にまとめたもの。
![]() |
優先度 |
まず上記のif文の条件式に使った演算子を(念のため既出のものも含めて)確認しておく。
演算子 | 種類 | 意味 | 説明 | |||
% |
算術演算子 | 剰余 | 左辺を右辺で割った余り | |||
== |
比較演算子 | 同値 | 左辺と右辺が同じ値かどうか比較し真理値を返す | |||
&& |
論理演算子 | かつ(and) | 左辺右辺ともに真のときに真、それ以外のときは偽 | |||
|| |
論理演算子 | または(or) | 左辺右辺ともに偽のときに真、それ以外のときは真 |
演算の順序を確かにするために括弧をつけるとしたら、式
i%2==0 && j%2==0 || i%2==1 && j%2==1
は、以下のようになる。
(((i%2)==0) && ((j%2)==0)) || (((i%2)==1) && ((j%2)==1))
++
、--
や 後述の3項演算子 ? :
といった例外も若干あるが)、
演算子の上下関係も同じだと考えていい。前項の式は、下のようなふるまいをさせるためのものだが、
i↓ j→ | 偶数 | 奇数 |
偶数 | true | false |
奇数 | false | true |
別の表現方法があることにも気がついておくといいだろう。
![]() |
2つに場合分け |
例えば以下のようにも書ける。
i%2==j%2 // i,j の偶奇が同じ
// あるいは
(i+j)%2==0 // 足したものが偶数
![]() |
演算子の優先度 |
![]() |
NG例 |
なお、上の2つめの式は
i+j%2==0 // NG
と書くと意味が変わってしまうことにも注意。
右図では①~③の順で演算子が実行される
(+
については、() に囲まれることで元来の優先度を無視して先に行われる)
(本節は市松模様プログラムを完成させるために必ずしも
通らなくてもいい項目だが、
プログラミング言語での書き方のバリエーションを知るために
ここで紹介しておく)
![]() |
![]() |
個別に書く | 1つの()内に書く |
for
を使った繰り返しの中に、if
による条件分岐、
で構成されていた。for
の () の中、
を書くことができる。
この文法に沿って「奇数の時に限定して図形を描く」 ようなプログラムだと、以下のように記述することも可能になる。
for(i<-1 to 10; j<-1 to 10 if (i+j)%2==1)
s.rectangle(i*10,j*10,10,10).fill(red)
![]() |
if文とif式 |
setFillColor
という長い呼出を
2回(それぞれの場合分け毎に)書く必要があった。ここは if を中に入れて、以下のように書くこともできる。
s.setFillColor(if(i%2==j%2)blue else white)
![]() |
<=> | ![]() |
if式 | if文 | |
「どの値か」を選択する | 「何をするか」を切り替える |
if(x) y else z
の代わりに
x ? y : z
と書く3項演算子がある。
![]() |
描画オブジェクトからのメソッド呼出 |
setFillColor
(または fill
)関数
は、
setFillColor
メソッドとして
使うこともできる。
描画してから事後に塗りつぶしを指示することになる。
s.circle(0,0,100).fill(red)
のように使える。
これらを盛り込んだプログラムは以下のような形になる
val s=Staging
s.clear
for(i<-1 to 9;j<-1 to 9)
s.rectangle(i*10,j*10,10,10).
fill(if(i%2==j%2)blue else white)
// この3行はスペースの都合で折り返したが
// 1行に続けることもできる