Report#3


講義資料を参考に、その範囲のJavaの基礎的な文法について教科書と対応させながら解説し、考察せよ。

基本的なルール

ソースプログラム

public /*これもコメントです*/ class Test01 {       // Test01.java
    public static void main(String args[]) {   // mainの記述
        System.out.println("コメント");
        cmnt();                                // cmntスレッドの呼び出し
        System.out.println("¥n¥n文字列出力");
        smp1();
        System.out.println("¥n¥n変数宣言と数値出力");
        smp2();
        System.out.println("¥n¥n繰り返し処理");
        smp3();
        System.out.println("¥n¥n条件処理");
        smp4();
    }

    public static void cmnt() {                // mainの記述
        System.out.println("My first Java.");  // 文字列出力する
    }

    public static void smp1() {
        System.out.print("AAAAA");
        System.out.print("BBBBB¥nCCCCC¥n");
        System.out.println("DDDDD");
        System.out.println("EEEEE¥nFFFFF¥n¥nGGGGG");
    }

    public static void smp2() {
        int a, b, sum;
        
        a = 100;
        b = 200;
        sum = a + b;
        System.out.print("a=");              // 文字列だけ出力
        System.out.println(a);               // 数値だけ出力
        System.out.println("b=" + b);        // 文字列と数値を出力
        System.out.println("a+b=" + sum);    // 結果を出力
        System.out.println("a+b=" + (a+b));  // 直接計算させる
    }

    public static void smp3() {
        int i, sum;
        
        for (i=1; i<=5; i++)
            System.out.println("i=" + i);

        sum = 0;
        for (i=1; i<=5; i++) {
            sum = sum + i;
            System.out.println("sum=" + sum);
        }
    }

    public static void smp4() {
        int i;

        for (i=1; i<=5; i++) {
            System.out.print("i=" + i);
            if (i < 3)
                System.out.println(" 3未満です");
            else
                System.out.println(" 3以上です");
        }
    }

}


実行結果

コメント
My first Java.


文字列出力
AAAAABBBBB
CCCCC
DDDDD
EEEEE
FFFFF

GGGGG


変数宣言と数値出力
a=100
b=200
a+b=300
a+b=300


繰り返し処理
i=1
i=2
i=3
i=4
i=5
sum=1
sum=3
sum=6
sum=10
sum=15


条件処理
i=1 3未満です
i=2 3未満です
i=3 3以上です
i=4 3以上です
i=5 3以上です

考察

・コメントについて

 プログラム中に、説明文を書いておくことができる。この説明文のことをコメントや注釈という。Java言語のコンパイラによって、コメントは単なる空白とみなされるので、コメントに何を書いても、実際のプログラムの動作には影響はない。コメントは、プログラムを後で読む人のために書くものである。
 Java言語のコメントは次の3種類がある。

(1) 一行コメント (single-line comment)
 一行コメントは//で始まり、その行の最後まで続く。//で始まる文字列はすべてコメントと見なされる。

(2) 通常のコメント (traditional comment)
 通常のコメントは/*で始まり、*/で終わる。この間に書かれた文字列は、すべてコメントと見なされる。

(3) ドキュメンテーション・コメント (documentation comment)
 ドキュメンテーション・コメントは/**で始まり、*/で終わる。この間に書かれた文字列は、すべてコメントと見なされる。ドキュメンテーション・コメントはプログラムの説明文書を機械的に作成するために用いられる特殊なコメントである。ここに書かれた文章から、JDKのjavadocというツールを使って自動的にマニュアルを作成する事ができる。

 コンパイラはコメントを単なる空白と見なす。つまりプログラムをコンパイルする際に、コメントは何の意味も持たないが、だからといってコメントをかかなくていいわけではない。プログラムは、正しく動き、しかも人間に読みやすくなくてはならない。プログラムの誤りを修正したり、プログラムを改良する時に、よく書かれたコメントは大きな助けとなる。

・文字列出力について

 文字列を出力するためのメソッドは2つ存在する。System.out.printlnとSystem.out.printである。

System.out.println
 System.out.printlnは文字列を表示した後、改行をする。

System.out.print
 System.out.printは文字列を表示した後、改行しない。

・変数宣言と数値出力について

 変数とは、何かを入れておく箱のようなものである。変数という箱に対してできることは、変数を作る(変数宣言)、値を入れる(代入)、値を見る(参照)の3つである。

