• ベストアンサー
  • 困ってます

変数booleanの扱い方

下記のコードでコンパイルしたところ、出現 int 互換性のない型 要求:boolean boolean bl = 0 ; とエラーが出ました。コード上でまず、bl = 0 と0が入るのがまず分からないのと、trueとfalseを入れ換えているのがわかりません。すみませんが、かなりわかってないので、出来るだけ詳しく説明お願いします。 boolean bl = 0; for(int i=0; i<5; i++) for(int j=0; j<5; j++) if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } } お決まりのクラス宣言などのコードは省きました。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数874
  • ありがとう数8

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.2

>boolean bl = false; は「やはり!」と納得なのですが、 >では、どういうときにfalseでどういうときにtrue boolean型という考え方はわかりますか? boolean型とは電気のスイッチみたいなものです。 (1)TRUE状態=ONの状態=「真」の状態     □□□□□□       TRUE□■   □FALSE     □□□□□□ (2)FALSE状態=OFFの状態=「偽」の状態     □□□□□□       TRUE□   ■□FALSE     □□□□□□ があります。 ここまではよろしいですね。 では中身を分解して行きましょう! ★ 実行部分の解析 ::::::::::::::::::::::::::::::::::::::::::::: if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } ::::::::::::::::::::::::::::::::::::::::::::: これは、blが「偽 = スイッチ(2)の状態」 ならば、 「*」を出力するのですね。 そのあとで、スイッチを(1)の状態にしています。 一方で、blが「真 = スイッチ(1)の状態」 ならば、 「-」を出力するのですね。 そのあとで、スイッチを(2)の状態にしています。 if ( ) {(あ)} else {(い)} 文ですから、 (あ)か(い)かどちかのみ実行されます。 「どちらかのみ」実行されるということろの理解はよろしいですか? (あ)でスイッチを切り替えたから、ついでのように(い)も実行するという ことは決してありません。ここの理解は大切です。 ※まとめ・・・ この内容は、スイッチの状態をTRUEかFALSEかを判定して、 FALSEなら「*」を出力し、TRUEなら「-」を出力する。 そして、スイッチの状態を「反転」している。 これを、以下「スイッチ(*)(-)処理」と呼ぶととする。 ★内側のFOR文を理解する 先ほどの内容と合わせると、内側のFOR文は次のように書くことが出来ます。 ::::::::::::::::::::::::::::::::::::::::::::: for(int j=0; j<5; j++) 「スイッチ(*)(-)処理」 } ::::::::::::::::::::::::::::::::::::::::::::: これは単に「スイッチ(*)(-)処理」を5回繰り返しているだけですね。 では5回繰り返すとどのようになるか考えてみましょう。 例えば、今、スイッチをOFF(=FALSE)の状態であるとして、 「スイッチ(*)(-)処理」は1回目は、 * が出力されて、スイッチが反転します。 スイッチが反転しましたから、スイッチがON(=TRUE)の状態 になりました。ですから、2回目は - が出力されます。そしてまたスイッチが反転します。 このように5回実行するわけですから、 *-*-* となることがわかります。 さて、ここで注意するべきことは、5回実行した後、 スイッチの状態はどうなっているのでしょう? はじめは、スイッチがOFF(=FALSE)の状態 でしたから、 偽から→(1回目実行→真へ)→(2回目実行→偽へ)→(3回目の実行→真へ)→ (4回目の実行→偽へ)→(5回目の実行→真へ) となります。 家の電気のスイッチボタンで考えるとわかりますね! はじめに消えている電気を5回スイッチを切り替えると、確かに電気がつきます。 又、一方で、始めに電気がついている状態で5回スイッチを切り替えると、電気が消えますね! ですから・・・ ※まとめ 内側のFOR文は5回「スイッチ(*)(-)処理」を実行する。 スイッチの状態は、5回実行する「前」と5回実行した「後」とでは、スイッチの状態は反転する。 とわかります。 これを、以下「スイッチ内側(*)(-)5回処理」と呼ぶととする。 ★外側のFOR文を理解する 先ほどの内容と合わせると、外側のFOR文は次のように書くことが出来ます。 ::::::::::::::::::::::::::::::::::::::::::::: for(int i=0; i<5; i++) 「スイッチ内側(*)(-)5回処理」 } ::::::::::::::::::::::::::::::::::::::::::::: ですから、「スイッチ内側(*)(-)5回処理」の処理全体を1回と考えて、 これを5回行うわけですね。 確か、はじめにスイッチを偽の状態からスタートしたとして、 「スイッチ内側(*)(-)5回処理」全体を1回実行すると、 *-*-* が出力されて、さらにスイッチが反転するのでしたね。 ということは、2回目の実行では、スイッチが反転して 真の状態からスタートしますから、 -*-*- が出力されて、またスイッチが反転しすね。 このようなことを5回実行するわけですね。 1回目 *-*-* 2回目 -*-*- 3回目 *-*-* 4回目 -*-*- 5回目 *-*-* これが全部ひとつにつながって出力されますから、出力結果は *-*-*-*-*-*-*-*-*-*-*-*-* となります。 今は、始めスイッチが「偽」の状態を前提としましたが、 始め、スイッチを「真」の状態にしておくと、 -*-*-*-*-*-*-*-*-*-*-*-*- となります。わかりますでしょうか? ★最後に・・・(ちょっと応用) では、よりスマートに書くことは出来ないのでしょうか? こんかいはスイッチを切りかえると言うことでしたから、もっとスマートに出来そうです。 ::::::::::::::::::::::::::::::::::::::::::::: boolean bl = 0; for(int i=0; i<5; i++) for(int j=0; j<5; j++) if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } } ::::::::::::::::::::::::::::::::::::::::::::: ここで、スイッチを切りかえるのがいまひとつへたくそに思えます。 そこで、次のようにしてみましょう! boolean bl=false; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { System.out.print(bl ? '-' : '*'); // blが真ならば-を、偽ならば*を出力する bl = !bl; // スイッチblの状態を反転する。!blとは bl = !bl で 「blでない」値をblに代入するので反転することがわかる。 } } 以上、kokucho81の講座で~した☆

共感・感謝の気持ちを伝えよう!

質問者からのお礼

本当にありがとうございました!!すっごく良くわかりました。読んでて分かったとき思わず、手をたたいて喜んじゃいました(^^) まだまだ、基本すら分かってないけど、いつかkoukucho81さんのようにスマートなコードが書けるようにがんばります!!本当に分かりやすい回答ありがとうございました。

その他の回答 (1)

  • 回答No.1

ああ、多分C言語か何かその辺をおやりになったことがあるのでしょう。 boolean bl = 0; これはダメです。 C/C++ では 真:偽 → 0意外:0 と対応していますが、 Java では 真:偽 → true:false であって0意外:0とは純粋には対応していないです。 だから boolean bl = false; としなければならないです。 >trueとfalseを入れ換えているのがわかりません。 boolean bl を一種のスイッチと見たてて、 * を表示したらスイッチをONにして、次にループでは - を表示する。 - を表示したらスイッチをOFFにして、次のループでは * を表示する。 という具合です。 あと、全体として、次のようなコードにするとふるまいが良くわかると思います。 ソース名a.java public class a { public static void main(String args[]) { boolean bl=false; for(int i=0; i<5; i++) { for(int j=0; j<5; j++) { if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } } System.out.println(" #"+i); } } }

