第1回文字列操作1(4月13日)

■ 実力テスト!?

問題1

名前 name と年齢 age の2つの変数で構成されるデータ構造 NameCard を 定義せよ。名前 name は、サイズが NAME_LEN バイドの文字列とする (NAME_LEN は #define で 21 と定義)。年齢 age は、整数型とする。この 構造体のソースファイル名を namecard.h とせよ。

問題2

標準入力からの入力を、問題1で定義した構造体に格納するサブルーチン nc_get() を作成せよ。つづいて、構造対に格納された情報を標準出力に出力 するサブルーチン nc_put() を作成せよ。このサブルーチンのソースファイル 名を namecard.c とせよ。

なお、NameCard のメモリを確保するサブルーチン nc_open() および、そ の開放のサブルーチン nc_free(NameCard *) も namecard.c に作成せよ。

問題3

namecard.h、namecard.c、prac0101.c を用いて、下記のコンパイルと実 行のできることを確認せよ。

(1) コンパイル

make を用いてコンパイルをする。

> make prac0101
gcc -Wall -O3 -c namecard.c
gcc -Wall -O3 -o prac0101 prac0101.c namecard.o
>
コンパイルに使用する Makefile と prac0101.c は、リンク先のファイルを使う。

(2) 実行

ここで、./prac0101 を実行し、キーボードから、「Taro」と「22」をそれぞ れ入力している。「Taro(22)」は、nc_put() による出力である。

> ./prac0101
Taro
22
Taro(22)
> 




■ ヒント

namecard.h と namecard.c の雛形
/* namecard.h */
#include 「FILE *を使うために…」
#define  「NAME_LEN が 21 と定義」

typedef struct {
  「1つめのメンバ変数の宣言」
  「2つめのメンバ変数の宣言」
} 「データ構造名」

NameCard *nc_open();
void nc_close(NameCard *);
void nc_get(NameCard *, FILE *);
void nc_put(NameCard *, FILE *);
/* namecard.c */
#include 「NULLを使うために…」
#include 「malloc や free を使うために…」
#include 「strlen を使うために…」
#include 「構造体 NameCard を使うために…」

NameCard *nc_open()
{
  「NameCard を malloc」
  「malloc できなければ、エラー終了」
  「malloc の結果を返す」
}

void nc_close(「NameCardへのポインタ」)
{
  「開放する」
}

void nc_get(「NameCardへのポインタ」,「入力ファイル記述子」)
{
  「fgetsをして、NameCard のメンバ変数へ代入」
  「長さを測る」
  「最後の文字が \n ならばカットする」
  「数値を NameCard のメンバ変数へ入力」
}

void nc_put(「NameCardへのポインタ」,「出力ファイル記述子」)
{
  fprintf(fout, "%s(%d)\n", src->name, src->age);
}

□ 宿題(小レポート)

次回の演習開始時に集めます。

□ 連絡事項

小レポートは採点後に、いったん返却します。返却されたレポートは各自 がファイルに綴じておいて下さい。最終レポートと同時にそのファイルを提出 してもらいます。その結果、初めて小レポートの点数を、成績に加算します。 なお、7月頃に、最後にファイルを提出してもらった後、ファイルは返却しま せんので、必要ならばコピーを作成しておき、提出して下さい。


(c) Masato TOKUHISA (2007, April, 9.)