第13回 名簿表の格納と検索(7/3)
■ 課題 1:個人データ
- 学生の個人データを表す構造体 Student を作成せよ。
- Student は、学籍番号(文字列)、漢字氏名(文字列)、英語氏名(文字列)、住所(文字列)、生年月日の年(整数)、月(整数)、日(整数)、メールアドレス(文字列)、というメンバ変数で構成されるものとする。
- Student に対する基本的な関数を次のとおり作成せよ。
- 初期化関数 student_initialize:学籍番号、漢字氏名、英語氏名、住所、生年月日、メールアドレスを引数で与えると、それらを格納し、その構造体へのポインタを返す。格納の際は、後述の set_gakuseki などのアクセサを使え。なお、malloc に失敗すると、exit すること。
- 終了関数 student_free: Studentの構造体へのポインタを引数で与え、その構造体の中に、動的割り当て(malloc)されたメンバ変数があるならばそれらを解放(free)し、最後に、引数で示された領域を解放する。
- 表示関数 student_print: メンバ変数の値を表示する。
- メンバ変数へのアクセス関数を作成せよ。
- 学籍番号の参照 get_gakuseki: 引数はStudentへのポインタ、返し値は学籍番号(文字列)。ただし、文字列は複製せず、ポインタを返すこと。
- 学籍番号の格納 set_gakuseki: 引数はStudentへのポインタ、および、学籍番号、返し値は成功、失敗のフラグ。
- 漢字氏名、英語氏名、住所、生年月日、メールアドレスについても同様に、get_kname/set_kname, get_ename/set_ename, get_address/set_address, get_birthday/set_birthday, get_email/set_email を作成せよ。get/set_birthday の引数について、生年月日を表す変数型は自由に設計してよい。
- 以上のプログラムファイルを、student.c および student.h とせよ。
■ 課題 2:名簿リスト
- 構造体 Student へのポインタを要素とする線型リストのノードを定義せよ(Node)。
- 線型リストの各種操作関数(list_make_node、list_print、list_push、list_pop、list_append)を作成せよ。たとえば、push 操作のプロトタイプ宣言は、void list_push(Node *, Student *); となる。なお、ノードの malloc に失敗したとき、pop に失敗したとき、exit せよ。また、pop 操作により、ノードは free するが、Student は free しないこと。
- insert 操作、および、merge 操作 では、大小比較の基準が必要である。まずは、学籍番号を基準とした list_insert_by_gakuseki、および、list_merge_by_gakuseki を作成せよ。学籍番号は、古いものから新しいものへの順、かつ、下4ケタについて昇順になるようにせよ。この計算のために構造体 Student のメンバ変数を拡張してもよい。たとえば、入学年と下4桁を int で表すなどである。その他の課題においても同じく、自由にメンバ変数を追加しても良い。
- delete 操作を学籍番号を基準に行う関数 list_delete_by_gakuseki を作成せよ。だたし、delete 操作により、ノードは free するが、Student は free しないこと。
- 以上のプログラムファイルを、stlist.c および stlist.h とせよ。
■ 課題 3:名簿表のロード
- 名簿表は、ここに表示されているデータを用いる。データの要素間を半角のスペースで区切り、1人ぶんのデータを1行として、ファイルにダウンロードしておくこと。このファイルを meibo.dat とする。
- 名簿表の構造体 Meibo を定義せよ。この構造体は、名簿リストへのポインタ、および、格納人数というメンバ変数を含む。
- 名簿表をロードする関数 meibo_load を作成せよ。
- meibo.dat は標準入力から与えることでロードする。
- 1人ずつのデータをロードし、構造体 Student に格納せよ。
- 全員のデータは、1つのリストとし、学籍番号順になっているものとする。
- 名簿表を表示する関数 meibo_print を作成せよ。
- 以上のプログラムファイルを、meibo.c および meibo.h とせよ。
■ 課題 4:名簿表の検索と部分修正
- メールアドレスについて、知能情報工学科以外のドメインを記述している学生の名前をリストから検索し、表示する関数 meibo_print_outer_email_users を作成せよ。ドメインの検査は、「@」以降の文字列が「ike.tottori-u.ac.jp」であるかどうかで判断すること。
- 英語氏名では、性はすべて半角大文字、名は先頭は大文字で残りは小文字としたい。そこで、名簿リストから英語氏名を1つずつ調べ、適切なアルファベットになるように変換する関数 meibo_rewrite_eng_name を作れ。全角英数の場合は半角に直すこと。(例)Masato tokuhisa ⇒ Masato TOKUHISA
- 名簿リストの中の住所欄に半角数字が使われていれば全角に変換する関数meibo_rewrite_address を作成せよ。
- 以上のプログラムファイルを、meibo.c および meibo.h に追加せよ。
■ 課題 5:名簿表の加工
- 課題4までのプログラムは学籍順のリストを使っている。課題5では、このリストと並行して(別紙参照)、年齢の若い順のリストを作成したい。つまり、学籍順リストが示している各 Student の領域を、年齢順リストからも差し示すことにする。この処理をする関数 meibo_share_and_sort_by_age を作成せよ。もちろん、このために、構造体 Meibo に新たな名簿リストへのポインタをメンバ変数に追加すること。また、int student_count_age(Student *); などといった補助的な関数を作成してもよい。ここで、補助的な関数はどのファイルに置くことが適切であるかよく考えること。
-
- 以上のプログラムファイルを、meibo.c および meibo.h に追加せよ。
■ 課題 6:自由問題
- 各自、自由に名簿表を操作する関数を作れ。
- 何かテーマを考え、関連する関数を作るとよい。
- 例: 取得単位数を扱えるようにする。具体的には、Student にメンバ変数 units を追加し、アクセサも追加する。名簿表の検索として、規定単位数以下の者を表示する関数を追加する。また、取得単位数は、単位数データファイルからロードするものとする。単位数データは、学籍番号と単位数のみを記述したものとする。名簿ファイルをロードしたあと、単位数ファイルをロードし、学籍番号で照合しながら、メンバ変数に代入する…。など。
■ 最終レポートの作成要領
プログラム作成
- 上記課題のプログラムを全て作成せよ。
- 各課題について動作確認をするためのソースを作成せよ。prac1301a.c prac1301b.cなど1つの課題に複数個あってもよい。そして、Makefile から、動作確認プログラムがコンパイルできるようにせよ。
レポート記述内容
- 最初の1ページめは、表紙。その後、本体のページが続く。最後に、ソースプログラム一式を印刷したものを付与する。
-
表紙
- 授業名、氏名、学籍番号、提出日を明記
-
本体
(以下の数字は、章や節の番号。)
- 1. プログラムの概要
- (どんな処理をするプログラムかを説明する。)
- 2. 動作確認
- 2.1 課題1「個人データ」について
- (確認したい事は何かを説明する文章、入力値、および、動作結果)
- (考察。不具合に至る入力をどれだけ想定したか、確認が十分であるといえるか、など)
- 2.2 課題2「名簿リスト」について
- (同様)
- 2.3 課題3「 - - - 」(以下同様)
- - - -
- 3. 全体の考察
- 3.1 ○○について
- (今回作ったリストの操作過程を図で説明したもの、free するタイミングについて、- - - )
- 3.2 - - -
- - - -
- 4. 感想(任意)
- (授業に対する評価・意見、何でも。採点には影響しません。後輩のために記入してください。)
-
付録 ソースプログラム一式
(マルチページ印刷可。適度のコメントを手書き、あるいは、プログラム中に書き込むこと。)
- Makefile
- ヘッダファイル(student.h stlist.h meibo.h)
- ソースファイル(student.c stlist.c meibo.c)
- 動作確認プログラム(prac1301a.c prac1302.c … prac1305.c など)
- その他独自のファイルを置く。
提出物
- レポートは、A4用紙に記入し、左上をステープラでとめること。手書、ワープロ、tex、word、一太郎、など方法は問わない。
提出期限と場所
- 締切:2003年7月16日(水)17時
- 場所:知能棟1F・計算機工学講座C
(c) Masato TOKUHISA, 2003, July.2