プログラミング言語 3 第 08 回 (2007 年 11 月 19 日 ) 1 今日の配布物 片面の用紙 1 枚 今日の課題が書かれています 本日の出欠を兼ねています 2/50 1
今日やること http://www.tnlab.ice.uec.ac.jp/~s-okubo/class/java06/ にアクセスすると 教材があります 2007 年 11 月 19 日分と書いてある部分が 本日の教材です 本日の内容 前回の課題の解答 Java における文字列 3/50 先週の誤植 4/50 2
誤植誤植 : インターフェースの説明全般 誤 : 文字定数 正 : 記号定数 5/50 インターフェースの書き方 書式 : interface interface 名 { 記号定数の宣言 アブストラクトメソッド interface の中では 記号定数の宣言とアブストラクトメソッドしか書くことができません 6/50 3
インターフェースの書き方その 2 書式 : interface interface 名 { 記号定数の宣言 アブストラクトメソッド 記号定数の宣言は public static final 型名記号定数名 = 初期値 ; として書きますが インターフェース内では 型名記号定数名 = 初期値 ; と省略して書くことができます 7/50 前回の課題の解答 8/50 4
前回の課題 その 1: 次のような仕様を満たすプログラム Sample07d.java を書きなさい 指定されていない部分は自由に書いて良い インターフェース InterTest07a がある アブストラクトメソッド test07a_method がある このメソッドは double 型の引数を 1 つ貰い double 型の戻り値を 1 つ返す 記号定数 PI2 が宣言されている PI2 の値は 2*Math.PI である クラス Test07a がある このクラスはインターフェース InterTest07a を実装したものである メソッド test07a_method は doulbe 型の引数を 1 つ貰い double 型の戻り値を 1 つ返す 具体的には 貰った double 型の値を PI2 倍した double 型の値を返す クラス main の中では Test07a をクラスとするインスタンス dt07 を生成しなさい System.out.println(dt07.test07a_method(100)); を実行しなさい 9/50 プログラム interface InterTest07a{ double PI2=2*Math.PI; double test07a_method(double data); class Test07a implements InterTest07a{ public double test07a_method(double data){ return PI2*data; public class Sample07e{ public static void void main([] args){ Test07a dt07 dt07 = new new Test07a(); System.out.println(dt07.test07a_method(100)); 10/50 5
インターフェイス Test07aがある プログラム インターフェース InterTest07a がある アブストラクトメソッド test07a_method がある double 型の引数を 1 つ貰い double 型の戻り値を 1 つ返す 記号定数 PI2 が宣言されている PI2 の値は 2*Math.PI である interface InterTest07a{ double PI2=2*Math.PI; double test07a_method(double data); アブストラクトメソッド class Test07a implements InterTest07a{ double 型の引数を public double double test07a_method(double 型の戻り値 data){ test07a_method 1つ貰う return を返す PI2*data; がある インターフェイス内は アブストラクトメソッドと記号定数のみを public class Sample07e{ 宣言できることを思い出しましょう public static void void main([] args){ Test07a dt07 dt07 = new new Test07a(); インターフェイス内では System.out.println(dt07.test07a_method(100)); 上記のように書いた場合 abstruct public を省略したものとみなされることを思い出しましょう 11/50 プログラム インターフェース InterTest07a がある アブストラクトメソッド test07a_method がある double 型の引数を 1 つ貰い double 型の戻り値を 1 つ返す 記号定数 PI2 が宣言されている PI2 の値は 2*Math.PI である interface InterTest07a{ double PI2=2*Math.PI; double test07a_method(double data); class Test07a implements InterTest07a{ 記号定数 PI2が宣言されている public double test07a_method(double data){ PI2の値は2*Math.PI return PI2*data; 通常 記号定数の宣言方法は public class Sample07e{ public static public final static 型名 void void 記号定数名 main([] = 初期値 args){ ; Test07a dt07 dt07 = new new Test07a(); ですが インターフェース内では System.out.println(dt07.test07a_method(100)); 型名記号定数名 = 初期値 ; と省略して書くことができることを思い出しましょう 12/50 6
プログラム クラス Test07a がある インターフェイス InterTest07a を実装したもの メソッド test07a_method は 貰った double 型の値を PI2 倍した double 型の値を返す interface InterTest07a{ double PI2=2*Math.PI; double test07a_method(double data); class Test07a implements InterTest07a{ public double test07a_method(double data){ return PI2*data; double test07a_method(double data) は InterTest07aをpublic 引数の class Sample07e{ PI2 倍の値を返す public static void void main([] args){ 実装したクラス Test07a dt07 dt07 = new new Test07a(); Test07a インターフェイスを実装したクラスを書くには System.out.println(dt07.test07a_method(100)); class クラス名 implements interface 名のようにすることを思い出しましょう 13/50 インスタンス dt07 を生成 プログラム クラス main の中では Test07a をクラスとするインスタンス dt07 を生成しなさい System.out.println(dt07.test07 a_method(100)); を実行しなさい interface InterTest07a{ double PI2=2*Math.PI; double test07a_method(double data); 実行すると 引数の値のPI2 倍 つまり class Test07a implements InterTest07a{ 3.141592653589793*2*100=628.3185307179587 public double test07a_method(double data){ が出力される return PI2*data; public class Sample07e{ public static void void main([] args){ Test07a dt07 dt07 = new new Test07a(); System.out.println(dt07.test07a_method(100)); 14/50 7
前回の課題 その 2: Sample07c.java をコンパイルして実行しなさい 15/50 Sample07c.java コンソールに 2.718281828459045 public class Sample07c { と表示される { public static void main([] args) {{ System.out.println(Math.E); Math.Eは System.out.println(Math.sqrt(20.5)); 自然対数の底 System.out.println(Math.pow(5,3)); System.out.println(Math.log(5)); System.out.println(Math.cos(Math.PI/4)); System.out.println(Math.ceil(20.6)); System.out.println(Math.max(10.2,20.5)); 16/50 8
Sample07c.java コンソールに 4.527692569068709 public class Sample07c {{ と表示される public static void main([] args) {{ System.out.println(Math.E); System.out.println(Math.sqrt(20.5)); System.out.println(Math.pow(5,3)); System.out.println(Math.log(5)); Math.sqrtは平方根を返すメソッド System.out.println(Math.cos(Math.PI/4)); この例では 20.5の平 System.out.println(Math.ceil(20.6)); 方根を返す System.out.println(Math.max(10.2,20.5)); 17/50 Sample07c.java コンソールに 125.0 public class Sample07c {{ と表示される public static void main([] args) {{ System.out.println(Math.E); System.out.println(Math.sqrt(20.5)); System.out.println(Math.pow(5,3)); System.out.println(Math.log(5)); System.out.println(Math.cos(Math.PI/4)); Math.pow(a,b) は System.out.println(Math.ceil(20.6)); a b を返すメソッド System.out.println(Math.max(10.2,20.5)); この例では 5 3 を返す 18/50 9
Sample07c.java コンソールに 1.6094379124341003 public class Sample07c {{ と表示される public static void main([] args) {{ System.out.println(Math.E); System.out.println(Math.sqrt(20.5)); System.out.println(Math.pow(5,3)); System.out.println(Math.log(5)); System.out.println(Math.cos(Math.PI/4)); System.out.println(Math.ceil(20.6)); Math.log(a) は System.out.println(Math.max(10.2,20.5)); aの自然対数を返すメソッド この例では log(5) の自然対数を返す 19/50 Sample07c.java コンソールに 0.7071067811865476 public class Sample07c {{ と表示される public static void main([] args) {{ System.out.println(Math.E); Math.PIは円周率に近いdouble 型の値 System.out.println(Math.sqrt(20.5)); つまり 3.141592653589793 System.out.println(Math.pow(5,3)); それを4で割った値は0.7853981633974483 System.out.println(Math.log(5)); System.out.println(Math.cos(Math.PI/4)); System.out.println(Math.ceil(20.6)); Math.cos(a) System.out.println(Math.max(10.2,20.5)); は aのコサインを返すメソッド この例では 0.7853981633974483のコサインを返す 20/50 10
Sample07c.java コンソールに 21.0 public class Sample07c {{ と表示される public static void main([] args) {{ System.out.println(Math.E); System.out.println(Math.sqrt(20.5)); Math.ceil(a) System.out.println(Math.pow(5,3)); は aの小数点以下切り上げを返すメソッド System.out.println(Math.log(5)); この例では 20.6の小数点以下切り上げを返す System.out.println(Math.cos(Math.PI/4)); System.out.println(Math.ceil(20.6)); System.out.println(Math.max(10.2,20.5)); 21/50 Sample07c.java コンソールに 20.5 public class Sample07c {{ と表示される public static void main([] args) {{ System.out.println(Math.E); System.out.println(Math.sqrt(20.5)); Math.max(a,b) System.out.println(Math.pow(5,3)); は aとbの大きいほうの値を返すメソッド System.out.println(Math.log(5)); この例では 10.2と20.5を比べ 大きいほうの値を返す System.out.println(Math.cos(Math.PI/4)); System.out.println(Math.ceil(20.6)); System.out.println(Math.max(10.2,20.5)); 22/50 11
Java における文字列 23/50 Java における文字列 Javaには 文字列型という基本データ型はありません ( ここらへんは C 言語と一緒です ) しかし Javaには 次のような 文字列を便利に扱うクラスが あらかじめ準備されています java.lang. java.lang.buffer パッケージ java.lang に含まれています ここでは これらの基本的な使い方を記述します 詳細は Sunのサイト http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/.html http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/buffer.html 24/50 12
Java における文字列 文字列は クラスや Bffer クラスのインスタンスを生成して扱います 文字列を保存したり 変更を加えたりするには 1. インスタンスを生成する 2. インスタンスに文字列を保存する 3. メソッドを利用して 文字列を変更するという手順を踏むことになります 25/50 クラスと Buffer クラス クラスと Bffer クラスは似ていますが 文字列が不変であるか可変であるかが異なります クラス 文字列は不変 つまり 文字列の一部分を変更するようなことはできない Bfferクラス 文字列は可変つまり 文字列の一部分を変更するようなことができる 26/50 13
クラス Java における文字列は クラスとして実現されます クラスのインスタンスを生成することになりますが 変数のように扱えるようになっています 書式 : 次の 3 つのような方法があります ss ss = new ("test"); ss; ss ss = "test"; どれも ssという名前のインスタンスを生成しています また 1つめと3つめは testという文字列を保存させています 型の変数 ss のように表現することが多いです 27/50 文字列の代入と連結 型の変数に 文字列を代入したい場合 次のようにします インスタンス名 = " 代入したい文字列 "; "; たとえば 型の変数 ssに 文字列 Testを代入したい場合 ss ss = "Test" のようにします ある 2 つの文字列 "Hello " と "World" を連結して 型の変数 ss に代入した場合は ss ss = "Hello" + "World"; のように + 記号で繋ぐと 連結されます 28/50 14
クラスのメソッド クラスには 便利なメソッドが沢山あります ここでは その一部を紹介します メソッドですので インスタンス名. メソッド名 ( 引数 ); ); のようにして使用します たとえば 型のインスタンス ( 変数 )ssがあって メソッド length() を使いたいなら ss.length(); のようになります 29/50 クラスにおける順番 型の変数において 文字は 0 番目から数えます たとえば Test Sring という文字列があるなら T e s t S t r i n g 0 番目 1 番目 2 番目 9 番目 10 番目 のように数えます 30/50 15
戻り値 char int boolean クラスの主なメソッドその 1 記法 charat(int index) length() substring(int a) substring(int a, int b) equals(object anobject) 意味 index 番目の文字を返します文字列の長さを返します a 番目から最後までの文字列を返します a 番目からb 番目までの文字列を返します文字列と指定されたオブジェクトを比較します 31/50 戻り値 int int int int クラスの主なメソッドその 2 記法 indexof(int ch) indexof(int ch, int a) indexof( ss) indexof( ss, int a) 意味与えられた文字 chが最初に出現する場所を返します 無い場合は-1を返します a 文字目以降で 与えられた文字 chが最初に出現する場所を返します 無い場合は-1を返します 与えられた文字列 ss が最初に出現する場所を返します 無い場合は -1 を返します a 文字目以降で 与えられた文字列 ss が最初に出現する場所を返 します 無い場合は-1を返します 32/50 16
戻り値 クラスの主なメソッドその 3 記法 touppercase() tolowercase() valueof(boolean b) valueof(char b) valueof(double b) valueof(int b) valueof(long b) 意味すべての文字を大文字にした文字列を返します すべての文字を小文字にした文字列を返します 引数の文字列表現を返します引数の文字列表現を返します 引数の文字列表現を返します 引数の文字列表現を返します 引数の文字列表現を返します 33/50 プログラム例 public class Sample08a{ public static void void main([] args){ ss01 ss01 = new new ("Test 01"); ss02 ss02 = "Test 02"; 02"; ss03; ss03 ss03 = "Test " + " 01"; 01"; System.out.println(ss01.charAt(10)); System.out.println(ss01.length()); System.out.println(ss01.substring(5)); System.out.println(ss01.substring(5,7)); System.out.println(ss01.equals("Test 01")); System.out.println(ss01.equals(ss02)); System.out.println(ss01.equals(ss03)); System.out.println(ss01.toUpperCase()); System.out.println(ss01.toLowerCase()); 34/50 17
プログラム例 public class Sample08b{ public static void void main([] args){ ss01 ss01 = new new ("Test 01"); ss02 ss02 = "Test 02"; 02"; ss03; ss03 ss03 = "Test " + " 01" 01" + ss01; System.out.println(ss03); System.out.println(ss03.indexOf('t')); System.out.println(ss03.indexOf('t',5)); System.out.println(ss03.indexOf("Test")); System.out.println(ss03.indexOf("Test",5)); 35/50 Buffer クラス Java における文字列は クラスとして実現されます Buffer クラスのインスタンスを生成することになります 書式 : sb sb = new ("test"); クラスと異なり new する必要があります 36/50 18
Buffer クラスのメソッド Bufferクラスには 便利なメソッドが沢山あります ここでは その一部を紹介します メソッドですので インスタンス名. メソッド名 ( 引数 ); ); のようにして使用します たとえば Buffer 型のインスタンス ( 変数 )sbがあって メソッド length() を使いたいなら sb.length(); のようになります 37/50 Buffer クラスにおける順番 Buffer 型の変数において 文字は 0 番目から数えます たとえば Test Sring という文字列があるなら T e s t S t r i n g 0 番目 1 番目 2 番目 9 番目 10 番目 のように数えます 38/50 19
Buffer クラスの主なメソッドその 1 戻り値 char int 記法 charat(int index) length() substring(int a) substring(int a, int b) to() 意味 index 番目の文字を返します文字列の長さを返します a 番目から最後までの文字列を返します a 番目からb 番目までの文字列を返します 型の文字列を返します 39/50 Buffer クラスの主なメソッドその 2 戻り値 int int 記法 indexof( ss) indexof( ss, int a) 意味 与えられた文字列 ssが最初に出現する場所を返します 無い場合は-1を返します a 文字目以降で 与えられた文字列 ssが最初に出現する場所を返します 無い場合は-1を返します 40/50 20
戻り値 void Bffer Buffer クラスの主なメソッドその 3 記法 setcharat(int a, char ch) reverse() insert(int a, ss) replace(int a, int b ss) deletecharat(int a) 意味文字列のa 番目の文字をchに変更します文字列を逆順にします文字列 ssをa 番目の直後に挿入します a 番目からb-1 番目の文字をss に置き換えます a 番目の文字を削除します delete(int a, int b) aからb-1 番目を削除しますこのページのメソッドは インスタンスの持っている文字列を 直に変更します 41/50 戻り値 Bffer Bffer Buffer クラスの主なメソッドその 4 記法 append( ss) 意味文字列の末尾に 文字列 ssを追加します append(buffer sb) 文字列の末尾に Buffer sbを追加しますこのページのメソッドは インスタンスの持っている文字列を 直に変更します 42/50 21
プログラム例 public class Sample08c{ public static void void main([] args){ Buffer sb sb = new new Buffer("Test 01"); System.out.println(sb.charAt(10)); System.out.println(sb.substring(5)); System.out.println(sb.substring(5,7)); System.out.println(sb.indexOf("Test")); System.out.println(sb.indexOf("Test",5)); 43/50 プログラム例 public class Sample08d{ public static void void main([] args){ Buffer sb sb = new new Buffer("Test 01"); System.out.println(sb); sb.setcharat(1,'t'); System.out.println(sb); sb.insert(2,"aaaa"); System.out.println(sb); sb.replace(2,4,"bbbb"); System.out.println(sb); sb.deletecharat(3); System.out.println(sb); sb.delete(3,5); System.out.println(sb); sb.reverse(); System.out.println(sb); 44/50 22
変換 クラスのみにあるメソッドや Bffer クラスのみにあるメソッドがありました touppercase や tolowercase は クラスにしか無い setcharat や append は Bffer クラスにしか無い Bffer クラスのインスタンスに対しては Buffer sb = new Buffer("Test01"); sb = "Test02"; のような形では代入できない よって + で連結もできない クラスのインスタンスと Bffer クラスのインスタンスの間で 文字列をやり取りしたい場合があります 45/50 変換方法 クラスのインスタンス ss と Bffer クラスのインスタンス sb があった場合 Buffer から へ sb sb = new Buffer(ss); からBufferへ ss ss = new (sb); ss ss = "" "" + sb; ss ss = sb.to(); 46/50 23
プログラム例 public class Sample08e{ public static void void main([] args){ ss ss = new new ("Test"); Buffer sb sb = new new Buffer("Buffer"); System.out.println("ss: "+ss); System.out.println("sb: "+sb); sb.append(" Test"); System.out.println("sb:" + sb); sb); ss ss = new new (sb); System.out.println("ss:" + ss); ss); ss ss = "Abcd" + ss; ss; System.out.println("ss:" + ss); ss); sb sb = new new Buffer(ss); System.out.println("sb:" + sb); sb); sb.reverse(); System.out.println("sb:" + sb); sb); 47/50 誤植のおもひで 今回は 非常に多くの誤植がありました 申し訳ございません 48/50 24
誤植のおもひで 9ページ目 1 行目 誤 : 次のような仕様を満たすプログラム Sample06h.java 正 : 次のような仕様を満たすプログラム Sample07d.java 13ページ目 1 行目 誤 : クラス Test06a がある 正 : クラス Test07a がある 49/50 誤植のおもひで 19ページ目吹き出しの中 3 行目 誤 :log(5) の平方根を返す 正 :log(5) の自然対数を返す 37ページ スライド全体を削除 50/50 25
誤植のおもひで 新 37ページ目 1 行目 誤 :クラスには 正 :Bufferクラスには 新 40ページ目 1 行目 indexofの説明を修正 51/50 誤植のおもひで 新 43ページ目中盤 誤 :System.out.println(sb.indexOf('t')); System.out.println(sb.indexOf('t',5)); 正 : 削除 新 46ページ目 1つめの箇条書き 誤 :からBufferへ 正 :Bufferからへ 52/50 26
誤植のおもひで 新 43ページ目中盤 誤 :System.out.println(sb.indexOf('t')); System.out.println(sb.indexOf('t',5)); 正 : 削除 新 46ページ目 2つめの箇条書き 誤 :Bufferからへ 正 :からBufferへ 53/50 27