プログラミング2
Report#3

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

ソースプログラム
実行結果
考察
感想
参考文献・HP

ソースプログラム

/*
  Program:Report3.java
  Author :HIDENORI,Tamayose
  Date   :2004,11,15(Mon)
 */
 
 /**
     これは、
	5行にわたる
	長いコメント。
*/

public  class Report3 {                               // Report3.java
    public static void main(String args[]) {          // mainの記述
        System.out.println("変数宣言と数値出力");
        num();                                        //numスレッドの呼び出し
        System.out.println("\n\n繰り返し処理");
        rep();
        System.out.println("\n\nデータ型&エスケープ文字");
        data();
        System.out.println("\n\n演算式");
        enn();
        System.out.println("\n\n条件処理");
        jou();
        System.out.println("\n\n関係演算子");
        rel();
        System.out.println("\n\n一次元配列");
        poi();
    }

    public static void num() {
        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);    // a+bの結果を出力
        System.out.println("a+b=" + (a+b));  // 直接計算させる
    }

    public static void rep() {
        int i, sum;
        
        for (i=1; i<=5; i++)                   //iは1から5まで
            System.out.println("i=" + i);

        sum = 0;
        for (i=1; i<=5; i++) {                //iが1から5になるまで下記の処理
            sum = sum + i;
            System.out.println("sum=" + sum);
        }
    }

    public static void data() {
    	    char    ch;
    	    byte    bn;
    	    short   sn;
        int     n1, n2, n3, in;
        long    ln;
        float   fn;
        double  dn;
        String  s1,s2;
        final int fin = 1234;
        
        ch = 'A';                    // 半角大文字アルファベッド
        System.out.println("文字=" + ch + " code=" + (int)ch);
        ch = 'a';                    // 半角文字小文字アルファベッド
        System.out.println("文字=" + ch + " code=" + (int)ch);
        ch = '秀';                   // 全角漢字
        System.out.println("文字=" + ch + " code=" + (int)ch);
        
        n1=100;
        n2=100;
        n3=200;
        boolean  ba = (n1==n2);
        boolean  ca = (n1==n3);
        System.out.println("\n真偽値出力");
        System.out.println("n1とn2は等しいですか?"+ ba);
        System.out.println("n1とn3は等しいですか?"+ ca);
        
        System.out.println("\nビット符号付き整数");
        bn=127;
        System.out.println("byte型最大表現値は"+ (byte)bn);
        sn=32767;
        System.out.println("short型最大表現値は"+ (short)sn);
        in=2147483647;
        System.out.println("int型最大表現値は"+ (int)in);
        ln=9223372036854775807L;
        System.out.println("long型最大表現値は"+ (long)ln);
        
        System.out.println("\nビット符号付き浮動小数点数");
        fn = 123.456F;
        System.out.println("fn = " + fn);
        dn = 123.456789012345;
        System.out.println("dn = " + dn);
        
        System.out.println("\n文字列表示");
        s1 = "abcdEFghI";
        System.out.println("s1 = " + s1);
        
        System.out.println("\n進数表示");
        System.out.println("10進数の10は" + 10 + "です。");
        System.out.println("八進数10は" + 010 + "です");
        System.out.println("16進数の10は" + 0x10 + "です");
        System.out.println("16進数のFは" + 0xF + "です");

        System.out.println("\nエスケープ文字");
        ch = '\n';                   
        System.out.println("改行文字コード = " + (int)ch);
        s2 = "AAAA\tBBBB";           
        System.out.println("s2 = " + s2);
        
        System.out.println("\nfinal定数");
        System.out.println("final定数fin="+ fin);
        
    }
    
    public static void enn() {
    	    byte bn;
    	    int    a, b, c, d, e, in;
    	    float  fn;
        double f, g, h, i, dn;
        char ch;

         a = 100;
         b = 30;
         System.out.println("a = " + a);
         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); // 浮動小数点数除算
         
         d = 50;
         e = 70;
         c = a*b+88/d-5*e;
         System.out.println("(a×b)+(88÷d)−(500×e) = " + c);
         
         ch = 'A';
         in = 127;
         fn = 10.25f;
         System.out.println("型変換1:(ch×in÷fn) =" + ch*in/fn);
         bn = (byte)in;
         System.out.println("型変換2:bn =" + bn);
         in = ch;
         System.out.println("型変換3:ch =" + in);
     }
    	   
    public static void jou() {
        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以上です");
        }
    }
    
    public static void rel() {
        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ではない");
        }
        System.out.println("\n");
        
            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 poi() {
 	    int ia[] = new int[4];      //配列の宣言
 	    int ib[] = new int[4];
 	    int n;
 	
 	    ia[0] = 33;                 //ia要素の初期化
 	    ia[1] = 71;
 	    ia[2] = -16;
 	    ia[3] = 45;
 	    
 	    ib = ia;                   //ibにiaと同じ配列を割り当て
 	    
 	    System.out.println("配列ibの長さは" + ib.length);   //ibの要素数表示
 	    
 	    //++演算子を使わない場合の記述
 	    System.out.println("ibの要素");
 	    n = 0;
 	    System.out.println("ib[0] = " + ib[0]);        //ibの要素内容表示
 	    System.out.println("ib[1] = " + ib[1]);
	    System.out.println("ib[2] = " + ib[2]);
 	    System.out.println("ib[3] = " + ib[3]);
 	    
 	    ib[1] = 100;
 	    
 	    //++演算子を使った場合の記述
 	    System.out.println("iaの要素");
 	    n = 0;
 	    System.out.println("ia[0] = " + ia[n++]);        //iaの要素内容表示
 	    System.out.println("ia[1] = " + ia[n++]);    
 	    System.out.println("ia[2] = " + ia[n++]);
 	    System.out.println("ia[3] = " + ia[n++]);
 	    
 	    System.out.println("ibの要素");
 	    n = 0;
	    System.out.println("ib[0] = " + ib[n++]);        //ibの要素内容表示
	    System.out.println("ib[1] = " + ib[n++]);
	    System.out.println("ib[2] = " + ib[n++]);
	    System.out.println("ib[3] = " + ib[n++]);
	   
 	    //--演算子を使った場合の記述
 	    n = 6;
 	    while (--n >= 0) {
 	    	System.out.println("n = " + n);
 	    }
 	    
    }
}

