見出し画像

(答案提出) C言語教室 第15回 - 構造体の基本

「立体空間の座標」と聞くと、「なにそれ、数学の難しい話?」って何故か身構えてしまいます。公式を提示していただいているので、それをC言語で表現する方法を見つければ良いと自分に言い聞かせて、心を落ち着けて取り組むことにします。


課題

立体空間における座標を表す構造体を定義してから、それを使って立体空間の2点を結ぶ直線を表す構造体を定義した上で、適当な座標を設定して、その直線の長さを求めなさい。なお、直線の長さは √((x2-x1)^2+(y2-y1)^2+(z2-z1)^2)で求められる。※^は累乗演算子だと解釈してください。右上に小さく書くやつです。

https://note.com/kazushinakamura/n/nfdf903dd97b1


答案作成上のポイント整理

  • 構造体の設計
    立体空間上の点(x軸、y軸、z軸)の座標で一つの構造体とする。
    2点間の距離を求める課題なので、構造体が2組必要。配列とする。

  • サンプルデータの作成
    検算をしやすいように、0番目の点は原点(0, 0, 0)とする。

  • 数値計算
    ルートの計算方法を調べていたら、ついでに累乗の計算方法サンプルも見つけた。math.hをincludeする必要があるらしい。

答案

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

struct v_position {
  double x;
  double y;
  double z;
};

void main() {
  struct v_position ln[2];
  double length = 0.0;

  for (int i = 0; i < 2; i++) {
    ln[i].x = 1.0 * i;
    ln[i].y = 2.0 * i;
    ln[i].z = 3.0 * i;
  }

  length = sqrt(  pow((ln[1].x - ln[0].x), 2) 
                + pow((ln[1].y - ln[0].y), 2)
                + pow((ln[1].z - ln[0].z), 2)
              );

  for (int i = 0; i < 2; i++) {
    printf("v_position[%d] = (%d, %d, %d)\n", i, ln[i].x, ln[i].y, ln[i].z );
  }

  printf("length of line = %f\n", length);

}


実行結果

v_position[0] = (0, 0, 0)
v_position[1] = (1, 2, 3)
length of line = 3.741657

√( (1 - 0) ˆ 2 + (2 - 0) ˆ 2 + (3 - 0) ˆ 2 )
= √( 1 ˆ 2 + 2 ˆ 2 + 3 ˆ 2 )
= √( 1 + 4 + 9 )
=√( 14 ) 
= 3.741657

、、、あってるっぽい。

後記

今のところ何とか答案を提出できていますが、未だに慣れた感じがしてきません。

今回の課題で当初、構造体の名前をlineとしましたが、「lineが未定義」とエラーが表示されて先に進めません。ひょっとしてネーミングに問題があると考えが至るまで暫し時間がかかってしまいました。

あと分からないのが、なぜstruct節の最後に;が必要なのだろう???
関数の最後だって、for文の最後だって、;は不要ですよね。
kznさんのサンプルコードをじ〜っと見て、やっと気づきました。

C言語初心者は、こんなところでいちいち、壁にぶつかっているのです、、。

これまでの収益は全て、それを必要としておられる方々へ、支援機関を通して寄付させていただきました。この活動は今後も継続したいと思っています。引き続きよろしくお願いいたします。