1.変数を作る(変数宣言)
 何かをいれておく箱を作ることを、Java言語では「変数を宣言する」あるいは「変数を定義する」という。int x;と書くと変数xが宣言されたことになる。Java言語で変数を宣言する際、必ず「その箱にはなにをいれるのか」を指示しなければならない。箱に入れるものの種類のことを変数の型と呼ぶ。
上のプログラムでは
 int a, b, sum;
 aとbとsumという変数が宣言された(a,b,sumの箱が作られた)ということになる。

2.値を入れる(代入)
 箱に何かをいれる、すなわち変数に値を入れることを代入という。例えば、x = 4;と書けば、変数xに4という値を代入したことになる。変数を代入する場合、必ず変数は左辺に書かなければならない。
上のプログラムでは
 a = 100;
 b = 200;
 sum = a + b;
 aには100が、bには200が、sumにはaとbを足したものが代入されたことになる。

3.値を見る(参照)
 変数という箱を作り、箱に何かを入れた。変数の中に入っているものを、値という。変数の値を見ることを変数を参照するという。
上のプログラムでは
 System.out.print("a=");
 System.out.println(a);
 System.out.println("b=" + b);
 System.out.println("a+b=" + sum);
 System.out.println("a+b=" + (a+b));
 によって、それぞれの値を表示することができる。

・繰り返し処理について

 for文の構造 for( 初期化; 条件式; 次の一歩){ 繰り返す処理 }
 for文とは、「条件を満たす間繰り返す」という意味を持つ。forの後には、(と)でくくられた部分があり、初期化、条件式、次の一歩が書かれてる。初期化は、繰り返しの準備を行う部分であり、繰り返しの前に一度だけ実行される。条件式は、繰り返しを続ける条件を表現した式であり、ここに書かれた条件を満たす間繰り返される。次の一歩は繰り返す処理が1回終わった後に実行される。ここには、繰り返しを次に進めるための処理が書かれている。
上のプログラムでは
 int i, sum;
 for (i=1; i<=5; i++) {
   System.out.println("i=" + i);
 }
 iの初期値を1とし、iを1ずつ増やし、iが5以下の間繰り返し("i=" + i)を表示する。
 sum = 0;
 for (i=1; i<=5; i++) {
   sum = sum + i;
   System.out.println("sum=" + sum);
 }
 iの初期値を1とし、iを1ずつ増やし、iが5以下の間繰り返し("sum=" + sum)を表示する。

・条件処理について

 if文の構造 if(条件式){ 条件が成り立つときの処理 }
 if文とは、「条件を満たす場合の処理」という意味を持つ。ifの次に(と)でくくられた部分に条件式が書かれている。条件式の後の{と}でくくられた部分が、条件が満たされたときに行う処理の範囲を示す。
 上のプログラムでは
 for (i=1; i<=5; i++) {
   System.out.print("i=" + i) {
   if (i < 3)
    System.out.println(" 3未満です");
   else
    System.out.println(" 3以上です");
   }
 }
 iの初期値を1とし、iを1ずつ増やし、iが5以下の間繰り返し("i=" + i)を表示する。iが3未満なら、"3未満です"と表示し、そうでなければ"3以上です"と表示する。



変数と定数

プログラムソース

public class Test02 {                  // Test02.java
    public static void main(String args[]) {
        char    ch;
        boolean bdt;
        int     idt;
        long    ldt;
        float   fdt;
        double  ddt;
        String  ss;
        final int CNST1 = 1234;      // final定数

        ch = 'A';                    // 半角文字
        System.out.println("文字=" + ch + " code=" + (int)ch);
        ch = '亜';                   // 全角文字
        System.out.println("文字=" + ch + " code=" + (int)ch);


        bdt = true;
        System.out.println("bdt = " + bdt);

        idt = 1234567890;
        System.out.println("idt = " + idt);

        ldt = 1234567890123456789L;  // Lはlong値を示す
        System.out.println("ldt = " + ldt);

        fdt = 123.456F;              // Fはfloat値を示す
        System.out.println("fdt = " + fdt);

        ddt = 123.456789012345;
        System.out.println("ddt = " + ddt);

        idt  = 022;                  //  8進数の22
        System.out.println("8進22 = " + idt);

        idt = 0x22;                  // 16進数の22
        System.out.println("16進22 = " + idt);

        ddt  = 5.67e4;               // 指数表現の56700
        System.out.println("指数 = " + ddt);

        ch = '¥n';                   // エスケープ文字
        System.out.println("改行文字コード = " + (int)ch);

        ss = "AAAA¥tBBBB";           // 文字列定数(エスケープ文字を含む)
        System.out.println("ss = " + ss);

        System.out.println("CNST1 = " + CNST1);
    }
}


実行結果

