「キーワード」はJavaコンパイラに対して,データ型や命令文の意味を持ち,ユーザはこれを識別子としては使えません.Javaのキーワードには以下のものがあります.覚える必要はありません.
abstract | boolean | break | byte | case |
cast | catch | char | class | compl |
const | continue | default | do | double |
else | extends | false | final | finally |
float | for | future | generic | goto |
if | implements | import | inner | instanceof |
int | interface | long | native | new |
null | operator | outer | package | private |
protected | public | rest | return | short |
static | super | switch | sychronized | this |
throw | throws | transient | true | try |
var | void | volatile | while |
「識別子」はユーザが「クラス」「変数(メンバ変数)」「メソッド(メンバ関数)」につける名前です.名前には「文字」「数字」「_」「$」が使えますが,キーワードと同じ名前は使えません.また,名前の先頭文字には「数字」,「_」は使えません. 識別子に付ける名前は慣習的に次のようになっています.
識別子の型 | 慣習 | 命名例 | ||||
クラス名 |
|
|
||||
メンバ関数名 |
|
|
||||
メンバ変数名 | メンバ関数名と同じ. |
|
||||
定数 |
|
|
Javaでは変数を入れる箱の型を決める必要があります.箱の型を決める前に箱の名前,つまり変数名を決めなければなりません.変数名は中身にあった名前を付けるのが良いとされています.例えば,テストの回数を表す変数ならば,countやtestCountやtestTimesなどが良い名前です.
ここでは,変数testTimesがテストの回数を表すとしましょう.この場合,テストの回数は1,2,3…という整数なので,整数をしまっておく箱は整数型であると宣言します.例えば,
int testTimes;
|
float test_Average;
|
型 | 基本型 | ||||||||||||||
|
このあと,例題を交えながら基本データ型について細かく見ていきます.
論理型はfalseまたはtrueの2値しかとることができないときに用います.
class TrueOrFalse |
{ |
public static void main(String[] args) |
{ |
bool flag = false; |
cout << "flag = " << flag << endl; |
flag = true; |
cout << "flag =" << flag << endl; |
} |
} |
解答 Javaではfalse, trueは予約語で,falseは0,trueは1がプリントされます.
実行結果
文字型は文字'A'や桁数'8'などをあらわすときに用います.例えば,Aという文字を文字型cに代入するときには,
char c = 'A'; |
と書きます.文字Aを変数ではなく文字型として使用するときは,アポストロフィー( ' )が必要です.アポストロフィーなしでは変数と見なされ,エラーとなります.そこで,変数と区別するためにすでに学んだリテラルを用います.ここで, (int)c; とすると, (int)cは文字AのASCIIコードである65を表します.これはキャスト(cast)とよばれ,Javaでは変換後の型をカッコで囲み変換したい変数の前に書きます.
class Cast
{
public static void main(String[] args)
{
char c = 'A';
System.out.println("c = "+ c);
System.out.println("c = "+ c);
c = 't';
System.out.println("c = "+ c);
c = '\t';
System.out.println("c = "+ c);
}
解答 文字'A'を表示しようとすると,整数65ではなく文字"A"が表示されます.
実行結果
文字YのASCIIコードを出力するプログラムを作成せよ. |
Javaには4個の整数型が用意されています.
class Arithmetic
{
public static void main(String[] args)
{
int m = 65;
int n = 20;
System.out.println("m+n = " + m + n);
System.out.println("m+n = " + (m + n));
System.out.println("m-n = " + (m - n));
System.out.println("m*n = " + (m * n));
System.out.println("m/n = " + (m / n));
System.out.println("m%n = " + (m % n));
}
}
解答 System.out.println("m+n =" + m + n);では'+'が左から順に処理されるので,最初の+mで整数65が6と5の並びとして処理され,その後,20が2と0の並びとして結合されるので,6520となります.残りの問題は,カッコ内を先に処理するため,演算子として処理されます.他に注意しなければならないのはm/nは商を表し,m%nはあまりを表すことでしょう.
実行結果
整数1234の末尾を消して,123を取り出すプログラムを作成しなさい. |
増加と減少演算子(Increment and Decrement Operators)
++と演算子は演算を行います.数の前におくか後ろにおくかで意味が異なることに注意しましょう.
class FrontAndBackIncrement
{
& nbsp; public static void main(String[] args)
& nbsp; {
int m,n;
m = 44;
n = ++m;
System.out.println("m = " + m + ", n = " + n );
m = 44;
n = m++;
System.out.println("m = " + m + ", n = " + n);
}
解答 n = ++mは先にmの値を1増やし,それをnに代入するので前増加といいます.またn = m++はmの値を先にnに代入し,その後にmの値を1増やすので後増加といいます. ++mもm++も,ともにm = m+1のことであるが,m = m+1 とはほとんど書かないので,++と の使い方に慣れておきましょう.
実行結果
int m=44のとき,m/++mの値はいくつになるか考え,プログラムを組んで確認しなさい. |
実数を表すのに用いられる型です.
例えば10進数13.75が与えられたとします.これをコンピュータはどう扱うか見てみよう.まず,10進数13.75は2進数に変換されます.
13.75 = (8+4+1) + (1/2 + 1/4) = 1101.11
次に,少数点をいちばん左まで移動します.つまり4ビットの移動を行います.ので,
13.75 = +0.1101112×24
書き直すと
13.75 = 01101110100002
このとき,最初の0は符号部が正であることを表し,次の6桁は少数部(仮数部)を表し,次の6桁は指数部を表します.指数の最初の数字は符号を表します.一般に32ビットの浮動少数点型では,最初の1ビットが符号部,次の23ビットが少数部,残りの8ビットが指数部を表しています.ちなみに64ビットの double型では,最初の1ビットが符号部で,少数部には52ビットが割り当てられ,11ビットが指数部に割り当てられます.
浮動小数点型の算術計算は,整数型と異なり+,-,*,/の4種類で,普通の少数の計算と同じです.
class FloatOperation
{
public static void main(String[] args)
{
double x = 125.5;
double y = 20.5;
System.out.println("x = " + x + "and y = " + y );
System.out.println("x+y =" + (x+y));
System.out.println("x-y =" + (x-y));
System.out.println("x*y =" + (x*y));
System.out.println("x/y =" + (x/y));
}
}
実行結果
浮動小数点算術はすべてdoubleで行われるので,double型の代わりにfloatを使うときは,保管場所とアクセスタイムを気にするくらい多くの実数を使うときだけです.
ここからは,基本形ではないのでJavaがはじめてのプログラミング言語の人は,さっと読んでおくだけでよいでしょう.6章から9章で詳しく取り扱います.
配列はオブジェクトです.つまり,配列はnew演算子を用いて新たに作成しないと使うことができません.配列の宣言は
型名[ ] 配列名
|
例えば,int[] argsと書くとargsという配列名は配列型であることを意味します.この配列に5個の整数型の要素を持たせるには,
配列を初期化する方法は2通りあります.1つは,次の例題で示します.
解答
int prime[ ] = {2,3,5,7,11,13,17}
|
解答
class GetIntFromArray
{
public static void main(String[] args)
{
int[] prime = {2,3,5,7,11,13};
int k = prime[4];
System.out.println("prime[4] = " + k);
}
}
と書けばよいでしょう.配列は0から始まるのでprime[4]が5番目の11となります.
実行結果
{0,1,1,2,3,5,8,13,21,34}を要素とする配列aを定義し,第3番目と4番目の要素の和を求めるプログラムを作成しなさい. |
配列は同じ型の要素をまとめて扱うときに便利です.しかし,文字を配列として扱うよりも,文字を扱う型を用意したほうが便利さが増します.そこで,JavaにはString型とよばれる文字列を扱う型があります.String型は次のようにして用いることができます.
class StringType
{
public static void main(String[] args)
{
String ss = "Hisashi";
ss == ss + " Yokota";
System.out.println(ss);;
}
}
実行結果
コンピュータのレジスタが有限桁数で演算をおこなうため,レジスタに入りきらない数値があると無視されたりして,演算結果と真の値に違いが出る.このような違いを誤差(Error)といいます.
ほとんどのマシンでは,long int 型は4バイトつまり,32ビットの領域が与えれています.しかし,これを超えるような計算をやらせると,間違った結果を表示します.これをオーバーフロー(overflow)といいます.
データ型で許されている最小値より小さい絶対値を持つ値が代入され,零になることをアンダーフロー(underflow)といいます.
例えば,有理数1/3をコンピュータは0.333333としてメモリにしまう.このとき生まれる誤差をラウンドオフ エラーまたはまるめ誤差(round-off error)といいます.
class Error
{
public static void main(String[] args)
{
double x = 1000/3.0;
double y = x - 333.0;
double z = 3*y -1.0;
if (z == 0) System.out.println("z = 0");
else System.out.println("z != 0");
}
}
解答 このプログラムを実行すると,z != 0が表示されます.紙の上での計算ではz=0のはずがコンピュータではz!=0になります.つまり,まるめ誤差のため,は0とはなりません.つまり,プログラムで値が零なのかテストするには,z == 0ではなく, 10E-20などでテストしましょう.したがって,1点でのテストは控えるようにしましょう.条件文については次の章で説明します.
実行結果
次のプログラムを実行し,まるめ誤差がどこに潜んでいるのか見つけなさい. |
class RoundError
{
public static void main(String[] args)
{
double x = 1/9.0;
double y = 1/11.0;
double z = x - y;
double w = 99*z;
System.out,println("w = " + w);
if(w == 2) System.out.println("w = 2");
else System.out.println("w != 2");
}
}
ほぼ等しい数値どうしの引き算,絶対値がほぼ等しく符号が異なる2数の加算などを行った場合,有効桁数が急激に減少することがあります.このような現象をけた落ち(cancelling in digits)といいます.
大きな値と小さな値の加減算を行った場合に,小さい値のけたを大きな値のけたにそろえることによって,仮数部に入りきらない小さい値の情報の一部が落ちてしまうことがあります.このような現象を情報落ちといいます.
スコープ(scope) 宣言を行います.ことにより識別子は使えるようになります.このとき,識別子はプログラムテキストの特定部分でしか使えません.例えば,関数内で宣言された識別子の場合は,スコープは,宣言の位置から宣言が行われたブロックの末尾までです.ここで,ブロック(block)とは,{ }で区切られた部分です.
1. countが100を超えたら,"多すぎます" と表示する文を1行で書きなさい.
2. 次の式の値を求めなさい.ただし,mの値は25,nの値は7とします.
a. m - 8 - n
b. m = n = 3
c. m%n
d. m%n++
e. m%++n
f. ++m - n$--$
3. nから1を引くというコードを4つの方法で表しなさい.
4. どこが間違っているか.
a. if (x y) min = x
else min = y;
1. 次のプログラムの実行結果がどうなるか考えなさい.
class CharType
{
public static void main(String[] args)
{
char c = 'A';
int i;
int j = 0x41;
System.out.println("nc=" + c);
i = (int)c;
System.out.println("nc=" + i);
System.out.println("nj=" + j);
i= 66;
System.out.println("ni=" + i);
c=(char)i;
System.out.println("nc=" + c );
}
}
2. 10個の大文字の母音と小文字の母音を表示するプログラムを例題2.2をまねて作成しなさい.