外部インタフェース/API | ![]() ![]() |
関数phonebookの説明
1. データ辞書とファイル名の決定
最初のステートメントは、電話帳ファイル名'myphonebook'
を変数pbname
に割り当てます。phonebook
プログラムがPC上で実行中の場合は、 java.lang.System
static
メソッドgetProperty
を呼び出して、データ辞書用に利用するディレクトリを探します。これは、ユーザのカレント作業ディレクトリに設定されます。そうでない場合は、ユーザがあらかじめ任意に定義可能なシステム変数HOME
を使って、ディレクトリを決定するためにMATLAB関数getenv
を使います。その後、pbname
をデータ辞書とファイル名'myphonebook
'で構成されるパス名に割り当てます。
function phonebook(varargin) pbname = 'myphonebook'; % name of data dictionary if ispc datadir = char(java.lang.System.getProperty('user.dir')); else datadir = getenv('HOME'); end; pbname = fullfile(datadir, pbname);
2. 必要ならばファイル出力ストリームを作成
電話帳ファイルが存在しない場合は、phonebook
は、ユーザに新規ファイルを作成するかどうかを聞きます。ユーザがy
と答えると、phonebook
はFileOutputStream
オブジェクトを作成することにより新規の電話帳を作成します。try-catch
ブロックのtry
クローズにおいて、FileOutputStream
コンストラクタに渡される引数pbname
は、コンストラクタが作成し、オープンするファイル名です。つぎのステートメントは、FileOutputStream
ブジェクトFOS
についてclose
を呼び出すことによってファイルをクローズします。出力ストリームコンストラクタが失敗すると、catch
ステートメントは、メッセージを表示してプログラムを終了します。
if ~exist(pbname) disp(sprintf('Data file %s does not exist.', pbname)); r = input('Create a new phone book (y/n)?','s'); if r == 'y', try FOS = java.io.FileOutputStream(pbname); FOS.close catch error(sprintf('Failed to create %s', pbname)); end; else return; end; end;
3. ハッシュテーブルの作成
例題は、データ辞書用のハッシュテーブルとしてjava.util.Properties
オブジェクトを作成します。.
pb_htable = java.util.Properties;
4. ファイルの入力ストリームの作成
try
ブロックにおいて、例題はオブジェクトをFIS
に割り当てて、電話帳ファイル名を使ってFileInputStream
コンストラクタを呼び出します。呼び出しが失敗した場合は、catch
ステートメントは、error
メッセージを表示してプログラムを終了します。
try FIS = java.io.FileInputStream(pbname); catch error(sprintf('Failed to open %s for reading.', pbname)); end;
5. 電話帳のキーと値をロードし、ファイルの入力ストリームをクローズ
例題は、FileInputStream
オブジェクトFIS
ついてload
を呼び出し、電話帳のキーと(存在すれば)その値をハッシュテーブルにロードします。その後ファイルの入力ストリームをクローズします。
pb_htable.load(FIS); FIS.close;
6. アクションメニューを表示し、ユーザ選択を取得
while
ループ内で、disp
ステートメントは、電話帳についてユーザが実行可能なアクションのメニューを表示します。その後、input
ステートメントは、ユーザ選択の入力を要求します。
while 1 disp ' ' disp ' Phonebook Menu:' disp ' ' disp ' 1. Look up a phone number' disp ' 2. Add an entry to the phone book' disp ' 3. Remove an entry from the phone book' disp ' 4. Change the contents of an entry in the phone book' disp ' 5. Display entire contents of the phone book' disp ' 6. Exit this program' disp ' ' s = input('Please type the number for a menu selection: ','s');
7. 関数を呼び出し電話帳のアクションを実行
while
ループ内で、switch
ステートメントは、ユーザの選択に対応するcaseを与えます。最初の5つのcaseは、関数を呼び出して電話帳のアクションを実行します。
Case 1は、エントリのキーである名前の入力を指示します。isempty
を呼び出してユーザが名前を入力したかどうかを決定します。名前が入力されていない場合は、disp
を呼び出してエラーメッセージを表示します。名前が入力された場合は、その名前をpb_lookup
に渡しますpb_lookup
は、エントリをルックアップし、見つかった場合は、エントリの内容を表示します。
switch s case '1', name = input('Enter the name to look up: ','s'); if isempty(name) disp 'No name entered' else pb_lookup(pb_htable, name); end;
Case 2は、pb_add
を呼び出して、新規エントリの入力をユーザに指示し、それを電話帳に追加します。
case '2', pb_add(pb_htable);
Case 3は、input
を使って削除するエントリ名の入力を指示します。名前が入力されない場合は、disp
を呼び出してエラーメッセージを表示します。名前が入力された場合は、その名前をpb_remove
に渡します。
case '3', name=input('Enter the name of the entry to remove: ', 's'); if isempty(name) disp 'No name entered' else pb_remove(pb_htable, name); end;
Case 4は、input
を使って変更するエントリ名の入力を指示します。名前が入力されない場合は、disp
を呼び出してエラーメッセージを表示します。名前が入力された場合は、その名前をpb_change
に渡します。
case '4', name=input('Enter the name of the entry to change: ', 's'); if isempty(name) disp 'No name entered' else pb_change(pb_htable, name); end;
Case 5は、pb_listall
を呼び出して、全てのエントリを表示します。
case '5', pb_listall(pb_htable);
8. 出力ストリームを作成し、電話帳を保存して終了
ユーザがcase6
を選択してプログラムを終了する場合は、try
ステートメントはFileOuputStream
オブジェクトに対するコンストラクタを呼び出し、電話帳名を渡します。コンストラクタが失敗した場合は、catch
ステートメントはエラーメッセージを表示します。
オブジェクトが作成された場合は、つぎのステートメントはFileOutputStream
オブジェクト FOS
とヘッダ記述文字列を渡して、Properties
オブジェクトpb_htable
についてsave
を呼び出すことにより、電話帳データを保存します。その後、FileOutputStream
オブジェクトについてclose
を呼び出してリターンします。
case '6', try FOS = java.io.FileOutputStream(pbname); catch error(sprintf('Failed to open %s for writing.',... pbname)); end; pb_htable.save(FOS,'Data file for phonebook program'); FOS.close; return; otherwise disp 'That selection is not on the menu.' end; end;
![]() | 例題 - Phone Bookの作成と利用 | 関数pb_lookupの説明 | ![]() |