プログラミング入門 2006.09.20

情報工学演習Ⅰ
Java入門の入門
104 slides
表現系工学研究室の担当する内容
(ソフトウェア工学と人工知能の基礎)
認知システム論
AIプログラミング
探
索
論
理
ヒューマン・サイバネティクス
ニューラルネット
演習Ⅰ
Java入門の入門
実験Ⅰ
オブジェクト指向
プログラミングⅠ
ニューラルネット
(1)(2)
論
理
実験Ⅱ
機械学習
内容
Javaの文法や扱うデータについて:


C言語との共通点を確認する.
C言語との相違点を学ぶ.
(オブジェクト指向の内容は含まない.)
参考文献
改訂 新Java言語入門,林 晴比古,ソフトバンクパブリッシング(2004)
1 Javaの周辺
・Javaとはどのような言語か
・Javaはどのような環境で動作するのか
・Java仮想マシンとは何か
・Java開発キットとはどのようなものか
Java言語とは
Sun Microsystems社で開発されたプログ
ラミング言語
プラットフォーム独立



CPUやOSが異なっていてもOK.移植が不要
ネットワークに1つあれば,どのプラットフォー
ムからもダウンロードできる
Write Once, Run Anywhere
Java仮想マシン
(JVM: Java Virtual Machine)
仮想的なCPU.その機械語をバイトコードという.
Javaコンパイラは,ソースプログラムをバイトコー
ドにコンパイルする.
各プラットフォーム用のJVMでバイトコードを実行
する.
JVMは,インタプリタでバイトコードを解釈実行し
たり,ネイティブコンパイラで機械語に翻訳して実
行する.
Javaで作成できるプログラム
アプリケーション


コンソール型アプリケーション
ウィンドウ型アプリケーション
アプレット(Applet)

ホームページに埋め込まれて動作する
サーブレット(Servlet)

サーバーの上で動作する
Javaクラスライブラリ
Javaプログラムはクラスという単位で構成される.
利用価値の高いクラス群がJavaクラスライブラリ
として提供されている.
既存のクラスを流用(継承)して,そこに機能を追
加して,新しいクラスにできる.これがJavaプログ
ラミングのスタイル.
パッケージ
関連したクラスがパッケージと呼
ばれる単位でまとめられている.
主要なJavaパッケージ
パッケージ名
java.applet
java.awt
java.io
java.lang
java.math
java.net
java.util
説明
アプレット作成
GUI
入出力
Java言語の基本機能
算術演算
ネットワーク処理
ユーティリティ機能
Java開発キット
JDK (Java Development Kit)






Sun Microsystems社のフリーソフト
バージョン 1.0→1.1→1.2→1.3→1.4→5.0
J2SE = Java2 Standard Edition
J2EE = Java2 Enterprise Edition
J2ME = Java2 Micro Edition
J2SE 5.0 (=Java2 Standard Edition 5.0)
Eclipse

