レポート#4






課題

第1回Java試験問題を解答を解説し、その動作について考察せよ。
併せて、講義資料 オブジェクト指向プログラムJavaI の中のサンプルプログラムについて考察せよ。


01 Javaのソースファイル{Sample.java}をコンパイルせよ
ーーー>   javac Sample.java


02 Javaソースファイル{Sample.java}をコンパイルした後に出来るファイル名を述べよ
ーーー>   Sample.class


03 Javaコンパイラに対して、実行時に使われるJavaコマンドは何というか述べよ
ーーー>   Javaインタプリンタ


04 Javaアプリケーションに対して、Webブラウザ上で動作するプログラムを何というか述べよ
ーーー>   Javaアプレット


05 Webブラウザ上で動作するJavaプログラムを他の方法で実行するコマンドは何というか述べよ
ーーー>   appletviewerプログラム


06 サーバ上で動作するJavaプログラムを何というか述べよ
ーーー>   Javaサブレット


07 メインメソッドを定義せよ
ーーー>   public static void main(String[] args)


08 標準出力を使用し、"Hello"のみ出力せよ
ーーー>   System.out.print("Hello");


09 Java言語には含まれていない予約語を2つ述べよ
ーーー>   const と goto


10 char型のサイズと保持できる値を述べよ
ーーー>   16ビット、UNICODE


11 データ型として整数を保持できる型を4つ述べよ
ーーー>   byte, short, int, long


12 参照型を2つ述べよ
ーーー>   クラス と 配列


13 文字列や数値の連結が出来る演算子を述べよ
ーーー>   +演算子


14 実行のフローを分岐させる制御文を2つ述べよ
ーーー>   if文、switch文


15 反復処理を行う制御文を3つ述べよ
ーーー>   while文、do文、for文


16 例外処理を行う制御文を述べよ
ーーー>   throw文


17 配列の生成で使用されるキーワードを述べよ
ーーー>   new演算子


18 int型の配列名aの宣言方法を2つ述べよ
ーーー>   int[] a と int a[]


19 配列名aの要素数(大きさ)を述べよ
ーーー>   a.length


20 concatメソッドのクラスを述べよ
ーーー>   java.lang.String


21 int[] a={}; の要素数を数値で述べよ
ーーー>   0


22 int型変数numが100で割り切れるかどうかを判断する制御文を述べよ
ーーー>   if(num%100==0)


23 int型変数yearが、閏年かどうかを判断する制御文を述べよ。
(閏年:4で割れ100で割り切れないが、400で割り切れる年)
ーーー>   (year%4==0 && year%100!=0) || year%400==0



