プロが教える店舗&オフィスのセキュリティ対策術

C言語についての質問です。


ルートの計算で、sqrt()と書くと思いますが、()の中は、次のような書き方はできますか?

a=1
b=2
c=4
D=b*b-4*a*c;
x=sqrt(-D);

ルートの計算は、マイナスはできないと思いますが、これはプラスですよね?この書き方は、だめだといわれました

A 回答 (6件)

>()の中は、次のような書き方はできますか?


できますよ。コンパイルは正常に終了し、12の平方根が求まります。

>ルートの計算は、マイナスはできないと思いますが、これはプラスですよね?この書き方は、だめだといわれました
Dがマイナスの場合はうまくいきますが、Dがプラスのとき、エラーになるからではないでしょうか。
a=1
b=99
c=4
の場合、期待した結果が得られないから駄目だといっているのではないでしょうか。

Dがマイナスでもプラスでも、かならずプラスにするには、fabsという関数を使います。
x=sqrt(fabos(D));
としてください。
    • good
    • 0

「正しいプログラム」には2つの意味があります。


1つ目は「C言語の文法や規則に違反していない」
2つ目は「目的の処理が正しくできる」


1の意味では、正しいプログラムです。
2の意味で正しいかどうか、は、この断片だけでは判断できません。


変数名や式から「二次方程式の解を求めるプログラム」と予想されます。
この断片からだと「判別式D<0、つまり、実数解を持たない二次方程式だけ解を求められるプログラム」になってしまいます。

おそらく、求められているのは、「どんなa,b,cでも、条件判断して、正しい解を求められるプログラム」ではないでしょうか?
「実数解のみ求める。複素数解の場合は『解無し』と出力する」
なんてプログラムも考えられます。
これらの仕様が「正解のプログラム」であるなら、あなたの「複素数解しか求められないプログラム」は間違い、ということになります。
    • good
    • 1

対応する規格や #include するヘッダ, あるいは D や x の型によっては完全に正しい. つまり, #2 でもいわれているように「この断片だけでは判断できない」といえる.



なにをしたいのか (なぜわざわざこんなまわりくどい書き方をしたのか) はさっぱりわからないけど...

ところで, その「だめだといわれた」というのは, どういう理由で「だめだといわれた」んですか?
    • good
    • 0

何が駄目だったんですか?


こんな断片ではさっぱりわかりませんが
思いつくのは

(1) ; が抜けてる。
(2) a、b、Cが固定で絶対変えない役立たずプログラムならこれでもよいが、
汎用性無さ過ぎ。実数解は無視?
(3)宣言部がないので型がわからん。
(4)math.hのインクルードは?
    • good
    • 0

行間だけを読み、もはやヤマカンですが、


2次方程式の解の公式を題材にした実習と認識しました。
もしそうであったなら

公式内のルートの項をAとした場合
A=sqrt(D) となります。

そして、Dが0以上である時に限り、解xは、以下2つ(もしくは1つ)が存在します。
x=(-b+A)/(2*a)
x=(-b-A)/(2*a)

上記を前提とすれば、
・反転させる必要の無い、Dの符号を反転させている。
・解xは最終的な演算結果として欲しい値なのに、なぜかルートの項になっている。
これらが「だめだ」と言わしめた理由では無いでしょうか。
    • good
    • 0

No.5 の追記です。


「Dが0以上である時に限り」と書きましたが、これが非常に重要な所で、
「Dが0より小さい場合にどうするか?」が、出題者の真意と捉えるべきです。

ではどうするか?
たとえば「解なし」と表示してプログラムを終了させる。
これが一般的な演算という世界で考えて、最も正解に近い回答と思います。
    • good
    • 0

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