下記のコードでコンパイルしたところ、出現 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で質問しましょう!
似たような質問が見つかりました
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
1~100までの数字を表示し、か...
-
Javaで改行などが出来ないのです。
-
Log4jで機能毎に別ファイルへ出...
-
flush()とclose()について
-
System.err. printlnとSystem.o...
-
Log4Jではログを改行できない?
-
[至急]Project Euler:#17Number...
-
サーブレットPrintWriterについて
-
Java 九九の表について
-
大容量のテキストファイルの内...
-
バイトスワップ
-
switch分が機能しません。
-
System.out.printを書くとエラー
-
PrintWriterとBufferedWriterの...
-
「得た値をCSV出力するJAVAプロ...
-
ArrayListによる計算表作成
-
java ファイル操作について
-
1~100までの数字を表示したい
-
system.out.printが出力されない
-
固定長データの情報処理について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
1~100までの数字を表示し、か...
-
Javaで改行などが出来ないのです。
-
Log4jで機能毎に別ファイルへ出...
-
1~100までの数字を表示したい
-
flush()とclose()について
-
System.out.printlnの出力先
-
ジャバスクリプトについて。
-
system.out.printが出力されない
-
Eclipseのコンソールを常に表示...
-
System.out.printlnの意味がよ...
-
一定のスペースを空けて端を揃...
-
switch分が機能しません。
-
Tomcatが無応答となる現象が起...
-
javaのwhile文で九九の表
-
Javaの問題なのですが、 永久ル...
-
JavaScriptの変数をjavaのメソ...
-
テキストエリアで改行する
-
StringBufferで改ページ処理を...
-
VBSエラー"オブジェクト型の変...
おすすめ情報