ソフトウェア設計学
超簡単住所録
内部設計書
第1版
平成24年11月27
岩手県立大学ソフトウェア情報学部
村田嘉利
佐藤永欣
目次
11.内部設計書作成指針
2.モジュール設計書1
2.1.モジュール構成図1
2.2.各モジュールの説明1
3.データ構造3
3.1.内部データ3
3.2.データベースファイル3
4.関数仕様4
4.1.一覧4
4.2.詳細5
5.改定履歴21
1. 内部設計書作成指針
プログラム、およびドキュメント作成に使用するツールを以下に示す。
· プログラミング言語C言語。日本語の文字コードはUNIX環境で開発・実行する場合はEUC、Windows環境で開発・実行する場合はShiftJISとする
· コンパイラUNIX環境ではgcc、Windows環境ではVisual Studio。ANSI準拠の機能のみを使用する。
· ドキュメント作成ソフトMS Word
2. モジュール設計書
2.1. モジュール構成図
本シンプルなデータベース操作システムは以下の各モジュールからなる
· メインモジュール
main.c
· 入力モジュール
input.c
· 表示モジュール
display.c
· データハンドリングモジュールaddressdata.c
· データ管理モジュール
linearlist.c
· データベース入出力モジュールfileio.c
· 定数定義、関数プロトタイプ宣言モジュールaddress_note.h
2.2. 各モジュールの説明
以下に各モジュールの説明を述べる
· メインモジュールこのモジュールは、本システム起動時に最初に実行される。また、ユーザにメニューを表示し、ユーザの指令により別のモジュールを呼び出す。
· 入力モジュールこのモジュールは、ユーザから住所情報の入力を受ける。
· 表示モジュールこのモジュールは住所データベースの内容を表示する。
· データベースファイル入出力モジュールこのモジュールはデータベースファイルへの書き込みと読み込みを行う。読み書きともにデータベース全体に対して行う。
· データハンドリングモジュールこのモジュールは、他のモジュールで共通に使われるサービス的な機能を提供する。提供される機能には、内部データの保持用構造体に関連する操作が含まれる。
· データ管理モジュールこのモジュールには、プログラム内部におけるデータ管理に関するモジュールが含まれる。データハンドリングモジュールが提供する構造体を、線形連結リストを使って本モジュールで管理する。
· 定数定義、関数プロトタイプ宣言モジュールこのモジュールには、ソースコード全域で使用される定数定義、構造体宣言、関数プロトタイプ宣言が含まれる。各実装部モジュール(~.c)では、このモジュールをインクルードして使用する。
3. データ構造
3.1. 内部データ
· 住所データ構造体は以下のとおりである。
struct addressdata {
char *name;
char *postcode;
char *address;
char *tel;
};
· 線形連結リストは次のように定義されている。
struct addresslist {
struct addressdata *addr;
struct addresslist *next;
};
3.2. データベースファイル
取り扱うデータは、名前、郵便番号、住所、電話番号とする。これらのデータはデータベースに格納される。データベースはひとつのファイルとする。データベースファイルはテキスト形式で、1行に1件のアドレスデータを格納する。データベースファイルの各行は、上記の各データをタブで区切ったテキストのみから構成される。タブ以外の空白文字はデータの区切りとは認識されない。各行は改行文字で終わる。改行文字は、CRのみ、LFのみ、CR+LFを受け付ける。以下にデータベースファイルの例を示す。
何野何某020-0193岩手県滝沢村巣子152-52019-694-2612
何山何太020-0100岩手県盛岡市某所123-4019-123-4567
データベースは起動時にメモリに読み込まれ、終了時にメモリから書き戻される。データベースファイルの名前は、addressdata.txtとする。
4. 関数仕様
4.1. 一覧
関数名
機能
モジュール名
main
プログラムの開始
main.c
event_loop
キー入力を受付け、入力キーに応じた処理を行う
input_data
データを入力し、住所データのリストとして返す
input.c
input_data_from_keyboard
キーボードから住所録データを受け取る
display_addresslist_all
住所データをすべて表示する
display.c
add_addresslist
データを1件、線形連結リストの末尾に追加する
linearlist.c
delete_addresslist
指定されたデータを住所データのリストから削除する
insert_cell
引数で指定された位置に新しい顧客データを追加する
delete_cell
引数で指定された位置の顧客データを削除する
free_address_list
住所データのリストが使用しているメモリ領域を解放する
write_address_data
住所データのリストをすべてデータベースに書き込む
fileio.c
read_address_data
データベースから住所データをすべて読み込む
read_address_data_one_line
指定されたファイルから住所データを1件読み込む
new_addressdata
住所データの表現を内部形式に変換する
addressdata.c
free_addressdata
住所データのメモリを1件解放する
4.2. 詳細
main
構文
int main(void)
機能
プログラムの開始
引数
なし
返り値
int
0:正常終了
モジュール分類
main.c
input_data
構文
struct addresslist *input_data(struct addresslist **address_list)
機能
データを入力し、住所データのリストとして返す
引数
[in/out] struct addresslist **
住所データのリストの先頭の2重ポインタ。
このポインタを1回デリファレンスすると線形連結リストの先頭が得られる。リストが存在しない場合はNULLを格納したアドレスを指すポインタ渡す。
返り値
NULL:入力失敗、メモリ確保失敗など
NULL以外:成功、住所データのリストのポインタ。
モジュール分類
input.c
input_data_from_keyboard
構文
struct addressdata *input_data_from_keyboard(void)
機能
キーボードから住所録データを受け取る
引数
なし
返り値
NULL:入力失敗、メモリ確保失敗など
NULL以外:成功、入力された住所データへのポインタ。
モジュール分類
input.c
display_addresslist_all
構文
void display_addresslist_all(struct addresslist *address_list)
機能
住所データをすべて表示する
引数
[in] struct addresslist *
住所データのリストへのポインタ
返り値
なし
モジュール分類
display.c
write_addresslist
構文
int write_addresslist(struct addresslist *head)
機能
引数
[in] struct addresslist *
書き込んだ住所データの線形連結リストの先頭
返り値
1:成功
0:失敗。ファイルをオープン失敗など
モジュール分類
fileio.c
read_addresslist
構文
struct addresslist *read_addresslist(void)
機能
データベースから住所データをすべて読み込む
引数
[in] struct addresslist *
住所データの線形連結リストの先頭
返り値
NULL以外:住所データリストの先頭を指すポインタ
NULL:失敗
モジュール分類
fileio.c
read_address_data_one_line
構文
struct addressdata *read_address_data_one_line(FILE *datafile)
機能
指定されたファイルから住所データを1件読み込む
引数
[in/out] FILE *
データベースファイルのファイルポインタ
返り値
NULL以外:成功、読み込んだ住所データへのポインタ
NULL:失敗
モジュール分類
fileio.c
add_addresslist
構文
struct addresslist *add_addresslist(struct addresslist **head, struct addressdata *new_addr)
機能
データを1件、線形連結リストの末尾に追加する
引数
[in/out] struct addresslist**
住所データのリストの先頭の2重ポインタ。このポインタを1回デリファレンスすると線形連結リストの先頭が得られる。リストが存在しない場合はNULLを格納したアドレスを指すポインタ渡す
[in] struct addressdata *
追加したい住所データを指すポインタ。この関数内で実体がコピーされることはない
返り値
NULL以外:成功。線形連結リストの先頭を指すポインタが返される
NULL:追加失敗、引数が異常など
モジュール分類
linearlist.c
delete_addresslist
構文
int delete_addresslist(struct addresslist **head, int item)
機能
指定された住所録データをリストから削除する
引数
[in] struct addresslist **
住所データのリストの先頭の2重ポインタ。
[in] int
削除したい住所データの番号。住所データのリストの先頭を1番目と数える
返り値
1:成功
0:失敗
モジュール分類
linearlist.c
insert_cell
構文
static struct addresslist *insert_cell(struct addresslist **p, struct addressdata *new_address)
機能
引数で指定された位置に新しい顧客データを追加する
引数
[in/out] struct addresslist **
データを追加したい住所データのリスト上の 位置を示す2重ポインタ。このポインタを1回デリファレンスすると線形連結リスト中のデータが得られる。
[in] struct addressdata *
追加したい住所データを指すポインタ。この関数内で実体がコピーされたりはしない
返り値
NULL以外:成功。追加されたデータのポインタ
NULL:失敗
モジュール分類
linearlist.c
delete_cell
構文
struct addressdata *delete_cell(struct addresslist **p)
機能
引数で指定された位置の顧客データを削除する
引数
[in/out] struct addresslist **
データを追加したい住所データのリスト上の位置を示す2重ポインタ。
このポインタを1回デリファレンスすると線形連結リスト中のデータが得られる
返り値
NULL以外:削除したデータの次順位の住所データのポインタ
NULL:失敗
モジュール分類
linearlist.c
free_address_list
構文
void free_addresslist(struct addresslist *head)
機能
引数で指定された位置の顧客データを削除する
引数
[in/out] struct addresslist *
メモリを解放した住所データの線形連結リストの先頭
返り値
なし
モジュール分類
linearlist.c
new_addressdata
構文
struct addressdata *new_addressdata(char *name, char *postcode, char *add, char *tel)
機能
住所データの表現を内部形式に変換する
引数
[in] char *名前をあらわす文字列
[in] char * 郵便番号をあらわす文字列
[in] char * 住所をあらわす文字列
[in] char * 電話番号をあらわす文字列
返り値
NULL以外:変換された住所データ
NULL:失敗
モジュール分類
addressdata.c
free_addressdata
構文
void free_addressdata(struct addressdata *address)
機能
住所データのメモリを1件解放する
引数
[in/out] struct addressdata *
メモリを解放したい住所データ
返り値
なし
モジュール分類
addressdata.c
5. 改定履歴
版
更新日
内容
0.3
2012/8/10
1
2012/9/27
・改定履歴追加。
・章立てを再構成した。
・フローチャートとソースコードを突き合わせ、差異があった部分のフローチャートを修正。修正対象の関数は、display_address_all()、write_address_data()、read_address_data()、delete_addresslist() delete_cell()。
・関数一覧を表形式に再編成した。
1
2012/11/8
・各フローチャート内から処理として呼び出される関数について、関数名を追記。
・以下の関数名をソースコードに合わせて修正した。
read_addresslist()、write_addresslist()、display_addresslist_all()
・不具合修正に伴い、delete_addresslist()のフローチャートを修正。
START
キー入力イベントループ
END
住所録データ読み込み
住所録データ領域解放
read_addresslist()
event_loop()
free_addresslist()
START
住所データ新規入力
KBから1件入力
入力成功?
失敗
成功
END
帰り値は住所データの線形連結リストの先頭
帰り値はNULL
既存住所データの最後に新規データを追加
input_data_from_keyboard()
add_addresslist()
START
KBから氏名、郵便番号、住所、電話番号を入力
住所データ構造体に形式を変換
END
KBから1件入力
new_addressdata()
START
住所データリストの先頭
住所データリストの最後?
住所の番号、名前、郵便番号、住所、電話番号を1件表示
N
Y
END
1件読み込み
START
N
Y
END
住所の名前、郵便番号、住所、電話番号をデータベースファイルに書き込み
データベースファイルをクローズ
住所データリストの先頭
住所データリストの最後?
データベースファイルを書き込みオープン
1件読み込み
START
ファイルの最後?
N
Y
END
データベースファイルを読み込みオープン
データベースファイルをクローズ
データベースから1件分の住所データ読み込み
住所データリストの最後に追加
read_address_data_one_line()
add_addresslist()
START
データベースから1行読み込み
最後?
1行のテキストから氏名、郵便番号、住所、電話番号を抽出
住所データ構造体に形式を変換
END
N
Y
NULLを返す
new_addressdata()
START
追加成功?
引数を検査
異常
正常
N
Y
END
返り値はNULL
線形連結リストの末尾を探す
新規データを末尾に追加
返り値はNULL
返り値は線形連結リストの先頭
insert_cell()
START
引数を検査
エラー
削除したいデータ位置のアドレスを取得する
リストをつなぎかえる
住所データを削除する
削除対象のリストの要素(セル)を削除する
END
返り値は、1
返り値は、0
なし
あり
エラーあり
エラーなし
START
引数を検査
異常
正常
N
Y
END
返り値はNULL
メモリを確保
返り値はNULL
線形連結リストのポインタをつなぎかえ
失敗?
返り値は追加したデータのポインタ
START
引数を検査
異常
正常
END
返り値は0
メモリを解放
線形連結リストのポインタをつなぎかえ
返り値は削除したデータの次順位の住所データのポインタ
START
引数を検査
NULL
正常
END
メモリを解放
削除するリストをポンタで指す
次の要素を指すポインタを得る
ポインタがNULL?
NULL
それ以外
START
住所データ構造体用領域確保
成功?
名前用領域確保
成功?
郵便番号用領域確保
成功?
住所用領域確保
成功?
電話番号用領域確保
成功?
END
名前、郵便番号、住所、電話番号をコピー
途中まで確保できていた領域をそれぞれ開放
Y
N
N
N
N
N
Y
Y
Y
Y
Y
START
データがNULL
Y
N
名前がNULL?
名前用領域解放
郵便番号用領域解放
住所用領域解放
電話番号用領域解放
住所がNULL?
郵便番号がNULL?
電話番号がNULL?
END
N
N
N
N
Y
YU
Y
Y
Top Related