第13回の課題の解説

構造体の演習 (長方形の面積)
ポインタの演習 (点の回転)

構造体の演習 (長方形の面積)

まず, 構造体を使わずに, これまでの知識だけでプログラムを書くとこんな感じ:
#include <stdio.h> #include <stdlib.h> int main(void){ char line[256]; double x1, y1, x2, y2; double area; gets(line); x1 = atof(line); gets(line); y1 = atof(line); gets(line); x2 = atof(line); gets(line); y2 = atof(line); area = (x2 - x1) * (y1 - y2); printf("%f\n", area); return 0; }
二組の点の座標の大小関係が決まっているので (x2 > x1 かつ y1 > y2) 面積を求めるのは簡単である.

次に, 構造体を使う方法.

#include <stdio.h> #include <stdlib.h> struct rectangle1 { double x1; double y1; double x2; double y2; }; int main(void){ char line[256]; struct rectangle1 rect; double area; gets(line); rect.x1 = atof(line); gets(line); rect.y1 = atof(line); gets(line); rect.x2 = atof(line); gets(line); rect.y2 = atof(line); area = (rect.x2 - rect.x1) * (rect.y1 - rect.y2); printf("%f\n", area); return 0; }

さらに, 面積を求めるのに関数を使ってみる. 関数の定義は

double menseki(struct rectangle1 r) { double result; result = (r.x2 - r.x1) * (r.y1 - r.y2); return result; }
としておいて, mainの中の面積を計算する部分(上のリストの赤色部分)は
area = menseki(rect);
と関数呼び出しに置き換える.

ポインタの演習 (点の回転)

回転の関数の定義は以下のようになる.
void rotate90(struct point *p){ double t; t = p->x; p->x = - p->y; p->y = t; }
(x', y') = (-y, x) という計算をしたいわけだが, そのまま
p->x = - p->y; p->y = p->x
とやってはうまくいかない. (どういう結果になるでしょう) そこで, 作業用の第三の変数 t を使う.

「->」という演算子は, 「構造体のポインタが指している先の構造体の メンバー」を求めるもので, 教科書 P.301 に説明がある. ポインタ参照「*」とメンバ参照「.」を組み合わせてももちろんOKで, 「p->x」は「(*p).x」と等価である.