Report3


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

コメント
プログラム
 
public class Repo3test1 {

  public static void main(String[] args) {
     System.out.println("コメント");//ダブルスラッシュより後ろは無視されま
     す
     /*この行は無視されます*/
     /**これはドキュメンテーション
       コメントです*/
   }
}
    
結果
コメント
考察
「//」の後に書いた文章はコメントとみなされてしまう。
「/*」「*/」や「/**」と「*/」で囲まれた文章もコメントとみなされてしま う。これらは複数行にまたがってコメントを書くことも可能。「/**」「*/ 」はドキュメンテーションコメントで、このコメント文を取り出してマニュアル を作成するツールがある
 
文字列出力
プログラム
public class Repo3test2 {

    public static void main(String[] args) {
        String s = "ABC";
        String S = "abc";
        System.out.print("AAA");
        System.out.print("BBB\nCCC\n");
        System.out.println("DDD\nEEE");
        System.out.println(s);
        System.out.println(s + S);
    }
}
   
結果
AAABBB
CCC
DDD
EEE
ABC
ABCabc
   
考察
文字列はSystem.out.println()やSystem.out.printを使って出力できる。 printlnとprintの違いは文字を出力した後に改行するかしないかである。
("")の中に出力したい文字列を書くが、途中で"\n"を入れると改行する。
また、String型の変数に文字列を代入して出力することも出来る。
"+"演算子を使うことによって文字列同士を連結することも出来る。

変数宣言と数値出力と基本データ型
プログラム
public class Repo3test3 {

    public static void main(String[] args) {
    int a,b,sum1;
    long c,d,sum2;
    float e,f,sum3;
    double g,h,sum4;

    a = 100;
    b = 200;
    sum1 = a + b;
    c = 40000L;
    d = 50000L;
    sum2 = c + d;
    e = 0.8F;
    f = 1.3F;
    sum3 = e + f;
    g = 2.3;
    h = 5.5;
    sum4 = g + h;

    System.out.print("a=");
    System.out.println(a);
    System.out.println("b=" + b);
    System.out.println("a + b =" + sum1);
    System.out.println("a + b =" + (a+b));
    System.out.println("c=" + c);
    System.out.println("d=" + d);
    System.out.println("c + d =" + sum2);
    System.out.println("e=" + e);
    System.out.println("f=" + f);
    System.out.println("e + f =" + sum3);
    System.out.println("g=" + g);
    System.out.println("h=" + h);
    System.out.println("g + h =" + sum4);
   }
}
   
結果
a=100
b=200
a + b =300
a + b =300
c=40000
d=50000
c + d =90000
e=0.8
f=1.3
e + f =2.1
g=2.3
h=5.5
g + h =7.8
    
考察
変数を使用する前には変数宣言をしなくてはならない。変数宣言ですることは 使用する変数の型と変数名を決めることである。
javaでは8種類の基本データ型がある。 char,boolean,byte,short,int,long,float,doubleの8つである。
char型変数はunicodeの一文字を記憶する時によく使われる。
boolean型変数ブール代数型とも言われている。true(真)かfalse(偽)のどちら かが記憶される。
8ビットのbyte型、16ビットのshort型、32ビットのint型、64ビットのlong型 は符号付き整数型です。それぞれ記憶できる値の上限があり、ビット数が増え ていくほど大きな値を記憶できる。long型変数を使う場合は代入する値の後ろ に"L"か"l"を入れる。
 32ビットのfloat型、64ビットのdouble型は符号付き浮動小数点数を記憶する ことが出来る。float型を使う場合は代入する値の後ろに"F"か"f"を入れる。
C言語とはほとんど変わらない。

繰り返し処理
プログラム
public class Repo3test4 {

        public static void main(String[] args) {

                int i, sum = 0;
        
        for (i=1; i<=5; i++){
            System.out.print("i=" + i);
                   sum = sum + i;
                   System.out.println("   sum=" + sum);
        }
    }
}
   
結果
i=1   sum=1
i=2   sum=3
i=3   sum=6
i=4   sum=10
i=5   sum=15
    
考察
for()で繰り返し処理をしている。「i=1」で変数iを初期化している。この時、 変数iを一般にループ制御変数と呼んでいる。 「i<=5」は繰り返しの条件。この条件が真の間ループを繰り返す。この場合は iが5以下の間繰り返す。「i++」はループ制御変数の値を一定量ずつ変化させ る。この場合は、++なのでループ制御変数が1ずつ増加する。

