ソフトウェア設計学 - 岩手県立大学nobu-s/lecture/soft_eng/... · web...

Click here to load reader

Upload: others

Post on 04-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

ソフトウェア設計学

超簡単住所録

内部設計書

第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