下記のコードでコンパイルしたところ、出現 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;
}
}
お決まりのクラス宣言などのコードは省きました。
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さんのようにスマートなコードが書けるようにがんばります!!本当に分かりやすい回答ありがとうございました。
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
System.out.printlnの意味がよ...
-
flush()とclose()について
-
1~100までの数字を表示し、か...
-
System.out.printlnの出力先
-
Log4jで機能毎に別ファイルへ出...
-
VBAでEUC-JPのHTMLソースを取得...
-
OpenSSL関数エラーについて
-
system.out.printが出力されない
-
ダブルクォーテーション(””)...
-
tomcatのstdout.logを停止したい。
-
Eclipseのコンソールを常に表示...
-
サーブレットのログ出力先
-
Log4Jではログを改行できない?
-
c言語を用いた電流フィードバッ...
-
ダブルクォーテーションのrepla...
-
オブジェクトの中のプロパティ...
-
javaで質問です。 文字列2023/2...
-
C言語のポインターに関する警告
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
flush()とclose()について
-
System.out.printlnの出力先
-
Log4jで機能毎に別ファイルへ出...
-
1~100までの数字を表示し、か...
-
system.out.printが出力されない
-
1~100までの数字を表示したい
-
StringBufferで改ページ処理を...
-
switch分が機能しません。
-
javaにおけるCSV出力時の文字コ...
-
Eclipseのコンソールを常に表示...
-
Tomcatが無応答となる現象が起...
-
プールとスプールの違いがわか...
-
JavaScriptの変数をjavaのメソ...
-
一定のスペースを空けて端を揃...
-
数字文字列をパック10進数に変...
-
tomcatのstdout.logを停止したい。
-
JAVAのServletで、画像表示につ...
-
System.out.printlnの意味がよ...
おすすめ情報