10/19 Java プログラミング入門(3)



質問と回答

Q.
第1, 2回を受講できませんでしたが,第3回から受講できますか?
A.
講義資料を自習して追いつけば,第3回から受講できます.第1, 2回で課題が出題されているので,締め切り(10/19)までに提出してください.
Q.
資料のプログラミング例を見ると、public static void main(String[] の後がargvのものとargsのものがありますが、どういう使い分けがあ るのですか?
A.
良いところに気がつきましたね. その部分は,メソッド(参照: クラスメソッド )の引数なので,変数名と同じで,プログラマが好きな名前をつけることができます. たとえば,
public static void main(String[] aaaa)
と書いても問題なく動きます. ただC言語で,main関数に渡るコマンド引数の名前を argv(argument vectorの略だと思われます)と 書く慣習があった関係で,
public static void main(String[] argv)
と書く人は多くいます.

一方,Java言語を設計したSun Microsystemsの提供するサンプルコードの多くは,

public static void main(String args[])
のように,args(ARGumentSの略?)という変数名を使っているため,argsを使う人も多くいます( 「String args[]」と「String[] args」はどちらでも同じ意味になります).

田中の講義資料では,なるべくargsの方を使うようにしているのですが,つい つい手がすべって,argvと書いてしまっているところがありました(さきほど調 べたら9箇所見つかりました).混乱の元なので,変更することにします.


Q.
3の倍数か否かを計算させるプログラムで
  int i,v=3;
  for(i=0;i<9;i++);
    if((i % v) ==0)
      System.out.println(i + "は" + v + "の倍数です。");
    else 
      System.out.println(i + "は" + v + "の倍数ではない。");
と書いて実行したら 9は3の倍数です。 しか表示されませんでした。どうして0〜8が計算されなかったのでしょうか。教えて下さい。
A.
  for(i=0;i<9;i++);
の行で,行末にセミコロン「;」がついていますね.これを入れると, for文の説明 ( http://lecture.ecc.u-tokyo.ac.jp/~ktanaka/programming05/primers/1-6.html )で
 for(式1;式2;式3)
   文
と書かれていた文の部分が空文(なにもしない文)と見なされてしまいます.そこで,このfor文ではiを0から8まで 増やしながら繰り返しは実行するものの,繰り返しの実行の中身は空で,iが9になってfor文を抜けてから 次のif文を実行したというわけです.

このように,1文字セミコロン「;」を入れ間違うだけで,プログラムの意味が違ってしまうことがあるので, プログラムを作成する時には注意が必要です.


Q.
(2)に17、(3)にn%2、(4)にn*3+1、(5)にcount=count+1といれ るとコンパイルのとき(3)(4)は文字ではないというエラーが出ました。 また、(3)に(n%2)(4)に(n*3+1)といれても、同じエラーが出ました。さ らに、(3)(4)に何も入れないと、コンパイルはできたのですが、実行す ると17が無限に出力されました。(5)は問題ないと思うのですが、どうす ればよろしいでしょうか。
A.
質問をする時は,プログラムの断片(短い場合は全体でも),エラーメッセージ そのままをコピー & ペーストした方が間違いなく伝わります.もしも,
// 実行結果は (1) になります
class Collatz{
    public static void main(String[] args){
        // (2)の部分は自分の学生証番号の下4桁を入れなさい。
        // 頭の0はつけないでください。
        int n= 17;
        int count=0;
        while(n!=1){
            System.out.println(n);
            if((n%2)==0){
                // nを2で割る
                n%2 ;
            }
            else{
                // nを3倍して1を足す
                n*3+1 ;
            }
            // 変数countを1増やす
            count=count+1 ;
        }
        System.out.println("count="+count);
    }
}
というプログラムだったとすると,コンパイル時に
Collatz.java:6: \65297 は不正な文字です。
        int n= 17;
               ^
Collatz.java:6: \65303 は不正な文字です。
        int n= 17;
                ^
Collatz.java:12: \65285 は不正な文字です。
                n%2 ;
                 ^
Collatz.java:12: 文ではありません。
                n%2 ;
                ^
Collatz.java:12: \65298 は不正な文字です。
                n%2 ;
                  ^
Collatz.java:16: 文ではありません。
                n*3+1 ;
                   ^
エラー 6 個
というエラーが出ますが,報告されたエラーとは微妙に違うようですね.「文字 ではありません」と書いたのは「文ではありません.」のつもりだったのでしょ うか? 大きな違いですが.

なお,(3), (4)は誤りですが,直接答えるのは問題なので,ヒントで答えます.


前回までの課題について


前回までの補足


今日の内容


今日の課題