IBM商品がオープンソース化したもの
2 最初のアプリケーション
・Javaプログラムの基本スタイル
・コンパイルと実行の方法
基本プログラム例(1)
ファイル名は Jsmp1.java のように .java を付ける.
大文字と小文字は区別される.
public class Jsmp1{
public static void main(String args[]) {
System.out.println("My first java.");
}
}
基本プログラム例(2)
Jsmp1.java
クラス名とファイル名は同じ
public class Jsmp1{
public static void main(String args[]) {
System.out.println("My first java.");
}
}
クラス
メソッド
プログラムはmainメソッド
からスタートする
基本プログラム例(3)
1つの命令(文)最後に”;”が付く
System.out.println("My first java.");
画面に出力しろという命令
出力する内容(引数という)
プログラムのコンパイル手順
コマンドプロンプトを起動し,カレントディレクトリに
移動する。
cd ........
1. プログラムをコンパイルする。
javac ファイル名 (例: javac Jsmp1.java)
(成功すると クラス名.class というファイルが作られる)
2. プログラムを実行する。
java クラス名 (例: java Jsmp1)
(ここは,ファイル名ではないことに注意!)
3 最初のアプレット
省略
4 最初のウィンドウ型アプリケーション
省略
5 Javaの基礎知識
・コメント
・字下げ
・名前の付け方
・文字列の出力
・変数宣言と数値出力
・繰り返し文と条件文の雰囲気
基本スタイル
public class クラス名{
public static void main(String args[]) {
(いろいろな記述)
}
}
コメントを入れる(1)
/*
ファイル名 Cmnt.java
開発者 ○○ ○○
作成日 2006.10.18
*/
public /* このようにもコメントを入れられます */ class Cmnt{
public static void main(String args[]) { //mainの記述
System.out.println(“My first java.”); //文字出力
}
}
コメントを入れる(2)
用例1 デバッグ作業への利用
/*
a = 10;
b = 20;
c = 30;
*/
字下げで見やすくする
public class Smp1b {
public static void main (String args[]) {
System.out.println("My first java.");
System.out.println("My second java.");
}
}
名前のつけかた
1. 1文字目に使用できる文字:
2.
3.
4.
5.
英字大文字(A~Z),英字小文字(a~z)
下線( _ ),ドル($) $はユーザは処理系用
2文字目以降に使用できる文字:
1文字目で使用できる文字
数字(0~9)
予約語(Javaが文法上使用するキーワード)は
使用不可
大文字と小文字は区別される
全角文字(2バイト文字)はOK.
名前の慣例(1)
1. 変数名とメソッド名には小文字を使う:
int dt;
public void sample1()
2. 名前が複数の語で構成される場合,それぞ
れの語の先頭を大文字にするか,区切りに
アンダーバー( _ )を入れる:
public void getData()
public void get_data()
名前の慣例(2)
3. クラス名は先頭を大文字にする:
public class Greeting
public class TextSort
4. 記号定数はすべて大文字にする。複数の語
で構成されるときには,必要ならアンダー
バー( _ )で区切る:
public static final int SIZE
= 1000;
public static final int MAX_DATA = 2000;
文字列を出力する
public class Jsmp4{
public static void main(String args[]) {
System.out.print("AAAAA");
System.out.print("BBBBB\nCCCCC\n");
System.out.println("DDDDD");
System.out.println("EEEEE\nFFFFF\n\nGGGGG");
}
}
変数と代入
数字,文字等
変数 a
変数への値の代入
a = 3;
数値出力
public class Jsmp5 {
public static void main (String args[]) {
int a, b, sum;
自動的に
文字列に
a = 100;
//変数aに100を代入
変換される
b = 200;
//変数bに200を代入
sum = a + b;
//変数sumにa+b (=300)を代入
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 class Jsmp6 {
public static void main (String args[]) {
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 class JSmp7 {
public static void main (String args[]) {
int i;
for(i=1; i<=5; i++) {
System.out.println("i = " + i);
if (i < 3)
System.out.println(" 3未満です");
else
System.out.println(" 3以上です");
}
}
}
条件判定式
if
if
if
if
if
if
(a
(a
(a
(a
(a
(a
== b)
!= b)
< b)
> b)
<= b)
>= b)
ー
ー
ー
ー
ー
ー
もしaとbが等しいなら
もしaとbが異なるなら
もしaがbより小さいなら
もしaがbより大きいなら
もしaがb以下なら
もしaがb以上なら
よくあるエラー
'{'と'}'の対応が取れていない
'('と')'の対応が取れていない
"(二重引用符号)の対応が取れていない
/* と */ の対応が取れていない
文末の';'を忘れている
大文字と小文字の違いがある
メインクラス名とファイル名が不一致で
ある
6 変数と定数
・基本データ型
・String型
・参照型
・定数
・型変換(キャスト)
8つの基本データ型 (1)
論理
データ型
説明
boolean 1ビット真偽値
文字 char
byte
整数
16ビット
Unicode文字
8ビット符号付
き整数
表現範囲
true(真)またはfalse(偽)
\u0000 ~ \uFFFF
-128 ~ 127
short
16ビット符号付 -32768 ~ 32767
き整数
int
32ビット符号付 -2147483648 ~
き整数
2147483647
8つの基本データ型 (2)
データ
型
long
実数
float
説明
表現範囲
64ビット符号付 -9223372036854775808
き整数
~ 9223372036854775807
32ビット浮動小 単精度の浮動小数点数
数点数
double 64ビット浮動小 倍精度の浮動小数点数
数点数
変数宣言と初期化
変数宣言
int a;
double b,c;
int d = 10;
int e, f = 20, g;
混ざっていても可
変数宣言と
初期化を同時に記述
データの代入
int dt1 = 100;
int dt2, dt3, dt4;
dt2
dt3
dt4
dt1
=
=
=
=
200;
dt2;
dt1 + dt2 + 300;
dt2 = dt3 = 500; //一度に代入
boolean型(1)
「真」か「偽」かという論理値の表現
true
= 真
false = 偽
C言語はint型を用いて
論理値を表現している
boolean型(2)
boolean b; // boolean型の宣言
b = true; // trueを設定
b = false; // falseを設定
if (b == true) // bがtrueなら
if (b == false) // bがfalseなら
if (b)
// (b==true)と同じ
if (!b)
// (b==false)と同じ
b = 0;
// Javaではエラー
char型
文字(文字コード)を保持できる変数
Javaの内部の文字コードは"Unicode"
(1文字16ビット)
char ch1, ch2;
ch1 =‘A’; //半角文字を設定
ch2 =‘亜’; //全角文字を設定
整数型
byte
short
int
long
bdt
sdt
idt
ldt
=
=
=
=
bdt;
sdt;
idt;
ldt;
// 8ビット
//16ビット
//32ビット
//64ビット
127;
32760;
1234567890;
1234567890123456789L;
浮動小数点型
float
double
fdt; //32ビット 単精度実数
ddt; //64ビット 倍精度実数
fdt = 123.456F;
ddt = 123.456789012345;
String型 (文字列)
String型は「基本データ型」ではなく「クラス」
String ss;
String gg = "aaaa";
ss = "bbbb";
ss = ss + "cccc"
ss = "dddd" + "eeee";
参照型(1)
基本データ型以外のデータとして,クラスと
配列がある.
クラスと配列を扱う変数の型を参照型とい
う.
参照とは,アドレスあるいはポインタのこと.
C言語のように,&や*を用いてポインタ
を扱うことはしない.
参照型(2)
配列名 a を宣言し,
int a[ ];
a = new int[10]; int型10個分の領域確保
a
a[0]
あるいは
int a[ ] = new int[10];
a[9]
参照型(3)
String s = "abcde";
s
"abcde"
論理定数
bdt = true; // 論理定数
bdt = false; // 論理定数
数値定数(1)
idt = 022;
// 先頭が"0"だと8進数
idt = 22;
// 10進数の22
idt = 0x12AB; // 先頭が"0x"だと16進数
数値定数(2)
ldt = 123456789012L;
// 末尾がLまたはlだとlong型
fdt = 111.222F;
// 末尾がFまたはfだとfloat型
ddt = 123.45678;
// 小数点表現の浮動小数点数double型
ddt = 5.67e4;
// 指数表現の浮動小数点数double型
5.67×104の意味
文字定数と文字列定数
char ch;
ch = 'A';
ch = '亜';
文字定数
文字定数
String ss;
ss = "abcde"; 文字列定数
主なエスケープ文字
エスケープ文字
\t
\\
\'
\"
\n
\ooo
\uhhhh
意味
タブ
\自身
シングルクォート 「’」
ダブルクォート 「"」
改行
3桁の8進数
4桁の16進数
エスケープ文字の使用例
System.out.println(”String\”ABC\””);
String”ABC”
と表示される
System.out.println(”ABC\nDEF”);
ABC
DEF
と表示される
final定数
if (dt == 1000)
↓
1000が何を意味する
のか判りにくい
final で設定した変数(定数)
は、以後変更できない
final int MAX_DATA = 1000;
……
……
if (dt == MAX_DATA)
型変換(キャスト)
int i ;
double d;
i = 123;
d = i; //表現能力の高い方への代入はOK.dは123.0
d = 789.125;
i = d;
i = (int) d;
//表現能力の低い方への代入はエラー
//こうして型変換すればOK.iは789
7 よく使われる演算子
・算術演算子
・関係演算子
・論理演算子
・代入演算子
・文字列の等価演算と連結演算
おもな演算子の種類
演算子名
算術演算子
内 容
+やーなど四則演算を行う
関係演算子
2つの値の大小関係を判断する
論理演算子
「かつ(AND)」や「または(OR)」な
どの論理演算を行う
計算結果を変数に代入する
代入演算子
算術演算子
Javaの 数学の
演算子 演算子
+
*
/
%
+
×
÷
mod
意味
使用例
結果
加算
12+4
16
減算
12-4
8
乗算
12*4
48
除算
12/4
3
余り
12%4
0
整数と浮動小数点数の混合計算
double ddt;
ddt
ddt
ddt
ddt
=
=
=
=
10 /
10.0
10.0
10 /
4;
/ 4.0;
/ 4;
4.0;
ー
ー
ー
ー
ddtは
ddtは
ddtは
ddtは
2.0
2.5
2.5
2.5
となる
となる
となる
となる
演算の優先順位
a = 10 + 20 * 30;
答えは?
610
• * / % が + - より先に処理される
• ( ) が最優先
演算子には優先順位がある
a
a
a
a
a
a
=
=
=
=
=
=
(10
100
100
100
100
100
+
/
/
/
/
+
20) * 30;
20 / 5;
(20 / 5);
20 * 5;
(20 * 5);
20 / 5;
関係演算子と等価演算子
2つの値の大小関係を,
true(真)
false(偽)
で表す。
例えば
1 < 3 → true
1 >=3 → false
関係演算子と等価演算子一覧
関係演
算子
<
<=
>
>=
==
!=
数学の
演算子
<
≦
>
≧
=
≠
意味
~より小さい
使用 結果
例
1 < 2 true
~以下
1 <= 2 true
~より大きい
1>2
~以上
1 >= 2 false
等しい
1 == 2 false
等しくない
1 != 2
false
true
論理演算子 (A && B;AかつB)
A && B
B
false
true
A
false
false
false
true
false
true
論理演算子 (A || B;AまたはB)
A || B
B
false
true
A
false
false
true
true
true
true
論理演算子 (!A;Aではない)
A
!A
false
true
true
false
代入演算子
a = 1234;
a = a + 10;
ー a は 1234
ー a は 1244
a = b = c = 10;
複合代入 += -= *= /= %=
a += 10;
aに10を
足し込む
a -= 10;
ー a = a + 10
と同じ
ー a = a - 10
と同じ
インクリメント/デクリメント演算子(1)
演算子
++
--
意味
1加算
使用例
++a; または a++;
1減算
--a; または a--;
++a; または a++; は a = a + 1; と同じ.
--a; または a--; は a = a - 1; と同じ.
インクリメント/デクリメント演算子(2)
先加算: a = ++b;
b = b + 1;
a = b;
と同じ
後加算: a = b++;
a = b;
b = b + 1;
と同じ
文字列の等価演算
String s1 = “abcde”, s2 = “abcde”;
この2つの文字列の内容が同じかどうか調べたい.
If( s1 == s2)
とするのは危険である.
アドレスの比較
値(内容)の比較
If( s1.equals(s2) )
とするのが良い.
s1
"abcde"
s2
"abcde"
文字列連結演算子(1)
文字列は +演算子で連結することができる.
String ss;
ss = "aa" + "bb";
ss = "aa" + 10;
ss = 20 + "bb";
ss = 20 + 10;
ー
ー
ー
ー
ssは"aabb"
ssは"aa10"
ssは"20bb"
エラー
文字列結合演算子(2)
String ss;
ss = "" + 10;
ー ssは"10"
ss = "cc" + 10 + 20; ー ssは"cc1020"
ss = "cc" + (10 + 20); ー ssは"cc30"
文字列結合演算子(3)
int a = 100; b = 200;
System.out.println("a=" + a);
--出力は a=100
System.out.println("a+b=" + (a+b));
--出力は a+b=300
System.out.println("a+b=" + a + b);
--出力は a+b=100200
8 制御文を使う
・分岐(if,switch)
・反復(for,while,do-while)
・脱出・継続(break,continue)
分岐(if)の例(イメージ)
条件(お金は十分か?)
YES
真
購入手続き
NO
偽
門前払い
分岐した後,
合流する
if文の書式
if (条件) {
文1
}
else {
文2
}
単文の例
if (b > 10)
b = 20;
else
b = 50;
-
bが10より大なら
-
これを実行
-
さもなければ
-
こちらを実行
複文の例
if (a == 2){
x = 1;
y = 2;
}
else
{
x = 3;
y = 4;
}
-
aが2なら
- さもなければ
elseの省略
if (b > 10)
b = 20;
Elseは
無くても良い
(何もしない)
else ifによる多方向分岐
if
(条件1) {
文1
}
else if (条件2) {
文2
}
:
else if (条件n) {
文n
}
else {
文
}
条件によって
たくさん分岐させる
ときに用いる
else ifによる多方向分岐例
if (a > 1000)
dt = 4;
else if (a > 500)
dt = 3;
else if (a > 100)
dt = 2;
else
dt = 1;
{ } 中括弧は
無くても良い
(文が1つの場合)
else ifによる多方向分岐例
(さらにコンパクトな書き方)
if (a > 1000)
else if (a > 500)
else if (a > 100)
else
dt
dt
dt
dt
=
=
=
=
4;
3;
2;
1;
switch文の一般形式(1)
switch(式) {
case 定数式1:
文1
break;
case 定数式2:
文2
break;
……
default:
文
}
式
case
定数式1
文1
case
定数式2
文2
default
文
switch文の一般形式(2)
整数でなくてはいけない!
switch(式) {
case 定数式1:
セミコロンではな
いので要注意
文1
break;
ここでswitch文から抜け出る
case 定数式2:
文2
break;
これがないと次の文まで実行
されてしまう
……
default:
文
どれにもあてはまらな
かった場合に実行され
}
る
いくつ文を並べてもよい
複数の文だからといって { } を用いる必要はない
case 3:
a = 100;
sum = sum + b;
myfunc();
break;
switch(式)の式には
整数か文字を結果とする式を書く
int a;
double f;
char c = 'Y';
switch ( a+10 )
OK
switch ( f )
エラー
switch ( c )
OK
繰り返し処理のイメージ
条件を満たしているか?
NO
仕事
YES
仕事
条件を満たしているか?
YES
NO
for文の書式
for (初期化; 継続条件; 再設定) {
文
}
セミコロン ;
が無いことに注
意
用例
for (i=1; i<=10; i++) {
文
}
for文の決まり文句
for (i= 1 ; i <= 10; i++)
から
まで
for (初期化; 継続条件; 再設定) {
文
}
初期化
継続条件
真
文
再設定
偽
for文内での変数宣言(1)
for (int i=1; i<=10; i++) {
文
for文の中で宣言した変数は、
for文の中だけでしか使えな
}
い
System.out.printn(i);
エラーが出る
for文内での変数宣言(2)
for (int i=1,a=2; i<=10; i++, a--){
文
複数の変数を
複数の文を書く
}
宣言できる
こともできる
for文による無限ループ
for (;;) {
文……
}
※特殊な用法
- ループが無限に繰り返される
while文の書式
while (継続条件) {
文
forよりずっと単純
}
終了条件ではないことに注意
用例
while (i<=10) {
文
}
while (継続条件) {
文
}
継続条件
真
文
偽
do-while文の書式
do {
文
} while (継続条件);
用例
最初に一度は必ず文が実行される点が異なる
do {
文
} while (i<=10);
do {
文
} while (継続条件);
文
真
継続条件
偽
break文で脱出する
break;
ラベルなしbreak文はswitch文または
for,while,doなどのループから脱出するため
に用いる
ループがネスト構造になっているときはbreak
文の存在するループを一つだけ抜ける
swtich文以外で用いるbreak文は,if文と併
用する
break文のイメージ
繰り返し文(forなど){
命令;
命令;
命令;
命令;
命令;
break;
命令;
この2つの命令は飛ばして
命令;
繰り返しを止める
}
・・・
・・・
ネスト構造=入れ子構造
for (…){
……
if(…) {
for (…) {
……
break;
……
}
}
}
continue文で継続する
continue;
continueはfor, while, do-whileの中だけで使
用できる
ループ処理をその回だけスキップし,以降の処
理は継続(continue)する
continue記述位置から,ループ終端までに書
かれた記述をスキップする
ループがネスト構造になっているときcontinue
文の存在するループ内で機能する
continueのイメージ
繰り返し文(forなど){
命令;
命令;
命令;
命令;
命令;
continue;
命令;
この2つの命令は飛ばして
命令;
次の処理に移る
}
Java入門クリアまでのみちすじ(1)
9
10
11
12
13
14
15
配列を用いる
コンソール入出力
メソッドの作りかた
クラスの基本
クラスの継承
インタフェースを実装する
パッケージにまとめる
情報工学実験Ⅰ
オブジェクト指向プログラミング(1)
Javaクリアまでのみちすじ(2)
16
17
18
19
20
21
22
スレッドを使う
例外処理をする
ファイル入出力
標準のメソッドを使う
アプレットの作成
ウィンドウ部品を用いる
ウィンドウ型アプリケーションの作成
情報工学実験Ⅰ
オブジェクト指向プログラミング(2)