重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

2次方程式 ax^2+bx+c=0(a≠0) の根をもとめるプログラミングを作成する際に、数値がおかしくなってしまいました。
計算の過程を出力していった結果、おそらく序盤のscanfから間違っていることがわかりましたが、どう間違っているのかがわかりません。
対策を教えていただけませんか?

#include<stdio.h>
#include<math.h>
void main(void){
double a,b,c,d,e,f;
printf("a,b,c=");
scanf("%d,%d,%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
d=(b*b)-(4*a*c);
e=(-b+sqrt(d))/a;
f=(-b-sqrt(d))/a;
if(d>0)
printf("x=%6.3f,%6.3f\n",e,f);
else if(d==0)
printf("x=%6.3f\n",e);
else
printf("no solution\n");
}

a,b,c=のところに何の数値を入れても
3,-1315373568,64
x= 0.000
と表示されてしまいます。

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

  • 回答ありがとうございました。
    %dの部分を%fにしたのですが、何の実数を入力しても実数は全て0.000になってしまい、x=-0.000にしかなりませんでした。
    int変数で入力した後で型変換をするやり方も試しましたが、これも同じでした。
    自分でもミスを探してみたのですが見つからず、力不足で申し訳ありません。

    修正後の5~7行目です。
    printf("a,b,c=");
    scanf("%6.3f,%6.3f,%6.3f",&a,&b,&c);
    printf("%6.3f,%6.3f,%6.3f\n",a,b,c);

      補足日時:2015/07/23 14:20

A 回答 (5件)

>int変数で入力した後で型変換をするやり方も試しましたが、これも同じでした。


ちゃんと、1,2,3「リターン」のように、数をカンマで区切って入力しましたか?
scanf("%d,%d,%d",&ia,&ib,&ic);
であれば、「カンマで区切って数値を入力する」という意味になっています。
書式とおり1,2,3「リターン」と入力すれば、ia,ib,icにそれぞれ 1,2,3が代入されるはずですが・・

<おまけ>
scanf("%d %d %d",&ia,&ib,&ic);
であれば、カンマではなく「スペースで区切って数値を入力する」という意味になりますので、1 2 3「リターン」と入力することになります。
    • good
    • 0

#1 のリピート:


double型の時に"%f"でしたか?
    • good
    • 1

最近、関連する回答をしたので。


https://oshiete.goo.ne.jp/qa/9016082.html

scanf でも同様のことが行なわれています。
「%d は数値」と覚えるのではなく「%dはintに対応」と型とセットで覚えましょう。

また、 %dは整数なので、 1.5 と言った小数点が入ると読み込めません。
scanfの戻り値は確認するようにしましょう。
    • good
    • 1

>対策を教えていただけませんか?


double a,b,c,d,e,f;
int ia,ib,ic;
のように同名のint変数を定義して
scanf("%d,%d,%d",&ia,&ib,&ic);
でいったんInt変数で入力を受け付けて、
a=ia; b=ib; c=ic;
でdouble型に型変換して代入するのではどうですか?

あと気になったのは、
else if(d==0)
とありますが、変数dの型はdouble型ですよね。
int型は誤差はありませんが、double型は、浮動小数点表現ですので、基本、近似計算です。ですから == 0 になるのは運がいいときだけですよ。
    • good
    • 0

>double a,b,c,d,e,f;


>scanf("%d,%d,%d",&a,&b,&c);
>printf("%d,%d,%d\n",a,b,c);

double型の時に"%d"でしたか?
    • good
    • 1

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