Comments
Description
Transcript
第 4 章 複数の図形をたくさん描画してみよう!!
31 第4章 複数の図形をたくさん描画してみよう!! 条件によって異る処理を行う仕組みとして,Java では,条件分岐を行う if 文,if-else 文,switch 文がある.こ こでは,if 文と if-else 文について説明する. 4.1 チェッカーフラグを書いてみよう!! 例題 4.1.1 図 4.1(a) に示すように,描画領域 (400, 300) の範囲に,幅 20 画素の縦縞模様を描画するプロ 2 グラムを作成せよ. プログラム 4.1.1 縞模様を描画するプログラム (Stripe.java) import javax.swing.JApplet; import java.awt.Graphics; import java.awt.Color; public class Stripe extends JApplet { public void paint(Graphics g) { 5 int i = 0, x = 0, w = 20; 10 g.setColor(Color.white); g.fillRect(0, 0, 400, 300); g.setColor(Color.black); while(x < 400){ if (i % 2 == 0) g.fillRect(x, 0, w, 300); x += w; i++; 15 } g.drawRect(0, 0, 399, 299); } } 2 if 文は,条件を表す式を評価し,その評価結果が真 (true) ならば if 文に続く文あるいはブロックを実行する.評 価結果が偽 (true) ならば,なにもせずに次の処理を行う. 評価式には,関係演算子,等値演算子,論理演算子を用いて条件判断を行うことが多い.プログラム 4.1.1 では,13 行目でカウンタとして用いている変数 i が偶数の場合,黒の矩形を描画する処理を実行している.算術演算子 % は,第 一オペランド (operand; 被演算数) を第二オペランドで割った剰余を計算する演算子である.つまり,i % 2 は変数 i の値を 2 で割った時の剰余であり,i が 3 の時,i % 2 は 1 となり,i が 4 の時,i % 2 は 0 となる.また,等値演算 子==は,第一オペランドと第二オペランドが等しい場合に真 (true) となり,異なる場合に偽 (false) となる演算子で 第 4 章 複数の図形をたくさん描画してみよう!! 32 (a) 縦縞 (b) 横縞 図 4.1 縞模様 ¶ ¨ ¥ if (評価式) 文 § ¦ ¥ ¨ if (評価式) ブロック § ¦ µ ³ if 文 評価式 false true 文 or ブロック ´ 図 4.2 if 文の構造 ある.13 行目の if 文の評価式は,変数 i を 2 で割った剰余が 0 の場合,つまり,i が偶数の場合に黒塗の矩形を描画 する. 例題 4.1.2 図 4.1(b) に示すような,描画領域 (400, 300) の範囲に,幅 20 画素の横縞模様を描画するプロ グラムを作成せよ. 2 例題 4.1.3 図 4.3(a) に示すように,描画領域 (400, 300) の範囲に,縦横 20 画素の矩形を持つチェッカー フラグを描画するプログラムを作成せよ. 2 4.1 チェッカーフラグを書いてみよう!! 33 プログラム 4.1.2 チェッカーフラグを描画するプログラム (Checker.java) import javax.swing.JApplet; import java.awt.Graphics; import java.awt.Color; public class Checker extends JApplet { public void paint(Graphics g) { 5 g.setColor(Color.white); g.fillRect(0, 0, 400, 300); int j = 0, y = 0, w = 20; 10 g.setColor(Color.black); while(y < 300){ int x = 0, i = 0; while(x < 400){ if ((i + j) % 2 == 0) g.fillRect(x, y, w, w); x += w; 15 i++; } y += w; j++; 20 } g.drawRect(0, 0, 399, 299); } } 2 プログラム 4.1.2 の 15 行目では,変数 i を横方向の矩形の数,変数 j を縦方向の矩形の数として,i + j が偶数の 場合に黒塗の矩形を描画する処理を行うことでチェッカーフラグを描画している. (a) (b) 図 4.3 チェッカーフラグ 第 4 章 複数の図形をたくさん描画してみよう!! 34 例題 4.1.4 図 4.3(b) に示すように,プログラム 4.1.2 の白黒を反転させたチェッカーフラグを描画するプ ログラムを作成せよ. 2 例題 4.1.5 図 4.4 に示すように,ひとつおきに画像を枠で囲うプログラムを作成せよ. 2 図 4.4 交互に画像を枠で囲う 4.2 複数の図形を交互に書いてみよう!! 例題 4.2.1 図 4.5(a) に示すような,□と○を交互に 10 個,横に並べて描画するプログラムを作成せよ. 2 プログラム 4.2.1 □と○を交互に描画するプログラム (CircleBox1.java) import javax.swing.JApplet; import java.awt.Graphics; public class CircleBox1 extends JApplet { public void paint(Graphics g){ 5 int w = 30, sp = 20, y = 20; for(int i = 0, x = 20; i < 10; i++, x += (w + sp)){ if (i % 2 == 0) g.drawRect(x, y, w, w); else 10 g.drawArc(x, y, w, w, 0, 360); } } } 15 2 条件分岐を行う場合,if-else 文を用いる.評価式が真,すなわち,評価式の値が 0 でなければ,文-1 が実行される. 一方,評価式が偽,すなわち,評価式の値が 0 であれば,文-2 が実行される.プログラム 4.2.1 の 9 行目 ∼12 行目で 4.2 複数の図形を交互に書いてみよう!! 35 (a) (b) (c) (d) 図 4.5 □と○の描画 は,ループ変数 i が偶数 (i % 2 == 0) の時,正方形を描画し,それ以外の場合には円を描画する処理を行っている. ² if(評価式) 文 1 else 文 2 ± Â if(評価式 1) 文 1 ¯ ° else if(評価式 2) 文 2 .... else 文 n Á 評価式 1 false true 評価式 ¿ 文1 false false true true 文1 評価式 2 文2 評価式 3 false true 文2 文3 図 4.6 if-else 文の構造 1 À 図 4.7 if-else 文の構造 2 例題 4.2.2 図 4.5(b) に示すような,□を一つ描いた後に○を 2 個描く操作を繰り返し,横に図形を 10 個 並べて描画するプログラムを作成せよ. 2 例題 4.2.3 図 4.8 に示すように,2 つの画像を交互に 10 個並べて描画するプログラムを作成せよ. 2 図 4.8 画像の交互描画 第 4 章 複数の図形をたくさん描画してみよう!! 36 例題 4.2.4 図 4.5(c) に示すような,□,○,■を交互に 10 個,横に並べて描画するプログラムを作成せ 2 よ. プログラム 4.2.2 □,○,■を交互に描画するプログラム (CircleBox3.java) import javax.swing.JApplet; import java.awt.Graphics; public class CircleBox3 extends JApplet { public void paint(Graphics g){ 5 int w = 30, sp = 20, y = 20; for(int i = 0, x = 20; i < 10; i++, x += (w + sp)){ if (i % 3 == 0) g.drawRect(x, y, w, w); else if (i % 3 == 1) 10 g.drawArc(x, y, w, w, 0, 360); else g.fillRect(x, y, w + 1, w + 1); } } } 15 2 プログラム 4.2.2 の 9 行目 ∼14 行目では,if-else 文の後にさらに if-else 文が繋がっている.これは,9 行目の if 文で i が 3 で割り切れた場合,10 行目の正方形を描画し,3 で割り切れない場合には,次の 11 行目の if 文の評価 式を評価することになる.11 行目では,i を 3 で割った剰余が 1 の場合に円を描画し,それ以外,つまり,i が 3 で割 り切れず剰余も 1 でない場合に,14 行目の処理,塗りつぶした正方形を描画している. 例題 4.2.5 図 4.5(d) に示すような,□,○,■,●を交互に 10 個,横に並べて描画するプログラムを作 成せよ. 2 4.3 複数の図形を少し複雑に配置してみよう!! 例題 4.3.1 図 4.9(a) に示すように,□と○を交互に並べ,一行おきに色を変えて描画するプログラムを作 成せよ. 2 このプログラムでは,i を列番号,j を行番号を数える変数として,14 行目 ∼17 行目の処理で列と行の番号の和 i + j が偶数であれば正方形を,奇数であれば円を描画する処理を行っている.また,10,11 行目で,行番号 j が偶数の場合 に色を赤に設定し,奇数の場合には黒に設定することで,一行おきに異なる色で図形を描画する処理を実現している. 4.3 複数の図形を少し複雑に配置してみよう!! 37 プログラム 4.3.1 □と○を交互に,一行おきに色を変える描画するプログラム (CircleBox5.java) import javax.swing.JApplet; import java.awt.Graphics; import java.awt.Color; public class CircleBox5 extends JApplet { public void paint(Graphics g){ 5 int w = 30, sp = 20; for(int j = 0, y = 20; j < 5; j++, y += (w + sp)){ if (j % 2 == 0) g.setColor(Color.red); 10 else g.setColor(Color.black); for(int i = 0, x = 20; i < 5; i++, x += (w + sp)){ if ((i + j) % 2 == 0) g.drawRect(x, y, w, w); else 15 g.drawArc(x, y, w, w, 0, 360); } } } } 20 2 例題 4.3.2 図 4.9(b) に示すように,□と○,●と■を交互に並べて描画するプログラムを作成せよ. 2 プログラム 4.3.2 □と○,●と■を交互に描画するプログラム (CircleBox6.java) import javax.swing.JApplet; import java.awt.Graphics; public class CircleBox6 extends JApplet { public void paint(Graphics g){ 5 int w = 30, sp = 20; for(int j = 0, y = 20; j < 5; j++, y += (w + sp)){ if (j % 2 == 0){ for(int i = 0, x = 20; i < 5; i++, x += (w + sp)){ if (i % 2 == 0) g.drawRect(x, y, w, w); else 10 g.drawArc(x, y, w, w, 0, 360); } } else{ 15 for(int i = 0, x = 20; i < 5; i++, x += (w + sp)){ if (i % 2 == 0) g.fillArc(x, y, w, w, 0, 360); else g.fillRect(x, y, w + 1, w + 1); } } } } } 20 2 第 4 章 複数の図形をたくさん描画してみよう!! 38 9 行目と 15 行目の if-else 文で,行番号 j が偶数か奇数かで,それぞれ 10∼13 行目の処理,16∼19 行目の処理を 行うように条件分岐している.行番号 j が偶数の場合,□と○を交互に描画するので,11,12 行目の処理で,列番号 i が偶数の場合正方形を描画し,奇数の場合円を描画している.一方,行番号 j が奇数の場合,●と■を交互に描画する ので,17,18 行目の処理で,列番号 i が偶数の場合塗りつぶし円を,奇数の場合塗りつぶし正方形を描画している. 例題 4.3.3 図 4.9(c) に示すように,□と○を交互に並べ,一列おきに色を変えて描画するプログラムを作 成せよ. 2 例題 4.3.4 図 4.9(d) に示すように,□と●,○と■を交互に並べて描画するプログラムを作成せよ. 2 例題 4.3.5 図 4.10 に示すような模様を描画するプログラムを作成せよ. 2 プログラム 4.3.3 色付きチェッカーフラグ (CheckerColor.java) import javax.swing.JApplet; import java.awt.Graphics; import java.awt.Color; public class CheckerColor extends JApplet { public void paint(Graphics g) { 5 g.setColor(Color.white); g.fillRect(0, 0, 400, 300); int j = 0, y = 0, w = 20; 10 while(y < 300){ int x = 0, i = 0; while(x < 400){ if ((i + j) % 2 == 0){ if ((i % 2 == 0) && (j % 2 == 0)) g.setColor(Color.black); else g.setColor(Color.red); 15 g.fillRect(x, y, w, w); } x += w; i++; 20 } y += w; j++; } g.setColor(Color.black); g.drawRect(0, 0, 399, 299); } 25 } 2 基本的な処理はプログラム 4.1.2 と同じであるが,色分けをする処理を 15,16 行目で行っている.15 行目では,i と j がともに偶数の場合色を黒に設定し,奇数の場合赤に設定している.この if 文では,i % 2 == 0 と j % 2 == 0 の二つの式で,それぞれ i が偶数であるか,j が偶数であるかを評価している.そして,これらの評価結果を論理積 を計算する論理演算子&&で最終的に判断している.論理積&&は,2 つのオペランド a, b に対し,a が真 true, b が真 true の時のみ a && b が真 true となる演算である.命題論理に関しては E.4節,論理演算子に関しては F.3.6小節を 参照すること. 4.3 複数の図形を少し複雑に配置してみよう!! 39 (a) (b) (c) (d) 図 4.9 □と○の描画 第 4 章 複数の図形をたくさん描画してみよう!! 40 図 4.10 色付きチェッカーフラグ 図 4.11 縞模様の充填 4.4 練習問題 問題 4.1 図 4.11 に示すように,html で与えられた描画領域の範囲に,幅 20 画素の縦縞模様を描画するプログラムを 作成せよ. 問題 4.2 図 4.12(a) に示すように図形を配置するプログラムを作成せよ. 問題 4.3 図 4.12(b) に示すように図形を配置するプログラムを作成せよ. 問題 4.4 図 4.13 に示すように画像を配置するプログラムを作成せよ. 4.4 練習問題 41 (a) (b) 図 4.12 □,○,■,●の配置 図 4.13 画像の配置