C言語関係掲示板

過去ログ

No.568.方程式の解を2次方程式の解の公式を使って計算する

[戻る] [ホームページ]
No.5201

switch文の問題なのですが・・・。
投稿者---みき(2003/02/16 02:05:51)


2次方程式の係数a、b、c(a:2次の係数、b:1次の係数、c:定数項)をキーボードから読み込み、その方程式の解を2次方程式の解の公式を使って計算するプログラムを作りなさい。
解の表示フォーマットは以下の通りとします。

(1) 2個の実数解がある場合(判別式>0)
方程式の解は次の2実数解 =>####,##と####,##
(2) 1個の実数解がある場合(判別式=0)
   方程式の解は次の1実数解 =>####,##
(3) 2個の虚数解がある場合(判別式<0)
   方程式の解は次の2虚数解 =>####,## + ####,##i と ####,## + ####,##i

(データの型はすべてfloat型を使用すること)

2次方程式が分からないうえに、switch文が良く分からないので、まったく分からない状態です(><)誰か教えてください!!m(__)m



No.5203

Re:switch文の問題なのですが・・・。
投稿者---刑事(2003/02/16 03:57:36)


switch文は使えないような気がしますが、if文じゃだめなんですか?
2次方程式の何がわからないんですか?
これじゃあ、他の人に叩かれますよ。

No.5204

Re:switch文の問題なのですが・・・。
投稿者---みき(2003/02/16 05:07:58)


switch文だけを使えとのことです。
if文じゃダメみたいです。
2次方程式とは、ax2 + bx + c = 0、
2次方程式の解の公式とは、x = -b+-ルートb2-4ac/2a
ということは、本で調べたのですが、計算の仕方がいまいち分かりません。


No.5205

Re:switch文の問題なのですが・・・。
投稿者---刑事(2003/02/16 05:33:57)


う〜ん。僕も初心者やし、switchでは書けないな。
switchは確か、比較には使えなかったはず・・・。
とりあえず、2次方程式の使い方から片付けましょうか。
計算の仕方って?そのまま計算するだけじゃないですか?
具体的に、何がわからないんですか?

No.5206

Re:switch文の問題なのですが・・・。
投稿者---shu(2003/02/16 05:39:09)
http://kura.s18.xrea.com/


switch文に関しては、こちらの載っています。

http://www9.plala.or.jp/sgwr-t/c/sec06-5.html

No.5207

Re:switch文の問題なのですが・・・。
投稿者---刑事(2003/02/16 06:04:13)


やはり、この場合は判別式Dの場合分けが比較なので、switch文は使えないということでいいんですか?それとも、使えるんですか?


No.5209

Re:switch文の問題なのですが・・・。
投稿者---TDa(2003/02/16 09:58:28)


>やはり、この場合は判別式Dの場合分けが比較なので、switch文は使えないということでいいんですか?それとも、使えるんですか?

次のようにすればswitchだけで書ける。
でもパズルでしか無いような気が、、、。

    
    switch (D == 0) {
    case 1: 
        /* 判別式が0の時の処理を書く */
        break;
    default:
        switch (D > 0) {
        case 1:
            /*判別式が正の時の処理を書く*/
            break;
        default:
            switch (D < 0) {
            case 1:
                /*判別式が負の時の処理を書く*/
                break;
            default:
                assert(0);
            }
        }
    }
    




No.5211

Re:switch文の問題なのですが・・・。
投稿者---kikk(2003/02/16 14:22:13)


ども。


ifのほうがいいのでしょうが、パズルとして。

・その1
switch ((D>=0.0)+(D==0.0))
で、0(D<0)と1(D>0)と2(D=0)に分ける。

?:演算子がOKなら、

・その2
switch ((int)(D/(D!=0.0?fabs(D):1.0))) /*数学風に正規化*/
で、-1(D<0)と1(D>0)と0(D=0)に分ける。

など、いろいろと。
要は何らかの手段で整数に分類すればいいということです。


では。

p.s.
ループとgotoを(スパゲティ状に)組み合わせれば、
if相当な文がひねりだせますが。。

No.5210

Re:switch文の問題なのですが・・・。
投稿者---stosd(2003/02/16 13:54:31)


平方根にはsqrt、2乗にはpowを使ってください(math.hをインクルードしてください)。
    D = pow(b,2) - 4 * a * c;
    x1 = (-b + sqrt(D)) / (2 * a);
    x2 = (-b - sqrt(D)) / (2 * a);

x2は解と係数の関係を使って、
    x2 = c / (a * x1);

としても良いです。

これは多分学校の課題だと思うのですが、switchに関しては先生の単なる勘違いでなければ恐らく"switchを使えるように工夫せよ"、という出題意図があると思います。
他言語のswitchに近い機能を持つ命令では条件式が使えるものがありますが、Cでは定数の一致、不一致しか判断しませんので、回答者の皆さんが言われているようにswitchをそのまま使うことは難しいでしょう。

No.5209でTDaさんが回答されたものを少し変形してみました。ただ、課題がここまでの内容を求めているとは思えないので、一度先生と相談してみてください。
#define     SGN(X)      (((X) < 0)? -1 : 1)

    switch((D != 0) * SGN(D)){
        case    0:
                ・・・
        case    1:
                ・・・
        case    -1:
                ・・・
    }