07 前回のプログラムをもっときれいに表示しよう

【第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.コンピュータの処理順番が見えてきた

これで、色んな形式で表示させることができるようになってきましたね。
では、今回はここまで!

→ 次へ(第8回:printlnとは何かを理解する)