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

今回も引き続き,プログラミング入門となる.

質問と回答

Q.
「public static void main(String[] args)」という「呪文」ですが, 「public static void main(String[] argv)」と書かれた教材もあるようです. String[] の後はどう書いてもいいのでしょうか?
A
「(String[] args)」という部分は(後でやりますが),メソッドの引数 (ひきすうと読む)の宣言部です(メソッドについては今回の授業でやる予定で す).メソッドの引数宣言というのは,初期値をメソッドの呼び出し側が設定 済みであることを除くと変数宣言と同じようなものなので,変数の名前として 可能な名前なら,自由に変更することができます.
Q. Mathというクラス名にしてプログラムを作ったら,
Math.java:3: メソッド sqrt(int) を class Math 中で発見できませんでした。
    Math.sqrt(i);
のようなエラーが出ました.
A.
これは微妙な例でした.Math.sqrtは算術関数と説明しましたが, 「Math」クラスの静的メソッド「sqrt」に対するメソッド呼び出しという面が あります.自分で書いたプログラムに Math というクラス名を使うと,そちら のクラスだとコンパイラが思い込んでしまうため,そちらからsqrtというメソッ ドを探してしまったわけです.別のファイルでプログラムを作り直しても,同 じディレクトリに Math.javaというファイルが残っていると,そちらを参照し に行ってしまうので注意してください.
Q.
「∞」という記号は Mule でどうやって入力するのでしょうか?
A.
仮名漢字システム Wnn6では,記号は「@」+「記号の読み」を入力して から変換すると出てきます.たとえば「〒」は「@」+「ゆうびん」で出ます. 「∞」は「@」+「むげん」で入力できます.

前回の課題について

課題1

1から100までの数の平方根の逆数の和(Σ(1/√n))を求めるプログラムを書き, 実行結果と共に載せなさい.更に,1から1000まで,1から10000まで,1から 100000まで,1から1000000までと増やしていって,1から∞までの平方根の逆 数の和に極限が存在するかどうか見当をつけなさい(数学的な検討は不要です).

解答例

class Kadai1020{
  public static void main(String[] args){
  // 平方根の逆数の和を保持する変数 sum をdouble型で宣言し,0.0を入れる.
    double sum=0.0; 
    // 繰り返し文を制御する int 型の変数 i を宣言する.
    int i;
    // 後でプログラムを変更しやすいように変数で宣言しておく
    int n=100;
    // nまで繰り返すので,繰り返しの条件は i<=nとなる.
    // i++ は i=i+1の意味
    for(i=1;i<=n;i++)
    // 下の式は sum+=1.0/Math.sqrt(i); と書くこともできる.
      sum=sum+1.0/Math.sqrt(i);
      // 結果を表示する
    System.out.println(sum);
  }
}
ktanaka@ux019> java Kadai1020
18.58960382478415
ここで,
    int n=100;
の行を
    int n=1000;
変更することにより,1から1000までに変更することができる.1000000まで 求めると
n=100       18.58960382478415
n=1000      61.80100876524318
n=10000    198.54464544952413
n=100000   630.9967586623756
n=1000000 1998.540145491202
となる.この数を眺めて,収束しそうにないという結論を出すだけで正解 である.

センスのある人は,この数字を見て nを10倍にすると,和は約3倍になってい るとか,和が√nに比例している(実際,積分して近似するとわかるが問題の式 は2√nで近似できる)ということにも気づくと思うが,そこまでは求めない.

解答者の中には,nを変更するたびにプログラムを変更してコンパイルし直す 手間を省くために,nを10倍づつ変化させる2重の for ループにした人もいた. その場合の解答例を書く.

class Kadai1020{
  public static void main(String[] args){
    double sum;
    int i;
    int n;
    // nは10倍づつ変化させて1000000まで計算する.
    // 繰り返しの中に複数の文を含むので「{」を入れる.
    for(n=100;n<=1000000;n=n*10){
    // 毎回1からの和を計算し直すので,sumの値はここで0.0にする
      sum=0.0;
      for(i=1;i<=n;i++)
	sum=sum+1.0/Math.sqrt(i);
      System.out.println("n="+n+",sum="+sum);
    }
  }
}
解答の中には,
      sum=0.0;
を外側の for 文
    for(n=100;n<=1000000;n=n*10){
の前に入れたために,和が正しく計算出来ていないものがあった.

1000000では不足だと更に大きな値で試した人もいると思うが,nの値を10倍に すると,実行時間もほぼ10倍になるのでなかなか終わらない.


今回は課題が1つある.課題をこなしたら, lectures.g99.cp1-ktanaka-W-Wed-5 のニュースグループに投稿すること.
次に進む