二組の点の座標の大小関係が決まっているので (x2 > x1 かつ y1 > y2) 面積を求めるのは簡単である.#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; }
次に, 構造体を使う方法.
#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; }
さらに, 面積を求めるのに関数を使ってみる. 関数の定義は
としておいて, mainの中の面積を計算する部分(上のリストの赤色部分)はdouble menseki(struct rectangle1 r) { double result; result = (r.x2 - r.x1) * (r.y1 - r.y2); return result; }
と関数呼び出しに置き換える.area = menseki(rect);
(x', y') = (-y, x) という計算をしたいわけだが, そのままvoid rotate90(struct point *p){ double t; t = p->x; p->x = - p->y; p->y = t; }
とやってはうまくいかない. (どういう結果になるでしょう) そこで, 作業用の第三の変数 t を使う.p->x = - p->y; p->y = p->x
「->」という演算子は, 「構造体のポインタが指している先の構造体の メンバー」を求めるもので, 教科書 P.301 に説明がある. ポインタ参照「*」とメンバ参照「.」を組み合わせてももちろんOKで, 「p->x」は「(*p).x」と等価である.