Q24からは下記のプログラムへ
	[nw0343:~/java-rep/rep#4] j03043% cat firsttest.java
class firsttest{
    public static void main (String[] args) {
        System.out.print("[Q24] --> ");
        t1();
        System.out.print("[Q25] --> ");
        t2();
        System.out.print("[Q26a] --> ");
        t3a();
        System.out.print("[Q26b] --> ");
        t3b();
        System.out.print("[Q27] --> ");
        t4();
        System.out.print("\n[Q28] --> ");
        t5();
        System.out.print("[Q29] --> ");
        t6();
        System.out.print("[Q30] --> ");
        t7();
    }

    /*Q24*/
    public  static void t1() {
        int x, y;
        x=100; x += 1; x--; y=200+x;
        System.out.println(y++);
    }

    /*Q25*/
    public static void t2() {
        int a=0, x=0;
        a=5; a += 3; x = ++a;
        System.out.println(x);
    }

    /*Q26a*/
    public static void t3a() {
        int a=9, b=3;
        a /= b;
        System.out.println(a %= b);
    }

    /*Q26b*/
    public static void t3b() {
        int i, j;
        for(i=0, j=0; i<3; i++) ++j;
        System.out.println(i * j);
    }

    /*Q27*/
    public static void t4() {
        int i=2;
        while(i-- > 0) System.out.print(i);
    }

    /*Q28*/
    public static void t5() {
        int num=10000;
        for(int i=0; i<4; i++) num >>= i;
        System.out.println(num);
    }

    /*Q29*/
    public static void t6() {
        int num=0;
        for(int i=1; i<=10; i++) {if(++num % i ==0) num++;}
        System.out.println(++num);
    }

    /*Q30*/
    public static void t7() {
        int a=9;
        if(a++ != 10 | a++ == 10) a++;
        System.out.println(a);
    }
}                                                                       
	


実行結果
[nw0343:~/java-rep/rep#4] j03043% java firsttest
[Q24] --> 300
[Q25] --> 9
[Q26a] --> 0
[Q26b] --> 9
[Q27] --> 10
[Q28] --> 156
[Q29] --> 12
[Q30] --> 12                                                            
	



考察

	Q1,2 : Javaのソースファイルをコンパイルするために必要なコマンドは「Javac ソースファイル名」。
	       コンパイルすると「.class」を拡張子に持つクラスファイルが生成される。
	       Javaのソースプログラムのファイル名の拡張子は「.java」でなければいけない。
	
	Q3 : コンパイルされたファイルを実行するときに使用するJavaコマンドをJavaインタプリンタという。
	
	Q4〜6 : Webブラウザ上で実行できるJavaプログラムをJavaアプレットという。
	      appletviewer コマンドで実行できる。
	      アプレットについてはレポート2でもやった。
	      対してサーバー上で実行できるプログラムをサブレットという。
	    
	Q7 : メインメソッドは public static void main(String[] args) で定義される。 
	
	Q8 : Helloのみを出力するには System.out.print(Hello); にしなければならない。
	   System.out.println(Hello); にすると、改行(\n)も出力されてしまう。
	
	Q9 : Javaに含まれていない予約語は const と goto である。
	   C言語では予約語となっている。
	
	Q10,11 : char型のサイズは16ビット、保持できる値はUNICODE。
	         また、整数を扱う型は byte, short, int, long です。
	
サイズ保持できる値範囲
boolean1ビットtrueまたはfalse
char16ビットUNICODE\u0000 〜 \uffff (0 〜 65535)
byte8ビット符号付き整数-128 〜 127
short16ビット符号付き整数-32768 〜 32767
int32ビット符号付き整数-2147483648 〜 2147483647
long64ビット符号付き整数-9223372036854775808 〜 9223372036854775807

	Q12 : 参照型にはクラスと配列がある。
	    参照型とは、データを指定する時「データそのもの」を指定するのでは無く、
	    「データが保存されている場所」を指定する時に使う変数。
	
	Q13 : 文字列や数字の連結ができる演算子は「+」で、文字列連結演算子という。
	    例:
	    [Masaki-HIGA:~/java-rep/rep#4] j03043% cat plus.java                            
         /*
           文字列結合演算子
         */

         class plus{
             public static void main (String[] args) {
                 System.out.println(123 + 456);
                 System.out.println("123" + 456);
                 System.out.println("123" + "456");
                 System.out.println(123 + "456");
                       System.out.println("abc" + "efg");
                       System.out.println("abc" + 123);
             }
         }
	    結果:
	    [Masaki-HIGA:~/java-rep/rep#4] j03043% java plus
         579
         123456
         123456
         123456
               abcefg
               abc123
	
	    文字列同士を連結するときは両方の文字列を””で囲む、文字列と数字のときは
	    囲むのは文字列のみでも構わない。数字同士はどちらか片方で十分。
	    数字をどちらも””で囲まなかったら加算される。
	
	Q14,15 : これらの制御文については何回目かのレポートでやったので略。
	
	Q16 : 例外処理を行う制御文はthrow。
	     例外処理で主に throw, throws, try-catch の3つの文を用いる。
	     例外処理はクラス間をまたがって処理を移すことが出来る。
	
	Q17〜19 : 配列を宣言するときには
	         型名 変数名[];  もしくは  型名[] 変数名; で可能。
	        宣言した変数に領域を割り当てるときに new が使われます。
	         変数名 = new 型名[サイズ]; 
	            配列の宣言と領域の割り当てを同時に行う時は
	         型名 変数名[] = new 型名[サイズ]; でできます。
	        宣言と同時に値を代入するときには new は必要ありません。
	         int[] rei = {1,2,3};  <ーー例
	        また、配列の大きさを調べるには、配列名.length とすればよい。
	
	Q20 : concatのメソッドはjava.lang.Stringです。 
               concatは指定した文字列をこの文字列の後ろに連結します。 
              "文字列".concat("文字列") というふうに使用します。 
	
	Q21: [nw0343:~/java-rep/rep#4] j03043% cat Q21.java
                public class Q21{
                    public static void main(String args[]){
                        int a[]={};
                        System.out.println(a.length);
                    }
                }
	
	      [nw0343:~/java-rep/rep#4] j03043% java Q21
            0
	    
	
	Q23 : 閏年の条件は「4で割り切れて100で割り切れないが400で割り切れる」なので
	    (year%4==0 && year%100!=0)||year%400==0
	
	Q24 : まずxに100を代入。
	    でxにx+1を代入。 この時xは101
	    xから1引く 
	    200+xをyに代入。
	    yを出力した後に1プラスされるので出力されるのは200+xの300。
	
	Q25 : まずaに5を入れる。
	    aにa+3を代入。  この時aは8
	    全置インクリメントなのでaに1足した後にxに代入。
	    なので出力されるのは9
	
	Q26a : まずaに9、bに3を代入。
	      aにa÷bの値を代入。 この時aは3
	      a÷bの余りを出力。 結果は0
	
	Q26b : i=0 --> j=1
	     i=1 --> j=2
	      i=2 --> j=3
	      i=3 --> for文から抜ける
	      iとjをかけた値を出力。
	
	Q27 : iに2を代入。
	    iが0より大きい限りiを表示、whileの中でiが0より大きいか比較後1引かれて表示される。
	    System.out.print();では改行は出力されないので結果は1と0がくっついて10
	   
	Q28 : numに10000代入。
	    iが0から3まで増加させる。
	    numをiの数だけ右にシフトさせる。
	    1+2+3=6で合計右に6シフトして表示。
	
	Q29 : numに0代入。
	    iが1から10まで増加。
	    ++num÷1の余りが0ならnumに1足す。
	    iが1の時は余り0でnumが2になる。
	    その後は余りが0になることはなくiが10の時numは11。
	    表示する時先に1足して表示するので結果は12。
	
	Q30 : aに9代入。
	    aが10と違うか比べて1足す。
	    aが10と同じか比べて1足す。
	    上の二つのどっちか(両方でもいい)が真ならまたaに1足す。
	    aを表示。・・多分。
	
	


考察2


参考プログラム
public class Comp4 {                         // クラスComp4を定義
    int add(int x, int y) {                    // メソッドadd(int x,int y)を定義
      return x + y;                            // x + y を返す
    }
    int substract(int x, int y) {              // メソッドsubstractを定義
      return x - y;                            // x - y を返す
    }
    int multiply(int x, int y) {               // メソッドmultiplyを定義
      return x * y;                            // x * y を返す
    }
    int divide(int x, int y) {                 // メソッドdivideを定義
      return x / y;                            // x / y を返す
    }
  }
  
  class Keisan {
    public static void main(String args[]) {
      int a, b, wa, sa, seki, sho;
      Comp4 enzan = new Comp4();               // クラスComp4のオブジェクトenzan作成
      a = 20;
      b = 10;
      wa   = enzan.add(a, b);                  // オブジェクトenzanのadd(a,b)を実行
      sa   = enzan.substract(a, b);            // 同上のsubstract(a,b)を実行
      seki = enzan.multiply(a, b);             // 同上のmultiplu(a,b)を実行
      sho  = enzan.divide(a, b);               // 同上のdivide(a,b)を実行
      System.out.println(a + " + " + b + " = " + wa);
      System.out.println(a + " - " + b + " = " + sa);
      System.out.println(a + " * " + b + " = " + seki);
      System.out.println(a + " / " + b + " = " + sho);
    }
  } 
	

実行結果
20 + 10 = 30
20 - 10 = 10
20 * 10 = 200
20 / 10 = 2
	


Comp4で加算、減算、乗算、除算の4つの結果の値を返すメソッド作成。
Comp4クラスのオブジェクトを作成。
aに20、bに10代入する。
wa、sa、seki、shoにそれぞれComp4のメソッドから返された値を代入。
コンパイルするとComp4とKeisanの2つのクラスファイルが作成される。
実行するにはメインメソッドがあるKeisanの方を実行。


感想、反省


なんだか講義資料で考察されてたのでちゃんと考察することができませんでした。
液晶が割れているので誤字脱字があったらすいませんw