第3回 基本クラスライブラリ(4月27日)

今日の課題

■ String クラス

文字列クラスは,固定長で文字を格納する.C言語と同じく,文字の配列.

インスタンスの作り方

方法2は,11文字だけ格納できる文字列のインスタンスである.インス タンスの生成後,1文字ずつ代入する必要がある.文字列の操作は,基本的に は,操作対象の文字の位置(インデックス)を指定する必要がある.

メソッドの例

例題1

以下を Workspace 上で実行してみよう.
s := String new: 11.
i := 1.
#( $H $e $l $l $o $  $w $o $r $l $d ) do: [: c | s at: i put: c. i := i + 1 ].
Transcript show: s; cr.
s at: 7 put: $W.
Transcript show: s; cr.
t := s, '!'.
Transcript show: t; cr

■ Stream クラス

String クラスでは,文字の追加や削除などが不便である.Stream クラスに変換すれば,文字列の操作が簡単になる.

ストリームのサブクラス

Stream
  DataStream
    ReferenceStream
      SmartRefStream
    PositionableStream
      ReadStream
      WriteStream
        ReadWriteStream
          FileStream

※クラスの上下関係の意味を考えてみよう.

メソッドの例

例題2

以下を Workspace で動かそう.
s := WriteStream on: ''.   (Alt-d を押す)
s nextPutAll: 'Hello'.     (Alt-d を押す)
s contents.                (Alt-p を押す)
s nextPutAll: ' World'.    (Alt-d を押す)
s contents.                (Alt-p を押す)
s nextPut: $!.             (Alt-d を押す)
s contents.                (Alt-p を押す)

例題3

「名前」と「ポイント」が「=」で区切られて記載された文字列から,名前 のみとポイントのみを抽出して表示するプログラムを Workspace 上に作成しよ う.
s := ReadStream on: 'ALONSO=36'.
n := s upTo: $=.
p := s nextLine.
Transcript show: 'name = ',n; cr.
Transcript show: 'point = ',p; cr

■ ファイル操作

テキストファイルは文字列と改行文字の連続の構成である. この構造は Stream クラスで扱うことができる. ファイル用のストリームは,FileStream クラスである.

メソッドの例

例題4

ファイルから1行を読み,その行の先頭に行番号を付与して,Transcript に表示するプログラムを Workspace 上に作成しよう.
fin := FileStream fileNamed: 'testIn.dat'.
n := 1.
[ fin atEnd ] whileFalse: [
    line := fin nextLine.
    nline := (n asString), ':', line.
    Transcript show: nline; cr.
    n := n + 1.
].
fin close

※ testIn.dat のサンプル ⇒ ここの ファイルを「マウスの右クリックにより『名前を付けて保存』」でダウンロー ドして下さい.Squeak の入力ファイルは,Linux で普通に作ったテキストファ イルと異なり,Windows 系の改行コードが必要です.なお,コンソール上で, 「nkf -Lw 元ファイル名 > 新ファイル名」とすると,Linux の通常のテキ ストファイルをSqueak用に変換可能です.

■ 練習

名簿ファイル「f1.dat」は,1行の形式が「人 名=ポイント」となっている.名簿ファイルを読み,以下の情報を 「Transcript」に表示するプログラムを Workspace 上に作成せよ.

以下に動作例を示す:

Best: F.Alonso(36)
Average: 7.09090909090909

ヒント:'123' を整数に変換するには、'123' asInteger とする.(1/2) を小数に変換するには,(1/2) asFloat とする.小数を文字列に変換するには, 3.14 asString とする.

練習の終った人は,「Transcript」に出力するのではなく,ファイルに出 力することを試みよ.


2005.4.26 by tokuhisa