課題 [14] 構造体(2/3)

問 2(提出プログラム名:ex1402.c)

まず,このプログラム(ex1402.c)をダウンロードしなさい.

ex1402.c では X-Y 平面上の直線 y = ax + b を表現するために構造体 LINE を定義している.
構造体 LINE では直線の傾きを変数 a,切片を変数 b として表している(ただし,いずれも int 型).
そして,2 本の直線についてそれぞれの傾きと切片を読み込み,2 本の交点の座標を出力させようとしている.

このプログラムの中の関数 print_intersection を次の手順で完成させなさい.
 指定された 2 本の直線が平行かどうかを調べ,
 平行(交わらない)ならば「2 本は平行です⏎」とだけ表示する.
 さもなくば,両者の交点の座標を求めて表示する.
 なお,交点の座標は整数になるとは限らないため,実数で表示させること(小数点以下第2位まで).

【注意】
関数 main の内容は一切書き換えないこと.
例年,2 本の直線が平行かどうかを調べるよりも前に,ひとまず交点の座標を計算させてしまおうといするミスが見られる.そもそも 2 本の直線が平行な場合交点の座標は求まらない(無理やり求めようとすると 0 で割るという式になってしまう)ので,「計算させる」という行為そのものが誤りである.

【ヒント】
2 本の直線が平行ということは傾きが同じということになります.
つまり,まずは 2 直線の交点が存在するかどうかを確認し,存在する(平行でない)場合に交点の座標を求めるというプログラムに仕上げなければなりません.
なお,y = a x + b という形式の方程式で直線が 2 本与えられた場合,両者の交点の座標が何になるかという問題は中学生の数学なので説明は不要かと思いますが, a と b が整数(int 型)であることに注意してください.そのままですと整数と整数の割り算になってしまって小数点以下の切り捨てが起こってしまいます.

  • 【プログラムの実行結果】(その1)赤字は実行時にキーボードから入力する内容
直線 1 の傾きと切片を入力してください:1 2
直線 2 の傾きと切片を入力してください:3 -1
y = 1 x + 2 と y = 3 x - 1 について
交点は (1.50, 3.50) です
  • 【プログラムの実行結果】(その2)赤字は実行時にキーボードから入力する内容
直線 1 の傾きと切片を入力してください:2 2
直線 2 の傾きと切片を入力してください:2 -1
y = 2 x + 2 と y = 2 x - 1 について
2 本は平行です

【過去にあったミス(実際に減点となり,やり直しを命じられた例)】
書き込まれるファイルの内容が上の例と違うきちんと確認していない).
■ 座標を表示させるだけでよいのに,誤って構造体に書き込もうとしている.
 (構造体で管理しているのは直線の傾き a と切片 b であり,座標ではありませんので意味が違います)
注意書きを見落としていて main 関数の中身を書き換えてしまっている.
インデントに不備がある(VSCode 上でインデントを自動で揃える作業をやっていない).


ミスが無いことを確認したら次の問題へ → [ 問3 (ex1403.c) ]