Report#4


[課題]

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

[1]試験問題と解答の解説と考察
		Q1: Javaのソースプログラム(Sample.java)をコンパイルせよ。
		A1: javac Sample.java
		
		
		Q2: Javaソースファイル(Sample.java)をコンパイルした後に出来るファイル名を述べよ。
		A2: Sample.class
		
		
		Q3: Javaコンパイラに対して、実行時に使われるjavaコマンドは何と言うか述べよ。
		A3: Javaインタープリタ
		   /*interpreter
		    プログラムの実行方式の一つで、ソースコードを1行ずつ機械語に翻訳しながら実行する。*/
		
		
		Q4: Javaアプリケーションに対して、Webブラウザ上で動作するプログラムを何と言うか述べよ。
		A4: Javaアプレット
		   /*applet
		    ウェブブラウザで実行されるプログラム*/
		
		
		Q5: Webブラウザ上で動作するJava プログラムを他の方法で実行するコマンドは何というか述べよ。
		A5: Javaアプレットビューア
		   /*appletviewer
		    appletviewer コマンドは urls に指定されたドキュメントあるいはリソースと接続して、
		    そのドキュメントが参照するそれぞれのアプレットを独自のウィンドウで表示します。*/
		
		
		Q6: サーバ上で動作するJavaプログラムを何と言うか述べよ。
		A6: Javaサーブレット
		   /*servlet
		     CGIプログラムは、ウェブ・サイトの処理能力を引き下げる主な原因となりうる。
		    Javaサーブレットだとこの問題を回避できるらしい。*/
		
		
		Q7: メインメソッドを定義せよ。
		A7: public static void main(){}
		
		
		Q8: 標準出力を使用し、"Hello"のみ出力せよ。
		A8: System.out.print("Hello");
		
		
		Q9: Java言語には含まれていない予約語を2つ述べよ。
		A9: const goto
		
		
		Q10: char型のサイズとして整数を保持できる値を述べよ。
		A10: 16bit Unicode文字
		
		
		Q11: データ型として整数を保持できる型を4つ述べよ。
		A11: byte short int long
		
		
		Q12: 参照型を2つ述べよ。
		A12: クラス型 配列型
		     /*基本型の値は決まったサイズのメモリに格納できます(型に応じて1バイトから8バイト)。
		     クラス型と配列型は複合型で、オブジェクトと配列は複数の型の値を含んでおり、
		     標準的なサイズはなく、多くの場合8バイト以上のメモリが必要になる。*/
		
		
		Q13: 文字列や数値の連結ができる演算子を述べよ。
		A13: 文字連結演算子
		
		
		Q14: 実行のフローを分岐させる制御文を2つ述べよ。
		A14: if swhitch
		
		
		Q15: 反復処理を行う制御文を制御文を3つ述べよ。
		A15: for while do while
		
		
		Q16: 例外処理を行う制御文を述べよ。
		A16: throw
		     /*Javaインタプリタは、throw文を実行すると直ちにプログラムの通常の実行を停止して、
		     投げられた例外を受けるハンドラ(例外を処理できる例外ハンドラ)を探す。*/
		
		Q17: 配列の生成で使用されるキーワードを述べよ。
		A17: new
		     /*新しいオブジェクトを生成するときには newを使います。*/
		
		
		Q18: int型の配列名aの宣言方法を2つ述べよ。
		A18: int[] a; int a[];
		
		
		Q19: 配列名a要素数(大きさ)を述べよ。
		A19: a.length
		     /*配列の要素数は、配列名.lengthで取得することができます。*/
		
		
		Q20: concatメソッドのクラスを述べよ。
		A20: java.lang.String
		    2つの文字列の長さを連結するにはconcatメソッドを文字列壱.concat(文字列弐)と使う*/
		
		
		Q21: int[] a={}; の要素数を数値で述べよ。
		A21: 0
		   /*配列aの{}の中に何も格納されてないので、要素数は0*/
		
		
		Q22: int型変数numが100で割り切れるかどうかを判断する制御文を述べよ。
		A22: if(num%100 == 0);
		   /*もし『numを100で割ってあまりが0』なら*/
		
		Q23: int型変数yearが、うるう年かどうかを判断する条件式を述べよ。
		    (うるう年:4で割り100で割り切れないが、400で割り切れる年)
		A23: if(((year&=4)==0)&&((year%=100) != 0)||((year&=400)));
		   /*||と&&をうまく使い分けるプログラムです。C言語の時にやったので簡単でした。*/
		
		Q24〜Q30のプログラム
		
		public class J4{
    public static void main(String argv[]){
        test24();
        test25();
        test26a();
        test26b();
        test27();
        test28();
        test29();
        test30();
    }

    public static void test24(){
        int x,y;
        x=100; x+=1; x--; y=200+x;
        System.out.println("Q24 :" +(y++));
    }

    public static void test25(){
        int a=0, x=0;
        a = 5; a +=3; x = ++a;
        System.out.println("Q25 :" + x);
    }

    public static void test26a(){
        int a=9, b=3;
        a/=b;
        System.out.println("Q26a:" + (a%=b));
    }

    public static void test26b(){
        int i, j;
        for(i=0,j=0; i<3; i++) ++j;
        System.out.println("Q26b:" + (i*j));
    }
 
    public static void test27(){
        int i=2;
        while(i-->0) System.out.println("Q27 :" + i);
    }

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

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

    public static void test30(){
        int a=9;
        if(a++ != 10 | a++ == 10) a++;
        System.out.println("Q30 :" + a);
    }
}
[実行結果]
[nw0311:~/java] j03011% javac J4.java
[nw0311:~/java] j03011% java J4
Q24 :300
Q25 :9
Q26a:0
Q26b:9
Q27 :1
Q27 :0
Q28 :156
Q29 :12
Q30 :12
[考察] Q24: int x,y; x=100; x+=1; x--; y=200+x; System.out.println(y++); //* x=100 x+=1 →x=100+1=101 x-- →x=101-1=100 y=200+x→y=200+100=300 yを表示してから,y++→y=300+1=301 表示される値は300 *// Q25: int a=0, x=0; a = 5; a +=3; x = ++a; System.out.println(x); //*a=5 a+=3 →a=5+3=8 x=++a→x=a+1=8+1=9 表示される値は9 *// Q26a: int a=9, b=3; a /= b; System.out.println(a %= b); //*a=9,b=3 a/=b→a/bの余りを表示するので 表示される値は0         *// Q26b: int i, j; for(i = 0, j = 0; i< 3; i++) ++j; System.out.println(i * j); //*for(i=0,j=0; i<3; i++)++j → つまり3回、i++,j++を行う → i=3,j=3 i*j → 3 X 3=9 表示される値は9 *// Q27: int i=2; while(i-- > 0) System.out.print(i); //* i=2 iが1減少→i=1 1を表示 iが1減少→i=0 0を表示 i=0なので,while文が終了。 表示される値は1と0 *// Q28: int num=10000; for(int i = 0; i< 4; i++) num >>= i; System.out.println(num); //*num=10000 = (10011100010000) , i = 0 i が 1 増加 し、numをiの値の分だけ右シフトビット演算 → i = 1, num = (01001110001000) = 5000 i が 1 増加 し、numをiの値の分だけ右シフトビット演算 → i = 2, num = (00010011100010) = 1250 i が 1 増加 し、numをiの値の分だけ右シフトビット演算 → i = 1, num = (00000010011100) = 156 for文が終了し、numを出力。 表示される値は156 */ / Q29: int num = 0; for(int i = 1; i <= 10; i++){ if(++num % i ==0) num++; } System.out.println(++num); //*num=0 for(int i=1; i<=10; i++) →つまりi=0から10ばでi++ if(++num%i ==0)num++ →++num/iのあまりが0なら++numを表示 まず、i=1からi<=10までなので、10回 I++ そのかん、++num%i == 0になるので、num++も10回よって、num=11 最後に++numを表示するので num=11+1=12 表示される値は12 *// Q30: int a = 9; if(a++ != 10 | a++ == 10) a++; System.out.println(a); //*a=9 if(a++!=10 | a++==10)a++; a++が10でない,もしくは10のとき、a++ ifの中ですでに,aは11になり、最後にa++されるので 表示される値は12 *//
[2]オブジェクト指向
class CircleC{                //面積を求めるクラス//
    double pai = 3.14;        //pai=3.14//
    double circle(int r){     //メソッド//
        return pai * r * r;   //pai*r*rの値を返す//
    }
}

