プロが教える店舗&オフィスのセキュリティ対策術

下記のコードでコンパイルしたところ、出現 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;
}
}

お決まりのクラス宣言などのコードは省きました。

A 回答 (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の講座で~した☆
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/05/10 20:20

ああ、多分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?
お恥ずかしいのですが、よろしくお願いします。

また、書いていただいたコードを早速実行したところ、
なんとなくつかめそうな感じがしました。
ありがとうございました。

補足日時:2001/05/08 21:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!