文字=A code=65
文字=亜 code=20124
bdt = true
idt = 1234567890
ldt = 1234567890123456789
fdt = 123.456
ddt = 123.456789012345
8進22 =
16進22 =
指数 = 56700.0
改行文字コード = 10
ss = AAAA       BBBB
CNST1 = 1234

考察

・データ型の変換

 ある特定のデータ型の変数の値を、別のデータ型の変数に代入すると、代入先の変数の型に合わせてデータ型が強制的に変換される。このことを「キャスト」という。() の中に、変換したいデータ型を書く。

 キャスト演算子 (キャスト後の型) 対象となるデータ

 データによっては、キャストができない場合もある。文字列から整数型に変換することはできない。
上のプログラムでは、
 char  ch;

 ch = 'A';
 System.out.println("文字=" + ch + " code=" + (int)ch);
 ch = '亜';
 System.out.println("文字=" + ch + " code=" + (int)ch);
 char型で宣言されていたchをキャスト演算子(int)chで、整数型として表示している。

・基本データ型について

 Java言語の型は大きく分けると、基本型と参照型に分類することができる。
 基本型とは、論理値および数値を表す型である。

 基本型の一覧
基本型(整数型)
型名種類ビット数最小値最大値
char整数型
(文字型)
符号なし16ビット
(Unicode)
065535
byte整数型符号付き8ビット-128127
short整数型符号付き16ビット-3276832767
int整数型符号付き32ビット-21474836482147483647
long整数型符号付き64ビット-92233720368547758089223372036854775807

基本型(その他)
型名種類値の範囲
boolean論理型trueまたはfalse
float単精度浮動小数点数型32ビットの浮動小数点数(IEEE 754のサブセット)
double倍精度浮動小数点数型64ビットの浮動小数点数(IEEEE 754のサブセット)
void空を表す型なし

上のプログラムでは、
 boolean  bdt;

 bdt = true;
 System.out.println("bdt = " + bdt);
 booleanは真偽値を表すための型である。真はtrue、偽はfalseというリテラルで表す。bdtはtrueと定義されているので、trueと表示される。

・定数について

 定数は、格納された値が何らかの計算によって変わるということのない、「不変の値」を持つ。つまり、格納された値は常に同じ値を保持している。
 上のプログラムでは、
 int  idt;

 idt = 1234567890;
 System.out.println("idt = " + idt);
 intは整数を表すための型である。idtは1234567890と定義されているので、1234567890と表示される。

 long  ldt;

 ldt = 1234567890123456789L;
 System.out.println("ldt = " + ldt);
 Lを付けて1234567890123456789Lと書けば、long型の定数になる。

 flort  fdt;

 fdt = 123.456F;
 System.out.println("fdt = " + fdt);
 Fを付けて123.456Fと書けば、flort型の定数になる。

 double  ddt;

 ddt = 123.456789012345;
 System.out.println("ddt = " + ddt);
 doubleは小数を表すための型である。

 int  idt;

 idt = 022;
 System.out.println("8進22 = " + idt);
 初めに0を付けると、8進数扱いになる。なので、8進数の22を10進数で表した値が表示される。

 int  idt;

 idt = 0x22;
 System.out.println("16進22 = " + idt);
 初めに0xを付けると、16進数扱いになる。なので、16進数の22を10進数て表した値が表示される。

 double  ddt;

 ddt = 5.67e4;
 System.out.println("指数 = " + ddt);
 eを付けると、指数表現となる。eの後ろに付ける数字が指数になる。

・エスケープ文字について

 以下の表記は、二重引用符でくくられた文字列定数か、一重引用符でくくられた文字定数の中で使うことができる。

エスケープシーケンス
表記説 明
\bバックスペース
\t水平タブ
\n改行、ラインフィード
\f改ページ、フォームフィード
\r復帰、キャリッジリターン
\"二重引用符、ダブルクォート
\'一重引用符、シングルクォート
\\円マーク、バックスラッシュ
\uXXXXXXXXの部分に16進数4桁で値を書くと、
その文字コードを持つ文字として扱われる。
\octaloctalの部分に8進数で1桁〜3桁までの数字を書くと、
その文字コードをもつ文字になる。

