2019.03.18
Javaプログラミング
市松模様(テキスト版)
●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○●
Javaソースコード
TextPattern_Ichimatsu1.java
001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038
public class TextPattern_Ichimatsu1 { public static void main( String[] args ) { // 変数宣言 int w, h; // サイズ // 入力した引数が2以上かを調べる if ( 2 > args.length ) { // 入力した引数が2未満の場合、使用方法を表示する System.out.println( "TextPattern_Ichimatsu1 [幅] [高]" ); return; } try { // 引数を変換し、画像の幅と高さをwとhに代入 w = Integer.valueOf( args[ 0 ] ); h = Integer.valueOf( args[ 1 ] ); } catch( NumberFormatException ne ) { System.out.println( "引数が不正です" ); return; } // 市松模様テキストの作成 for ( int y = 0; y < h; ++ y ) { for ( int x = 0; x < w; ++ x ) { // 黒か白かを判定 if ( 0 == ( ( x + y ) % 2 ) ) System.out.print( "●" ); else System.out.print( "○" ); } // 改行 System.out.println(); } } }
実行結果
コンパイル ソースコードが「ANSI」の場合
C:\talavax\javasample>javac -encoding sjis TextPattern_Ichimatsu1.java
コンパイル ソースコードが「UTF-8」の場合
C:\talavax\javasample>javac TextPattern_Ichimatsu1.java
実行例
C:\talavax\javasample>java TextPattern_Ichimatsu1 20 10
出力結果
●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○●
Javaソースコードの解説
001
public class TextPattern_Ichimatsu1 {
クラス名を、TextPattern_Ichimatsu1としています。
002
public static void main( String[] args ) {
このmainメソッドからプログラムを実行します。
003 004
// 変数宣言 int w, h; // サイズ
このプログラムで使う変数を宣言しています。
006 007 008 009 010 011 012
// 入力した引数が2以上かを調べる if ( 2 > args.length ) { // 入力した引数が2未満の場合、使用方法を表示する System.out.println( "TextPattern_Ichimatsu1 [幅] [高]" ); return; }
014 015 016 017 018 019 020 021 022 023
try { // 引数を変換し、画像の幅と高さをwとhに代入 w = Integer.valueOf( args[ 0 ] ); h = Integer.valueOf( args[ 1 ] ); } catch( NumberFormatException ne ) { System.out.println( "引数が不正です" ); return; }
025 026 027 028 029 030 031 032 033 034 035 036
// 市松模様テキストの作成 for ( int y = 0; y < h; ++ y ) { for ( int x = 0; x < w; ++ x ) { // 黒か白かを判定 if ( 0 == ( ( x + y ) % 2 ) ) System.out.print( "●" ); else System.out.print( "○" ); } // 改行 System.out.println(); }
テキストの座標(x,y)を参照する2重ループをつくり、(x,y)から黒色か白色かを判定します。判定で確定した色に対応した文字を改行しないで表示します(System.out.printを使用)。そして、変数xのfor文を抜けた後にSystem.out.println()で改行しています。
次に、黒色か白色かを判定する方法について説明します。
●○●○●○●○●○●○●○●○●○●○
ただし、この処理だけでは変数yの値に関係なく、同じ模様を表示するので縦縞模様になってしまいます。
●○●○●○●○●○●○●○●○●○●○ ●○●○●○●○●○●○●○●○●○●○ ●○●○●○●○●○●○●○●○●○●○ ●○●○●○●○●○●○●○●○●○●○ ●○●○●○●○●○●○●○●○●○●○
奇数行(y=0,2,4,6,...)は黒から始まり、偶数行(y=1,3,5,7,...)は白から始まるようにするためにはどうすればよいでしょうか?(変数yは0から始まるので、y=0が1行目となり奇数行となります)
(x+y)を2で割った余りが0の時に黒('●')、1の時に白('○')とすれば行の始めの色を黒白交互にすることができます。理由は以下の通りです。
よって、判定式(0==(x+y)%2)は、1行ごとに(0==(x+偶数)%2)と(0==(x+奇数)%2)になります。例えば、y=0(1行目)のときの判定式は(0==(x+0)%2)、y=1(2行目)のときの判定式は(0==(x+1)%2)、y=2(3行目)のときの判定式は(0==(x+2)%2)と、y=3(4行目)のときの判定式は(0==(x+3)%2)になります。
さらにx=0のとき判定式は(0==(0+0)%2)、y=1(2行目)のときの判定式は(0==(0+1)%2)、y=2(3行目)のときの判定式は(0==(0+2)%2)と、y=3(4行目)のときの判定式は(0==(0+3)%2)なり、x=0でy=0,2の時はtrue、y=1,3の時はfalseとなる判定式であることがわかります。
●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○ ○●○●○●○●○●○●○●○●○●○● ●○●○●○●○●○●○●○●○●○●○
以上です。