プロが教えるわが家の防犯対策術!

プログラミングの問題集に下記のような問題が書かれているのですが、
解答用紙が付いておらず解りません。

点の位置を与えられたとき、原点からの距離rとX軸とのなす角thを計算し、属性値として設定する関数を作成せよ。引数は1つのオブジェクトとし、天の座標も属性値として渡されるとする。
点p1の原点からの距離は1.4,角度は45度であるが実行結果は
1.41421356 0.785398となる。
角度はラジアンを単位として計算、ラジアンは半径1の円の角度に対応する弧の長さである。
180度はπラジアン、90度はπ/2ラジアンである。

問題は2つあり、(お聞きしたいのは二つ目です)
一つ目は角の単位を弧度法から度数法へ変換できるよう修正せよ。p1.thは45度となり、
p2, p3, p4に距離や角度の異なる座標を指定し、演算結果の数値が正しいことを確認できる座標で
確認せよ。という問いがあったので下記のようにしました。

function henkan(p)
{
var w;
p.r = Math.sprt(p.x * p.x + p.y * p.y);
w = Math.acos(p.x / p.r);
p.th = w*180/Math.PI;
}
var p1, p2, p3, p4;
p1 = {x:1, y:1};
p1 = {x:1, y:1.74};
p1 = {x:5.2, y:3};
p1 = {x:0, y:1};
henkan(p1);
henkan(p2);
henkan(p3);
henkan(p4);
print(p1.r, p1.th);
print(p2.r, p2.th);
print(p3.r, p3.th);
print(p4.r, p4.th);

長くなりましたがお聞きしたいのはここからで、次の問いに
「先ほどの問いを行うとある範囲の座標では動作するが別の範囲では誤った角度が表示される。
 この理由を考察し、原点を除くすべての点で正しく動作するよう修正せよ。」
と書かれていたのですが、どこを修正すればいいのか解りません。
即急に解決したいのでお力をお貸しください。

質問者からの補足コメント

  • つらい・・・

    迅速なアドバイスありがとうございます。
    修正箇所が数字なのは理解しました。
    しかし、数学には疎いため、解答することが出来ません。出来れば
    X=○、Y=○;
    とお答えしてもらいたいのです。
    教わる立場がこのような要求をするのは失礼だと思いますが よろしくお願いします。

      補足日時:2015/11/17 10:02
  • 言語は何だろう?と書かれていたので確認ところ、JavaScript言語と書かれていました。
    一つ目の問題に「修正せよ」と書かれていますが、修正前のプログラムはありませんでした。

      補足日時:2015/11/17 13:37

A 回答 (5件)

No.2です。


質問者様は、実際にプログラムを動かして結果を確認していませんよね?
この問題は実際に動かして結果をみないとわかりにくいですよ。


打ち間違いの修正、不足の関数の追加、その他をしています。
---test.html----------------------------------------------
<!DOCTYPE html>
<html>
<head>
<title>テスト</title>
<script type="text/javascript">
function print(){
var s = "";
var i;
for(i = 0; i < arguments.length; i++){
s += arguments[i];
}
s += "<BR>"
document.write(s);
}

function henkan(p){
var w;
p.r = Math.sqrt(p.x * p.x + p.y * p.y);
w = Math.acos(p.x / p.r);
p.th = w*180/Math.PI;
}

var p1, p2, p3, p4;
p1 = {x:1, y:1};
p2 = {x:-1, y:1};
p3 = {x:-1, y:-1};
p4 = {x:1, y:-1};
henkan(p1);
henkan(p2);
henkan(p3);
henkan(p4);
print("P1: r=", p1.r, " th=", p1.th);
print("P2: r=", p2.r, " th=", p2.th);
print("P3: r=", p3.r, " th=", p3.th);
print("P4: r=", p4.r, " th=", p4.th);

</script>
</head>
<body>


</body>
</html>
    • good
    • 0
この回答へのお礼

助かりました

質問文に誤りがあって困惑されたと思います。
それでも丁寧に教えていただきありがとうございました。ご指摘していただいた通り、自分でもプログラムを動かして確かめるべきだと思いました。朝早くからお答えしていただき本当に助かりました。

お礼日時:2015/11/17 18:02

これ, 言語は何だろう. どう見ても C とか C++ とかには見えないんだが.



あと, 問題に違和感がある. 1つ目の問題が「角の単位を弧度法から度数法へ変換できるよう修正せよ」となっているということは, 「修正する『前』」のプログラムがあるってことだよね? その一方で, 2つ目の問題では「『先ほどの問いを行う』とある範囲の座標では動作するが別の範囲では誤った角度が表示される」って書いてある. ここの「先ほどの問いを行う」は 1つ目の「角の単位を弧度法から度数法へ変換できるよう修正せよ」だと思うんだけど, 理論上その修正をするだけで「別の範囲では誤った角度が表示される」ようにはなりえない (もちろんそれ以外に手を加えていれば別の話だ). つまり, ここで問題としている「別の範囲では誤った角度が表示される」という現象は「角の単位を弧度法から度数法へ変換できるよう修正」したからではなく, 「もともとのプログラムが本質的に内包していた」ものじゃないかな.
    • good
    • 0
この回答へのお礼

解決しました

質問文に書く内容が下手だったばかりに困惑されたと思います。それでも無視せず的確にご指摘してくださったおかげで何を書くべきだったか反省することが出来ました。このような質問にお手間をとらせ長文でご指摘いただきありがとうございました。無事解決しました。

お礼日時:2015/11/17 18:14

プログラムではなく数学の問題です。


○ x=0,y=0のとき、rがどうなるか、 x/rがどうなるか、考えてみましょう。
○ 三角関数のグラフをよく思い出してみましょう。
acos は y=cos x のときの、yの値から x を求めるものです。
グラフ上では、 yの値の線を横にひいて、cosカーブとの交点のx座標がacosの値です。
では、 y=0.5の横線をひいたら、xはどうなりますか?
    • good
    • 0
この回答へのお礼

解決しました

朝早くからお答えしていただきありがとうございました。無事解決することが出来ました。

お礼日時:2015/11/17 18:16

第一象限だけでなく、他の象限でも動作確認してみてください。

    • good
    • 0
この回答へのお礼

解決しました

朝早くから的確なお答えしていただきありがとうございました。無事解決しました。

お礼日時:2015/11/17 18:17

三角関数は180度の中だけで通用するものだから、sin,cos,tanそれぞれの範囲を決めて、別の(値-π)に置き換える。

    • good
    • 0
この回答へのお礼

解決しました

質問文に誤りがあったにも関わらず朝早くから的確なお答えしていただきありがとうございました。無事解決致しました。

お礼日時:2015/11/17 18:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!