class CircleV{                    //体積を求めるクラス//
    double pai = 3.14;           //pai=3.14//
    double circle(int r){        //メソッド//
        return (4/3)*pai*r*r*r;  //体積の値を返す//
    }
}

public class Circle{
    public static void main(String args[]){
        double area;                                 //double型でareaを宣言//
        CircleC obj1 = new CircleC();                //クラスCircleCのオブジェクトを生成(インスタンス化)//
        area = obj1.circle(10);                      //circle()に10入れた値をareaに代入//
        System.out.println("area = " + area);        //area の数値を表示//
        double volume;                              //double型でvolumeを宣言// 
        CircleV obj2 = new CircleV();                //CircleVのオブジェクト変数obj2を、インスタンス化//
        volume = obj2.circle(10);
        System.out.println("volume = " + volume);
    }
}

[実行結果]
[nw0311:~/java] j03011% javac Circle.java
[nw0311:~/java] j03011% java Circle
area = 314.0
volume = 3140.0

r=5のとき
area = 78.5
volume = 392.5

オブジェクト (object) とは、操作する「対象」のことです。データとそれを処理する方法(メソッド)を一つのカプセルにしたものです。

オブジェクト指向 (oo: object oriented) とは、現実世界での作業の考え方をソフトウェア上で実現する設計思想のこと。オブジェクト指向では、オブジェクトというモノどうしが会話をして、これに基づいて各々が振舞うことで作業が進みます。

System.out.println()という名前のメソッドもそうらしいです。Systemはクラスで、このクラスにはoutという名前のクラスフィールドがある。

変数名.メソッド名();

[反省&感想]

今回は考察に時間がかかるので結構苦労しました。
本当はもっと、オブジェクト指向についてもっとつっこみたかったけど、時間配分を間違え少ししかできませんでした。
これから難しくなりそうなので、キチンと時間配分を考えた勉強の仕方を身に付けなければ、、、
[参考文献] (某)稚内大学情報系 java辞典