プログラミング演習第13回構造体 II

目次

1 目標 1 2 構造体の復習 1 3 簡単な英和辞典 2 4 お知らせ 3

1 目標

• 構造体を用いて簡単な辞書を制作する.

• 応用として関数電卓プログラムをを進化させる.

2 構造体の復習

構造体の基本的な仕様は

struct (タグ名) {
    (中味)
};

でした. 具体的例として

typedef struct vec2d {
    double  x;
    double  y;
} VEC2D;

を考えました. この場合上と違いますが, これは, VEC2D が構造体 struct vec2d 型の新しい名前であることを意味します. typedef が無い場合は,

struct vec2d vector_a;
とstruct vec2d 型の変数vector_a と宣言しなければなりません. 即ち, struct vec2d

の部分が, int, douuble, char, のような型なのです. typedef を用いて上のように宣言すると,

VEC2D vector_a;

とすっきりします.

変数 vector に対して, 中味は,

vector_a.x = 0.1;
vector_a.y = 2;

のように初期化され, これによって vector_{a} = (0.1, 2) と定義できます.

3 簡単な英和辞典

構造体を用いて簡単な英和辞書を作成したいと思います. 仕様としては, home とキーボードから打ち込んだ英語の語に対して

home = 家

が返ってくるようにします. つまり, 英語のリストの中に尋ねられた言葉があるかどうか判定し, もしあったらその語とその日本語訳を引っ張ってくるようにするわけです. リストから探すには for 文を用いればいいと気づくと思います. 問題は, リストの中の対応する言葉があるかどうかを判定する方法ですが, これはライブラリーstring.h>の中にある strcmp(char *, char *) を用います. これは, もし前の文字列と後ろの文字列が等しい場合は 0 を返し, そうでない場合は 0 より大きい数を返す関数です.

これを用いて簡単な辞書プログラムを書いてみます. ファイル名は 13-1.c としてください.

#include <stdio.h>
#include <string.h>
#define max_eword 20
#define max_jword 20
#define max_word 100
typedef struct word{
     char eword[max_eword];
     char jword[max_jword];
   }WORD;
main()
{
  int i;
  char input[max_eword +1];
     char nyuuryoku[256];
   WORD data[] = {{"home", "家"},{"tree","木"}, {"love", "愛"}};
  printf("Input english word\n");
  gets(nyuuryoku);
   sscanf(nyuuryoku,"%s",input);
      for(i=0;i < max_word;i++){
        if(strcmp(data[i].eword,input)==0){

            printf("%s = %s\n",data[i].eword,data[i].jword);
            break;
            }
        }
     }

残念ながらこのプログラムでは, ritsumeikan と打ちますと

   ritsumeika = (blackbox)

そこで上のプログラムを次の手順で修正してみてください.

(1) リストにない英語が打ちこまれたとき, 「リストにない」と表示しプログラムを終了させるように修正.

(2) ピリオど (.) が打ち込まれたら終了するようにプログラムをさらに修正させる.

(3) もっと賢いプログラムを書く.

• 賢いプログラムができましたら, creportno.13-2 とし osaka-report まで送って下さい.

• 前回の関数電卓プログラム 12-2.c を関数名と求めたい値を入れたらその値が求まるように構造体を使って書き直してみてください. 即ち, sin 10 とキーボードから打ち込んだらその値が求まるようにプログラミングせよ. レポート名は creportno.13-3 として下さい.

レポートの締め切りは 7/13 とします.

4 お知らせ

来週 7/13 は自習とします. 今までの課題を各自行ってください. また課題の評価は,

http://www.ritsumei.ac.jp/~osaka/rejime/cseiseki.html

へリンクして確認してください.