・実行結果

変数宣言と数値出力
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


データ型&エスケープ文字
文字=A code=65
文字=a code=97
文字=秀 code=31168

真偽値出力
n1とn2は等しいですか?true
n1とn3は等しいですか?false

ビット符号付き整数
byte型最大表現値は127
short型最大表現値は32767
int型最大表現値は2147483647
long型最大表現値は9223372036854775807

ビット符号付き浮動小数点数
fn = 123.456
dn = 123.456789012345

文字列表示
s1 = abcdEFghI

進数表示
10進数の10は10です。
八進数10は8です
16進数の10は16です
16進数のFは15です

エスケープ文字
改行文字コード = 10
s2 = AAAA	BBBB

final定数
final定数fin=1234


演算式
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
(a×b)+(88÷d)−(500×e) = 2651
型変換1:(ch×in÷fn) =805.36584
型変換2:bn =127
型変換3:ch =65


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


関係演算子
--------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、ではない


一次元配列
配列ibの長さは4
ibの要素
ib[0] = 33
ib[1] = 71
ib[2] = -16
ib[3] = 45
iaの要素
ia[0] = 33
ia[1] = 100
ia[2] = -16
ia[3] = 45
ibの要素
ib[0] = 33
ib[1] = 100
ib[2] = -16
ib[3] = 45
n = 5
n = 4
n = 3
n = 2
n = 1
n = 0

・考察

(1)予約語と識別子

 データ型、if文など元々Javaにある変数、関数(識別子)を「予約語」。自分で作る変数や関数などの名前は「識別子」と呼びます。 識別子の名前は基本的にはプログラマーが 自由に命名できます。ただし次のような制約があります。
	・半角英数字および半角アンダーバー(_)のみ使用でき、最初の1文字は英字である
	・大文字、小文字は区別される
	・予約語は使用できない

(2)コメント(P.28〜)

・「/*」と「*/」で囲まれたコメントは複数行にわたり書くことができます。(複数行コメント)
・「/**」と「*/」で囲まれたコメントは 、javadocというドキュメンテーションツールの為のものです。
  このソースをjavadocに読み込ませると、API文書形式のHTML文書が自動的に出力されます。(ドキュメンテーションコメント)
・「//」のコメントはその行以降の文字が末尾までコメントと解釈されます。(単一行コメント)

(3)変数と定数

基本データ型
型名ビット数(バイト数)表現できる範囲分類
byte8 (1)(-27 〜 27-1) = (-128 〜 127) 符号付整数型
short16 (2)(-215 〜 215-1)
int32 (4)(-231 〜 231-1)
long64 (8)(-263 〜 263-1)
char16 (2)Unicode の一文字 文字(整数型)
float32 (4)IEEE 754 規格の 32 ビット浮動小数点数 浮動小数点数型
double64 (8)IEEE 754 規格の 64 ビット浮動小数点数
boolean - True or False 論理値型
1,符号付整数型(P.13〜)
整数型にはいくつか種類があるが、保持できる数字の範囲が異なる。
long 型の整数の場合、代入数字に L を付けたほうがよい。
数字は実は int 型と同じ 32 ビットしか保持できませんので、 long 型に代入するときには、明示的に示す必要がある。

long dbla=12345678901L;

2,文字型
文字型charはUNICODE(UTF-16)の一文字をあらわす。
UNICODE とは文字セットの一つで、文字セットとは、二進数のコンピュータで文字を識別する為の番号と文字の組のことであり、文字をビットパターンに符号化したものの組のこと。
JavaではUnicodeという文字セットに符号化する文字符号化方法を標準で利用している。