上のプログラムでは、
 char  ch;

 ch = '\n';
 System.out.println("改行文字コード" + (int)ch);
 一重引用符(')でくくられているので、エスケープ文字となる。char型で宣言されていたchがキャスト演算子(int)chにより、int型で表示される。
 String ss;

 ss = "AAAA\tBBBB";
 System.out.println("ss = " + ss);
 二重引用符(")でくくられているので、エスケープ文字を含む文字列定数となる。ssの表示は、エスケープ文字のタブが実行された表示となる。

・final定数について

 finalで定義されたものは、「変数」ではなく「定数」になる。また、「初期化」はできるが「代入」はできない。
 final int CNST1 = 1234;

 System.out.println("CNST1 = " + CNST1);
 int型で定義されたfinal定数である。



式と演算子

プログラムソース

public class Test06 {                 // Test06.java
    public static void main(String args[]) {
        System.out.println("算術演算子");
        comp1();
        System.out.println("¥n¥n関係演算子");
        comp2();
        System.out.println("¥n¥n論理演算子");
        comp3();
        System.out.println("¥n¥nインクリメント/デクリメント演算子");
        comp4();
    }

    public static void comp1() {
        int a, b, c;
        double f, g, h;

        a = 100;   System.out.println("a   = " + a);
        b = 30;    System.out.println("b   = " + b);
        c = a + b; System.out.println("a+b = " + c);   // 加算
        c = a - b; System.out.println("a-b = " + c);   // 減算
        c = a * b; System.out.println("a*b = " + c);   // 乗算
        c = a / b; System.out.println("a/b = " + c);   // 整数除算
        c = a % b; System.out.println("a%b = " + c);   // 整数剰余

        f = 90.0;  System.out.println("f   = " + f);
        g = 40.0;  System.out.println("g   = " + g);
        h = f / g; System.out.println("f/g = " + f/g); // 浮動小数点数除算
    }

    public static void comp2() {
        int a;
        for (a=1; a<=5; a++) {
            System.out.println("--------" + a);
            if (a < 2)  System.out.println("2未満");
            if (a >= 4) System.out.println("4以上");
            if (a == 3) System.out.println("3である");
            if (a != 3) System.out.println("3ではない");
        }
    }

    public static void comp3() {
        int a;

        for (a=1; a<=5; a++) {
            System.out.println("--------" + a);
            if (a>=2 && a<=4)
                System.out.println("2以上かつ4以下");
            if (a<2 || a>4)
                System.out.println("2未満または4より大");
            if (!(a==1 || a==3))
                System.out.println("1または3、ではない");
        }
    }

    public static void comp4() {
        int dt[] = {100, 200, 300};    // 配列を確保
        int n;

        // ++演算子を使わないときの記述
        n = 0;
        System.out.println(dt[n]);     // dt[0]を表示
        n = n +1;
        System.out.println(dt[n]);     // dt[1]を表示
        n = n +1;
        System.out.println(dt[n]);     // dt[2]を表示

        // ++演算子を使ったときの記述
        n = 0;
        System.out.println(dt[n++]);   // dt[0]を表示
        System.out.println(dt[n++]);   // dt[1]を表示
        System.out.println(dt[n++]);   // dt[2]を表示

        // --演算子を使う
        n = 5;
        while (--n >= 0) {             // n回繰り返す
            System.out.println("n=" + n);
        }
    }

}

実行結果

算術演算子
a   = 100
b   = 30
a+b = 130
a-b = 70
a*b = 3000
a/b = 3
a%b = 10
f   = 90.0
g   = 40.0
f/g = 2.25


関係演算子
--------1
2未満
3ではない
--------2
3ではない
--------3
3である
--------4
4以上
3ではない
--------5
4以上
3ではない


論理演算子
--------1
2未満または4より大
--------2
2以上かつ4以下
1または3、ではない
--------3
2以上かつ4以下
--------4
2以上かつ4以下
1または3、ではない
--------5
2未満または4より大
1または3、ではない


インクリメント/デクリメント演算子
100
200
300
100
200
300
n=4
n=3
n=2
n=1
n=0

考察

・算術演算子について

 計算の基本は加減乗除である。加減乗除とは、加算、減算、乗算、除算のことである。この4つの計算のことをまとめて四則演算と呼ぶ。

四則演算子
演算子説 明
加算(足し算)
減算(引き算)
乗算(かけ算)
除算(割り算)
剰余(割り算の余り)

上のプログラムでは、
 int a, b, c;
 double f, g, h;

 a = 100;   System.out.println("a   = " + a);
  aにint型で100を代入する。aを表示。
 b = 30;    System.out.println("b   = " + b);
  bにint型で30を代入する。bを表示。
 c = a + b; System.out.println("a+b = " + c);
  aとbを足したものをcに代入する。cを表示。
 c = a - b; System.out.println("a-b = " + c);
  aからbを引いたものをcに代入する。cを表示。
 c = a * b; System.out.println("a*b = " + c);
  aとbをかけたものをcに代入する。cを表示。
 c = a / b; System.out.println("a/b = " + c);
  aをbで割ったものをcに代入する。cを表示。
 c = a % b; System.out.println("a%b = " + c);
  aをbで割って出た余りをcに代入する。cを表示。
 f = 90.0;  System.out.println("f   = " + f);
  fにdouble型で90.0を代入する。fを表示。
 g = 40.0;  System.out.println("g   = " + g);
  gにdouble型で40.0を代入する。gを表示。
 h = f / g; System.out.println("f/g = " + f/g);
  fをgで割ったものをhに代入する。hを表示。

・関係演算子について

 関係演算子(等値演算子を含む)は、2つの数値(char型ならint型に変換される)を比較して、真なら1、偽なら0を値とする。

関係演算子
演算子説 明
より小さい
より大きい
<=等しいか、より小さい
>=等しいか、より大きい
==等しい
!=等しくない

 上のプログラムでは、
 int a;

 for(a=1; a<=5; a++);{
 1を初期値として、1ずつ増やしてaが5以下の間処理を繰り返す。
 if (a < 2) System.out.println("2未満");
  aが2より小さければ、2未満と表示する。
 if (a >= 4) System.out.println("4以上");
  aが4以上ならば、4以上と表示する。
 if (a == 3) System.out.println("3である");
  aが3と等しければ、3であると表示する。
 if (a != 3) System.out.println("3ではない");
  aが3と等しくなければ、3ではないと表示する。

・論理演算子について

 論理演算子は、論理演算(否定、論理積、論理和)を行う為の演算子で、関係演算式と共によく使われる。論理値を数値(int型)で表し、0を偽、0以外を真と見なして演算を行う。

論理演算子
演算子説 明
||または
&&かつ
否定

 上のプログラムでは、
 int a;

 for (a=1; a<=5; a++) {
  1を初期値として、1ずつ増やしてaが5以下の間処理を繰り返す。
 if (a >= && a <= 4)
  System.out.println("2以上かつ4以下")
  aの値か、2以上で4以下なら、2以上かつ4以下と表示する。
 if (a < 2 || a > 4)
  System.out.println("2未満または4より大")
  aの値が、2より小さいか、または4より大きかったら、2未満または4より大と表示する。
 if (!(a == 1 || a == 3))
  System.out.println("1または3、ではない")
  aの値が、1でも3でもなかったら、1または3、ではないと表示する。

・インクリメント・デクリメント演算子について

 変数の値をインクリメント (1 だけ増加) またはデクリメント (1 だけ減少) する。

インクリメント・デクリメント演算子
演算子説 明
variable++インクリメントする前の値
variable--デクリメントする前の値
++variableインクリメントした後の値
--variableデクリメントした後の値

 上のプログラムでは、

◎++演算子を使わないときの記述
 int dt[] = {100, 200, 300};
 int n;
  int型のnとint型の配列dtを宣言する。
 n = 0;
 System.out.println(dt[n]);
  ++(インクリメント)する前の値から始まるので、、最初の値は0になりdt[0]の値が表示される。
 n = n + 1;
 System.out.println(dt[n]);
  n=n+1なので、nは1になりdt[1]の値が表示される。
 n = n +1;
 System.out.println(dt[n]);
  n=n+1なので、nは2になりdt[2]の値が表示される。

◎++演算子を使ったときの記述
 n = 0;
 System.out.println(dt[n++]);
  n=0で、dt[0]を表示する。
 System.out.println(dt[n++]);
  n=0に、n++したのでnは1になり、dt[1]を表示する。
 System.out.println(dt[n++]);
  n=1に、n++したのでnは2になり、dt[2]を表示する。

◎--演算子を使う
 n =5;
 while ( --n >= 0) {
  System.out.println("n= " + n);
 }
  nを5とし、nが0になるまで--nをする。nを表示する。
--(デクリメント)した後の値から始まるので、最初の値は4になる。

感想・反省

  今回のレポートは、プログラムの中身が優しかったので、比較的に楽でした。ので、まとめるのに時間をかけました。時間をかけただけあって以前まで
 のレポートより、少しは見やすくなったのではないかと思います。反省点は、時間に余裕がないことです。プログラミングIでは、時間がたりなくて大変
 だったのを覚えているのに、少しも成長していない。レポート云々ではなく、人として成長しなくては!!

参考文献

 独習Java 第2版           ジョセフ・オニール 著
 Jave入門               河西朝雄 著
 Java言語プログラミングレッスン上   結城浩 著