| 外部インタフェース/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の説明 | ![]() |