char型のリテラルはシングル・クオティション(')で括ります。代入する文字は、普通にキーボードで文字を入力するか、Unicodeのマップ番号を直に記述します。

char lett='あ';
char c2='\u0041';
文字型データは、符号なしの整数型として扱われます。

3,浮動小数点数型
浮動小数の場合はdouble型と解釈されるので、float型変数に小数を代入する際にはFを付けて明示する。

float f1=3.1415F;

4,論理値型
boolean型の変数には、trueかfalse以外の値は入りません。
例えば、式abは、aがbよりも小さいならばtrueが返り、そうでなければfalseが返ります。この結果を代入できる変数の型は、boolean型になります。

boolean logo = a < b;

5,連結演算子(P.18〜)
Stringクラスは文字列を扱うクラスです。
Stringクラスの文字列は「+」演算子を使って結合することができますが、Stringクラス文字列は定数として 扱われるため、
文字列の長さが変わるような結合などを頻繁に行うと処理時間が要したりします。

String s1 = "abcdEFghI";

6,final定数(P.190〜)
final定数とは、継承できないクラス(サブクラスを作れないクラス)
つまり一度定義したら変動しないということ!

(4)演算子

  1. 算術演算子(P.21〜)
  2. 加算+加法演算子
    減算-
    乗算*乗法演算子
    除算/
    剰余%
    加算代入+=加法演算子の代入
    減算代入-=
    乗算代入*=乗法演算子の代入
    除算代入/=
    剰余代入%=
    算術演算子とは、「+」「-」「*」「/」「%」です。それぞれ、加算、減算、乗算、 除算、余りを求めるです。整数同士のわり算の場合、結果も整数になります。この場合、 小数点以下は切り捨てになります。また小数での計算で余りを求めることはできません。 これらの計算の順序は、数学の場合と同じです。また、負数を含む「余り(%)」を計算する場合は、余りも負数になります。

  3. 比較演算子(P.85〜)
  4. 小なり<
    大なり>
    小なりイコール<=
    大なりイコール>=
    等値か「==」、非等値か「=!」、大小関係「>」「>=」「<=」「<」を調べます。

  5. 論理演算子(P.100〜)
  6. 論理積(かつ) AND&
    論理和(又は) OR|
    排他的論理和 XOR^
    否定!(条件)
    論理積(ショートカット)&&
    論理和(ショートカット)||
    等しい==
    等しくない!=
    成り立つ場合は「真」すなわちtrueが、成り立たない場合は「偽」すなわちfalseとなります。 CやC++では、真は1、偽は0となりましたが、Javaではtrueかfalseです。 すなわち、この比較結果は boolean型にしか代入できません。明示的なキャストをしても、int型など他の型には代入できません。

  7. インクリメント/デクリメント演算(P.21,94〜)
  8. 式中での評価、更新順序
    インクリメントy = y + 1;y++; y を評価してから式を演算し、 y + 1 に更新
    ++y;y + 1 に更新してから式の評価、演算
    デクリメント y = y - 1;y--;評価してから更新
    --y;更新してから評価

(5)制御構造

  1. 条件分岐
  2. いわゆるif文など。順次制御の流れを分岐する。具体的には、或る条件式を与えて、その命題が真であ る場合と、偽である場合とで、実行する内容を変えること。
  3. 繰り返し分岐
  4. while文、for文など。プログラムの一部分を繰り返す。ループとも呼ばれ、通常はある条件に合致する 間は繰り返し続け、条件から外れたら、次の部分に進む。

(6)型変換

プログラム
         ch = 'A';
         in = 127;
         fn = 10.25f;
         System.out.println("型変換1:(ch×in÷fn) =" + ch*in/fn);
         bn = (byte)in;
         System.out.println("型変換2:bn =" + bn);
         in = ch;
         System.out.println("型変換3:ch =" + in);
実行結果
型変換1:(ch×in÷fn) =805.36584
型変換2:bn =127
型変換3:ch =65
型変換1では違う型どうしのかけ算で演算をした。
Javaでは、型の違いを解決する方法を定めた厳密な法則がよういされておりこれを整数拡張と呼ぶ
型変換2ではbyte型はint型より小さいのにbyte型にint型を収納した。これを縮小変換といい。
コードとして(byte)int変数である。
型変換3ではchar型をint型に収納してみました。

・感想

今回はCと同じようなものだったので簡単だと思いましたがプログラム自体がかなりながくなってしまったし、それに加えて考察も長くなって しまいました。でも長く時間をかけたのでかなり力になったと思います。次回も油断せずがんばります。

参考文献・HP

・独習Java第2版 『ジョゼフ・オニール著』
・浅煎り珈琲-Javaアプリケーション入門
・Java入門