【第7回】前回のプログラムをもっときれいに表示しよう
今回は、前回のプログラムの修正です。
なので、前回の講座に取り組んでいるのは絶対条件!ですよ。
前提:前回講座を四苦八苦して取り組んだこと
では、なにをやるかというと。
前回の表示結果、もう一度見てみましょう。
C:\work>java Calculate 9 3 18 2 C:\work>
数字が並んでいるだけでなんのことかわからないですよね。
今回はこれがなんの結果なのかわかるように
文字列を追加してみましょう。
では、表示結果を示しますので、
その表示結果を得られるプログラムにしてみてください
(前回の解答例1と2、両方やってみて下さいね)。
C:\work>java Calculate 6 + 3 = 9 6 - 3 = 3 6 * 3 = 18 6 / 3 = 2 C:\work>
今回はちょっと難しいのでちょっとヒントを。
次のプログラムと、その実行結果を示しておきます。
ファイル名:HelloWorld.java
public class HelloWorld { public static void main(String [] args) { System.out.println("Hello " + "Java World !"); } }
実行結果
C:\work>java HelloWorld Hello Java World ! C:\work>
ここまでのヒントで解けるかな?
頑張ってみてください。
・
・
・
さあ、どうでした?
できたでしょうか?
ではまず、ヒントの意味から考えていきましょう。
ヒントのプログラムでは、
System.out.println("Hello " + "Java World !");
と書いてあるものが
Hello Java World !
と表示されましたね。
ということはprintlnのカッコの中では”Hello “という部分と
“Java World !”という部分を
“+”の記号で連結することができるようですね。
“Hello “という部分も”Java World !”という部分も文字列。
文字列が連結できるということは、あるいは変数も...
ということで、解答例に行きましょう。
まずは簡単なので前回の解答例2の方から。
(1)解答例2の修正版
public class Calculate { public static void main(String [] args) { int addResult; // 加算結果変数 int subResult; // 減算結果変数 int multResult; // 乗算結果変数 int divResult; // 除算結果変数 addResult = 6 + 3; subResult = 6 - 3; multResult = 6 * 3; divResult = 6 / 3; System.out.println("6 + 3 = " + addResult); System.out.println("6 - 3 = " + subResult); System.out.println("6 * 3 = " + multResult); System.out.println("6 / 3 = " + divResult); } }
どうですか?
これはヒントを応用して、
「printlnで“+”記号で文字列と文字列を連結できたのだから、
文字列と変数も連結できるのでは?」
と推理できたなら解けると思います。
そうですね、printlnではこのような書き方も出来るんですね。
(2)解答例1の修正版
さあて、ここで問題となってくるのが前回の解答例1。
前回の解答例1では、printlnのカッコの中で直接計算しましたよね。
失敗例1
C:\work>javac Calculate.java Calculate.java:16: エラー: 二項演算子'-'のオペランド型が不正です System.out.println("6 - 3 = " + 6 - 3); ^ 最初の型: String 2番目の型: int エラー1個 C:\work>
ああ、何言っているのかわからない!
さあ、あなたならどうしますか?ちょっと考えてみてください。
・
・
・
一つの方法として、以下の方法があります。
まず、エラーが出たのは6行目でしたね。
5行目では何も言われず、6行目でおかしいと。
それなら5行目だけ残してコンパイル、実行してみると...
C:\work>java Calculate 6 + 3 = 63 C:\work>
あらら?計算結果じゃなくてそのまま6と3がくっついてしまいましたね。
ということは、どうやら5行目の”+”の記号は
計算記号としてではなくprintlnの連結する機能として
働いてしまったみたいですね。
うーん、どうすれば良いのだろう...
これはちょっと難しいので、ここは解答を示してしまいましょう。
解答例は以下のようになります。
public class Calculate { public static void main(String [] args) { System.out.println("6 + 3 = " + (6 + 3)); System.out.println("6 - 3 = " + (6 - 3)); System.out.println("6 * 3 = " + (6 * 3)); System.out.println("6 / 3 = " + (6 / 3)); } }
これで正しい結果が得られます。
でも、これはどういうことなのでしょう?
では一行取り出してみましょう。
System.out.println("6 + 3 = " + (6 + 3));
これできちんと表示されるということは...
“6 + 3 = “の後の“+”記号はprintlnの連結機能として
(6 + 3)の中の“+”記号は計算記号として
認識された、ということですね。
さあ、どうしてこういう結果になったのでしょうか。
ではここでコンピュータの気持ちになってみましょう。
コンピュータは左から順番に式を見ていきます。
ということは、今回のprintlnのカッコの中は
次の順番で処理されている、ということなんです。
ここ、ちょっと細かいけど、順を追ってなんとか追ってみて!
[1]”6 + 3 =”という文字列を発見
[2]次に“+”記号を発見、この記号は文字列連結の記号と認識する
[3]次にカッコを発見
[4]カッコの中を見てみると6 + 3と書いてある
(→“”でくくられていないからこれは文字列ではなく数値と判断)
[5]6 + 3の計算を行う
[6]計算した結果が入った変数を、前にあった文字列と連結
ここでわかりづらいのは[5]から[6]にいく部分ですね。
前回の講座でも言いましたが、
“6 + 3”という部分はそのまま使われるのではなく、
コンピュータが変数を用意し、その変数に値を代入するんでしたよね。
ということは[6]で行っている事は「文字列と変数の結合」なんです。
そうです、これは(1)でも使ったprintlnの書式と同じですよね!
さあ、どうでしょう。
わかりましたか?
ちょっと細かい話になっていますが、
順を追っていけばなんとかわかるのではないかと思います。
というより、ここで言いたかったのは、
「コンピュータは順を追って処理を行っている」
ということなんです。
コンピュータは単純なもので、
結局は「順を追って処理を行っている」だけなのです。
だから、行き詰まっても、順を追ってプログラムを追っていけば
必ず問題点は見つかるはずなのです。
ここは、わずらわしく感じられるかもしれませんが、
こここそがプログラムのみそ。
これがパズルを解くような快感に変わっていたら、
もうあなたはプログラムから離れられなくなるでしょう(笑)
あ、それと、実際のプログラム上では
「一番小さいカッコから順番に処理が行われた」ことに気づきました?
そうなんです。
コンピュータは左から順番に式を追っていきますが、それは結局、
プログラムの中にあるカッコの一番小さいものから
順番に処理を行っていくんです。
ちょっと長くなりましたが、今回は以下のことを学びました。
1.println表示方法の理解が深まった
2.コンピュータの処理順番が見えてきた
これで、色んな形式で表示させることができるようになってきましたね。
では、今回はここまで!