条件処理
プログラム
public class Repo3test5 {

    public static void main(String[] args) {
        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以上です");
        }
     }
}
     
結果
i=1 3未満です
i=2 3未満です
i=3 3以上です
i=4 3以上です
i=5 3以上です
     
考察
for文で変数iの値を次々に増加させていき、if-else文で判断している。ここで 判断している対象は変数iの値が3以上か3未満かである。
if文は()の中の評価結果が真か偽かで動作が変わってくる。真であればif文の後 の文が実行される。偽であればif文の後の文を飛ばして次の文が実行される。
if-else文を使うと、()の中の評価結果が真であればif文の後の文が実行され、 偽であればelse文の後の文が実行される。

データ型の変換とキャスト演算子
プログラム
public class Repo3test6 {

    public static void main(String[] args) {
         char ch;
         boolean bdt;
         int idt;
         String ss;
         final int CNST1 = 1234;

        ch = 'A'; 
        System.out.println("文字 = " + ch + " code = " + (int)ch);
        
        ch = '亜';
        System.out.println("文字 = " + ch + " code = " + (int)ch);
        
        idt = 100;
        System.out.println("code = " + idt + " 文字 = " + (char)idt);
        
        bdt = true;
        System.out.println("bdt = " + bdt);

        bdt = (100 < 1);
        System.out.println("bdt = " + bdt);
 
        idt = 022;
        System.out.println("2進22 = " + idt);
        
        idt = 0x22;
        System.out.println("16進22 = " + idt);
        
        ch = '\n';
        System.out.println("改行記号 = " + (int)ch);
        
        ss = "AAAA\nBBB";
        System.out.println("ss = " + ss);
       
        System.out.println("CNST1 = " + CNST1);
	}
}
    
結果
文字 = A code = 65
文字 = 亜 code = 20124
bdt = true
bdt = false
code = 100 文字 = d
2進22 = 18
16進22 = 34
改行記号 = 10
ss = AAAA
BBB
CNST1 = 1234
    
考察
変数chに文字キャラクタ'A'を入れた時、println文にchを出力させると'A'が出 てくるが、(int)chとするとchに入っている文字のコードが出力される。
javaではunicodeを使用しているため、漢字の使用も出来るようになっている。 ここでは文字キャラクタ'亜'のこーどは20124ということが分かる。また、逆に int型変数に数値を入れ(char)idtを使ってその数値と一緒の文字コードを持つ文 字キャラクタを表示させてみた。
boolean型の変数ではtureかfalse(真か偽)のどちらかを記憶する。最初の boolean型変数では直接値を代入し、出力させている。二番目のboolean型変数で は(100<1)と間違った式を記憶させ、出力するとどうなるかを見てみた。
変数に数値を代入する時、その数値が8進数や16進数でも10進数に直して表示す ることが出来る。
変数に代入する値の中にバックスラッシュコードが含まれている場合、出力した 時にそのバックスラッシュコードが反映される。javaでは変数の中にバックスラッ シュコードを代入することが出来る。

算術演算子
プログラム
public class Repo3test7 {

    public static void main(String[] args) {
        int a, b, c;
        double f, g, h, e, d;

        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);   // 整数剰余
        
        e = 100;   System.out.println("e   = " + e);
        d = 30;    System.out.println("d   = " + d);
        h = e / d; System.out.println("e/d = " + h);
        f = 90.0;  System.out.println("f   = " + f);
        g = 40.0;  System.out.println("g   = " + g);
        h = f / g; System.out.println("f/g = " + h); // 浮動小数点数除算

	}
}
    
結果
a   = 100
b   = 30
a+b = 130
a-b = 70
a*b = 3000
a/b = 3
a%b = 10
e   = 100.0
d   = 30.0
e/d = 3.3333333333333335
f   = 90.0
g   = 40.0
f/g = 2.25
    
結果
これは算術演算子を確認するプログラム。C言語と違っているところは特に なかった。
double型の変数e,dに整数を代入すると、出力される値は小数点がついてdouble 型の値になっていた。逆に、int型の変数に小数点がついたdouble型の値を代 入してコンパイルしようとしたらエラーがで出た。

関係演算子
プログラム
public class Repo3test8 {

