第6回目 簡単な構造体(5/15)

今日のキーワード

■ malloc で確保した領域について

■ 2次元ベクトルの構造体を作る

□ 宣言、代入、参照の例
/* list0601.c */
typedef struct{
  double x;
  double y;
} vector;

main()
{
  vector a,b;

  printf(”1つ目のベクトルを入力してください: ”);
  scanf(”%lf %lf”, &(a.x), &(a.y));

  printf(”2つ目のベクトルを入力してください: ”);
  scanf(”%lf %lf”, &(b.x), &(b.y));

  printf(”ベクトルを表示します。\n”);
  printf(”  a=( %2.2lf, %2.2lf )\n”, a.x, a.y );
  printf(”  b=( %2.2lf, %2.2lf )\n”, b.x, b.y );
}
□ 関数の引数(方法1) メイン関数で vec_print を呼ぶと、引数 a がコピーされ、v に代入される。
vec_print(vector v)
{
  printf(”( %2.2lf, %2.2lf )”, v.x, v.y);
}

- - -

main()
{

  - - -

  printf(”  a=”);  vec_print(a);
  printf(”  b=”);  vec_print(b);
}
□ 関数の引数(方法2) メイン関数で vec_print を呼ぶと、引数 a のアドレス値がコピーされ、v に代入される。
vec_print(vector *v)
{
  printf(”( %2.2lf, %2.2lf )”, v−>x, v−>y);
}

- - -

main()
{

  - - -

  printf(”  a=”);  vec_print(&a);
  printf(”  b=”);  vec_print(&b);
}

■ 演習1 ⇒ prac0601.c

  1. 2つのベクトルの内積値を返す関数 dotproduct を作成せよ。
  2. 2つのベクトルの和を求める関数 vec_add を作成せよ。ただし、vec_add は 2 通りの作り方があり、1つは、3引数をとり、第1、第2引数の和を第3引数の変数に代入する方法である。もう1つは、2引数と1つの返り値をとるもので、2引数の和を、malloc により vector タイプで確保したメモリに代入し、そのアドレスを返す方法である。前者の方法で実現せよ。
  3. 2つのベクトルの差を求める関数 vec_sub を作成せよ。3引数をとること。

■ malloc を使う方法

vector タイプでメモリを確保するには、以下のようにする。ポインタ変数 c を使って、vectorのメンバ変数にアクセスするには、矢印「->」を使う。
vector *c;
c = (vector *)malloc(sizeof(vector))
c->x = 1.0;
c->y = 2.0;

■ 演習2 ⇒ prac0602.c

  1. malloc を使ってベクトルの和、差を返すように、prac0601.c を改造せよ。

□ malloc を使う時の注意点

◇ 演習2で、上記の処理をしていない場合は追加せよ。⇒ prac0603.c

■ 宿題

以下の2つのプログラムを作成せよ。 プログラム、手書きによるコメント、そして、実行結果を提出せよ。
  1. まず、分数を表す構造体 frac を作成せよ。frac を構成する変数は、分母と分子であり、それぞれ、int den; と int num; とする。 分数同士の四則演算を行う関数、add, sub, mult, div を、3引数の関数として、malloc を使わずに作成せよ。ただし、約分はしなくてよい。⇒ prac0604.c
  2. 角度を扱う構造体 angle を定義せよ。angle は角度をラジアンとするか度とするかを表す変数 unit、および、角度の値を表す変数 val、を持つ。角度の単位を変更する関数 angle_chunit、角度の足し算をする関数 angle_add、を作成せよ。ここで、angle_chunit は2引数の関数であり、第1引数に angle 型の変数を、第2引数に変更先の角度単位を指定し、第1引数の変数値を変更する。なお、角度単位の表現方法は自由とする。angle_add は2引数の関数であり、計算結果は、malloc によりメモリを確保したところに代入する。また、足される角度と足す角度の単位が異なる場合には、足される側の単位に揃えて計算するものとする。 ⇒ prac0605.c

(c) Masato TOKUHISA, 2003, May. 10