共感・感謝の気持ちを伝えよう!

質問者からの補足

すごい分かりやすい答えありがとうございました。 ただ、私は実は全くの初心者で本を見ながら独学で 勉強しているのでCも全く知りません・・。 そこで、またずうずうしくもお聞きしますが、 boolean bl = false; は「やはり!」と納得なのですが、では、どういうときにfalseでどういうときにtrue なのかがわかりません。iを一つ数えるたびにjは五つ数えますよね?数字が0・0でfalse? お恥ずかしいのですが、よろしくお願いします。 また、書いていただいたコードを早速実行したところ、 なんとなくつかめそうな感じがしました。 ありがとうございました。

関連するQ&A

  • booleanについて

    お世話になります。 javaを始めて10日程の初心者です。 boleanの使い方がよく分かりません。 例: public class a { public static void main(String[] args){ // "あなたは20歳以上ですか?(Yesならtrue、Noならfalse)"; boolean isAdult = true; if (isAdult) { System.out.print(" 成人です "); } else { System.out.print(" 子供です "); } } } これを実行すると、”成人です”が出力されます。 例えばbooleanを使用せずに int age; if(age>=20) { System.out.print(" 成人です "); } else { System.out.print(" 子供です "); } とすれば解決できるのですが、 booleanを使用しようとすると理解できなくなります。 宜しくお願いします。

  • boolean型

    class Bool {   static boolean b;   public static void main(String [] args) {     int x=0;     if (b ) {       x=1;     }     else if (b = false){       x=2;     }     else if (b){       x=3;     }     else {       x=4;     }     System.out.println("x = " + x);     System.out.println(b=false);   } } SUNのサイトにあった「どのような結果になるか」と言う問題なのですが、8行目の if(b=false) の部分がifの括弧の中はBoolean型じゃないといけないのに 代入してるからコンパイルエラーだなとおもったのですが あっさりコンパイルは通ってx=4と言う出力です・・・ (b=false) と言うのはどのようにコンパイルされているのですか?? なぜ 代入が、BooleanとしてOKなのでしょうか??

    • ベストアンサー
    • Java
  • booleanの戻り値について

    配列の等価判定をしたいのですが思うように動かないです。 助けてください import java.io.*; class Kadai4 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int[] TBL1; int[] TBL2; TBL1 = new int[5]; TBL2 = new int[5]; boolean flg=true; System.out.println("配列1を入力"); for (int i = 0; i <= 4; i++) { String s1 = br.readLine(); int t1 = Integer.parseInt(s1); TBL1[i] = t1; } System.out.println("配列2を入力"); for (int i = 0; i <= 4; i++) { String s1 = br.readLine(); int t1 = Integer.parseInt(s1); TBL2[i] = t1; } // 配列表示 System.out.println("配列表示"); for (int i = 0; i < TBL1.length; i++) { System.out.print(" TBL1[" + i + "]=" + TBL1[i]); } System.out.println(""); for (int i = 0; i < TBL2.length; i++) { System.out.print(" TBL2[" + i + "]=" + TBL2[i]); } toka(TBL1, TBL2); System.out.println(""); if (flg == true) { System.out.println("配列は等価"); } else { System.out.println("配列は非等価"); } } private static boolean toka(int[] ss1, int[] ss2) { boolean flg = true; for (int i = 0; i < ss1.length; i++) { if (ss1[i] != ss2[i] || ss1.length != ss2.length) { flg=false } } return flg; } }

  • booleanの意味・・・

    お世話になります。 javaの勉強をし始めたばかりなのですが booleanの理解がなかなか出来なくて困っています。 例えば、 public ArrayList search(ArrayList blist, String word) { boolean hit = false; ArrayList setList = new ArrayList(); for (int i=0; i<blist.size(); i++) { Parson bean = (Parson) blist.get(i); int n =bean.getName().indexOf(word); if (n != -1) { setList.add(bean); hit = true; } } if (! hit) { System.out.println("その文字では検索できません!"); } return setList; } というプログラムで、booleanを使っていてif (n != -1)のブロックに 入った時は、hit=tureで下のif (! hit)の処理を行うのは分かるのですが…。 もし、if (n != -1)のブロック内に入らなければhitはfalseのままでは ないのでしょうか? falseのまま、if (! hit)のブロックにきたらhitはtrueになるので 処理は行われないのでは?と思うのですが…。 この辺の理解ができなくて、教えて頂きたく思います。 宜しくお願いします。

    • ベストアンサー
    • Java
  • ループの終わらせ方

    あるboolean配列でtrueなら■falseなら□を表示させ、時間とともにある規則で動かしていくプログラムを組みました。配列の宣言などを省略してますがこんな感じです。 do{ boolean[] box2 = (boolean[]) box.clone(); for ( i = 0; i < box2.length; i++) { if (box2[i]) { // コピーの玉があったら // 右方向に向かって空き箱を探す。 for (int j = 1; j < box.length; j++) { int p = (i + j) % box.length; if (! box[p]) { // 空き箱を見つけたので玉を入れる(trueにする)  box[p] = true; // 元の場所は玉を消す(falseにする) box[i] = false; // box2[i]はもう二度と調べないのでそのまま放置 break;   } }   } } box2 = null; for(h=0; h < box.length; h++){   if(box[h] == false) System.out.print("□"); if(box[h] == true) System.out.print("■"); } r++; }while(box == box && r<20); ちなみに表示結果は □■■□□■□□■□□■ ■□□■■□■□□■□□ □■□□□■□■■□■□ ・ ・ こんな感じになります。ここで質問なんですが、 過去と同じ配置の配列が出てきた時点でwhile文の ループを終わらせるにはどうすればよいでしょうか? 現時点ではループが20回になった時点で止めるようにしてます。

  • 【Java】ある数列から、素数を探すプログラムについて

    Java初心者です。独学なので質問できる環境が無く、 こちらで質問致します。回答をお願い致します。 以下のプログラムについて質問です。 class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } 上記の「配列の初期化」の個所、 for(int i = 0; i < max; i++) a[i] = true; ここでなぜ、a[i] = true;となるかわかりません。 0と1はどちらも素数ではないと思うので、 私はtrueではないと思うのですが・・・。 ぜひとも教えて頂きたいと思います。

    • ベストアンサー
    • Java
  • javaで素数を探すプログラム。

    javaで素数を探すプログラム。 初歩的なことかと思いますが、助言をお願いします。 if(a[i-1]) ←この部分がわかりません。これはどのような条件がなのでしょうか? class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } このプログラム

    • ベストアンサー
    • Java
  • forループの中での初期化

    class Foo{   public static void main(String args[]){     int x=10;     for(int i=0;i<5;i++){       System.out.print(x+i);     }     System.out.print("\n"+i);   } } このプログラムはコンパイルエラーが出ます。 iがforループの中で宣言されていてその外では無効だからです。 そこで class Foo{   public static void main(String args[]){     int x=10;     int i;     for(i=0;i<5;i++){       System.out.print(x+i);     }     System.out.print("\n i="+i);   } } のようにしてみました。 i=5と出ました。 ふと、iは確かに宣言されているけど、初期化はforの中でしかされていないのになぜコンパイルエラーにならなかったんだろう??、と思ってしまいました。 おかしくないでしょうか?

    • ベストアンサー
    • Java
  • Javaで数独の自動問題作成プログラム

    Javaで次のようなプログラムを作りました。 import java.util.Random; public class NumberPlace { public static void main(String[] args) { int i, j, k, l, check=0, count=0, tmp; int a[][] = new int [9][9]; Random rnd = new Random(); int ran; boolean A=false; while(A==false){ A=true; for ( i=0; i<9; i++ ) for ( j=0; j<9; j++ ) a[i][j] = 0; count = 0; for ( i=0; i<9; i++ ) { for ( j=0; j<9; j++ ) { ran = rnd.nextInt(9); tmp = ran + 1; check = 0; //System.out.println(tmp); for ( k=0; k<j; k++ ) if ( a[i][k] == tmp ) check = 1; for ( k=0; k<i; k++ ) if ( a[k][j] == tmp ) check = 1; for ( k=(i/3)*3; k<(i/3)*3+3; k++ ) for ( l=(j/3)*3; l<(j/3)*3+3; l++ ) if ( a[k][l] == tmp ) check = 1; if ( check == 0 ) a[i][j] = tmp; if ( check == 1 ) j--; if ( count > 50000 ){ A=false;break;} count++; } count = 0; }       } for ( i=0; i<9; i++) { for ( j=0; j<9; j++ ) { if ( a[i][j] < 10 ) { System.out.print(" "); } System.out.print(a[i][j]);       } System.out.print("\n"); } } } これを実行すると、次のようになります。 2 5 3 6 8 4 9 1 7 4 7 9 1 3 5 2 6 8 8 1 6 9 2 7 3 4 5 7 3 5 4 1 6 8 9 2 9 2 1 8 5 3 6 7 4 6 4 8 7 9 2 5 3 1 1 9 4 2 6 8 7 5 3 5 6 2 3 7 1 4 8 9 3 8 7 5 4 9 1 2 6 あとは、ここからランダムに50個数字を抜いて数独の問題にしたいのですが、 どうやったらランダムに数字を抜くことが出来るでしょうか? プログラムソースを提示していただくとありがたいのですが。宜しくお願いします。

  • booleanのエラーコードーの意味が分かりません

    三角形を作るコードを書きました、JAVAの超初心者です宜しくお願いします。 下記のエラーコードが出ています。 1.「型Mathのメソッドabs(int)は引数(boolean)に適用できません。」 ここでどうしてもbooleanで答えを表示させたい場合には、どこをどのように書き直せばよいのでしょうか。 このような書き方がエラーであれば全てのbooleanコードーがエラーになってしまうような気がするのですが。 2.これをEclipseで実行させた場合には、args[1]~args[2]のデーター入力はどのようにしてやるのでしょうか。 実行させたときにキーから入力してやるのですか。 3. コンスタラクタ「this.L1 = a ;」でわざわざ「L1=a;」を定義してやる意味が良く分かりません。 他のメッソド「boolean isTriangle()」、「double getArea()」は「L1・・」で定義されている関数なのにわざわざ「L1=a;」を定義してやる意味が理解できません。 このケースではたまたまコンストラクタは必要ないし、省略も可かもしれませんが。 メッソドの後ろの「()」は、必要の場合はメッソドの引数を入れると本には書いていますが、クラス内で、メンバー変数として(この場合は「int L1, L2, L3 ;」)定義してやれば、メッソドからは、アクセスできるのでそのような処理がなぜ必要かがわかりません。 以上宜しくお願い致します。 ________________________________ class Sample { int L1, L2, L3 ; Sample (int a, int b, int c) { this.L1 = a ; this.L2 = b ; this.L3 = c ; } boolean isTriangle() { if(( L1 + L2 ) > L3 && Math.abs(( L1 - L2 ) < L3 )) { boolean S_bool = true ;     } else{ boolean S_bool = false ; } return S_bool ; } double getArea() { double S = (double)((L1+L2+L3)/2.0) ; double area = Math.sqrt(S*(S-L1)*(S-L2)*(S-L3)); return area ; } } class Sample_Test { public static void main(String args[]) { int s1 = Integer.parseInt( args[ 0 ] ) ; int s2 = Integer.parseInt( args[ 1 ] ) ; int s3 = Integer.parseInt( args[ 2 ] ) ; Sanmple t1 = new Sample ( s1 , s2 , s3 ) ; boolean sankaku = t1.isTriangle() ; double menseki = t1.getArea() ; System.out.println( sankaku ) ; System.out.println( menseki ) ; } }

    • ベストアンサー
    • Java