    public static void main(String[] args) {
        int a;
        for (a=1; a<=5; a++) {
            System.out.println("--------a = " + 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ではない");
        }
     }
}
     
結果
--------a = 1 とき
2未満
3ではない
--------a = 2 とき
3ではない
--------a = 3 とき
3である
--------a = 4 とき
4以上
3ではない
--------a = 5 とき
4以上
3ではない
    
考察
変数aを次々と増加させていき、if文で条件に合えばその後の文章を出力するプ ログラム
if文の条件に合うかは関係演算子で判断している。下に関係演算子をまとめてみ た
演算子 意味
== 等しい i==j
!= 等しくない i!=j
> より大きい i>j
< より小さい i<j
>= より大きいか等しい i>=j
<= より小さいか等しい i<=j

論理演算子
プログラム
public class Repo3test9 {

    public static void main(String[] args) {
        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、ではない");
           }
      }
}
    
結果
--------1
2未満または4より大
--------2
2以上かつ4以下
1または3、ではない
--------3
2以上かつ4以下
--------4
2以上かつ4以下
1または3、ではない
--------5
2未満または4より大
1または3、ではない
    
考察
変数aの値を次々と変化させてif文で条件に合えばその後の文章を出力するプロ グラム
if文の条件に合うかは論理演算子を使用している。下に論理演算しをまとめてみ た
演算子 動作 説明
& 論理積 AND.2つの項が真のときにだけ結果が真になる論理演算子
| 論理和 OR.2つの項が偽のときにだけ結果が偽になる論理演算子
^ 排他的論理和 Exclusive OR.2つの項が異なるときにだけ結果が真となる論理演算
! 否定 NOT.項の真偽が逆になる論理演算
&& 論理積(ショートカット)
|| 論理和(ショートカット)
== 等しい
!= 等しくない
ショートカットについての説明
&や|だけの論理演算は例として(a&b),(a|b)のa,bの両方の値を調べて結果をだ す。
ショートカットの場合,&&演算子の評価の対象となっている2つの値のうち左の値 から調べられる。左の値が偽ならば両方調べなくても偽と分かるので右の値は 調べない。
||演算子についても同じことが当てはまる。左の値を調べて真なら右の値が真か 偽のどちらでも結果は真になる。

インクリメント/デクリメント演算子
プログラム
public class Repo3test10 {

    public static void main(String[] args) {
        int dt[] = {100, 200, 300, 400};    
        int n;

        n = 0;
        System.out.println(dt[n]);     
        n = n +1;
        System.out.println(dt[n]);     
        n = n +1;
        System.out.println(dt[n]);     
        System.out.println("\n");
 
        n = 0;
        System.out.println(dt[n++]);   
        System.out.println(dt[n++]);   
        System.out.println(dt[n++]);
        System.out.println("\n");   

        n = 0;
        System.out.println(dt[++n]);
        System.out.println(dt[++n]);
        System.out.println(dt[++n]);
        System.out.println("\n");
        
        n = 5;
        while (--n >= 0) {             
            System.out.println("n=" + n);
        }    
        System.out.println("\n");

        n = 5;
        while (n-- >= 0) {
           System.out.println("n=" + n);
        
        }
    }
}
    
結果
100
200
300


100
200
300


200
300
400


n=4
n=3
n=2
n=1
n=0


n=4
n=3
n=2
n=1
n=0
n=-1
   
考察
最初のまとまりと二番目のまとまりが同じ出力結果であることからn=n+1とn++は同 じ意味であると考えられる。
また、二番目のまとまりと三番目のまとまりは、変数の添字nの+演算子のついて いる位置によって出力結果が違う。これは二番目のまとまりの変数の添字が0か ら始まっているのに対して、三番目のまとまりの変数の添字は1から始まってい るからである。n++はnの値を参照してからプラス1をしているが、++nはプラス1 してからnを参照しているからである。
四番目、五番目のまとまりについても同じことが言える。

感想・反省
今回のレポートはC言語で見たことがあるようなものばっかりだった。本当に javaとC言語は似ていると思った課題だった。
「今回は早めに終われるかな?」と思ったが、プログラムの数が多くいつものように2週間もかかってしまった。
課題をこなす早さは結局、本人の努力次第だということも分かった課題でした。

参考
独学Java第二版
ジョセフ・オニール著
浅煎り珈琲Javaアプリケーション入門