ページ 11

無題

Posted: 2010年8月27日(金) 10:29
by
マイクロソフトのビジュアルC++を使っています。二次関数をとくプログラムを作ったのですが、実行ウィンドウがまたすぐに消えます。原因が分かりません、誰か教えてください。いかにソースを書きます。

#include <stdio.h>
#include <math.h>
int main ()
{
int a,b,c,x1,x2;
double d;
printf ("A=");
scanf ("%d",&a);
printf ("B=");
scanf ("%d",&b);
printf ("c=");
scanf ("%d",&c);
d=b*b-4*a*c;
if (d<0){
printf ("虚数解");
}
d=sqrt(d);
x1=(-b+d)/(2*a);
x2=(-b-d)/(2*a);
if (x1<0&&x2<0){
printf ("(x%d)(x%d)",x1,x2);
}
if (x1<0&&x2>0){
printf ("(x%d)(x+%d)",x1,x2);
}
if (x1>0&&x2<0){
printf ("(x+%d)(x%d)");
}
if (x1>0&&x2>0){
printf ("(x+%d)(x+%d)");
}
getchar();
return (0);
}

よろしくお願いします。

Re:無題

Posted: 2010年8月27日(金) 10:41
by fatens
scanf ("%d",&c);
で数値を入力したときにバッファに改行文字が残り、
getchar();
でその改行文字を読み込んでしまうため、入力待ちが起こらずに終了してしまいます。

scanf ("%d",&c);  →  scanf ("%d%*c",&c);
のようにして、改行文字を読み捨ててしまうのはどうでしょうか。

Re:無題

Posted: 2010年8月27日(金) 10:41
by バグ
一番可能性が高そうなのが、虚数解の際に終了させてないのが原因っぽいなぁ…と思ったり。
というのも、sqrt関数は実引数を負数にしちゃうとまずかったような気がするんですよね。

Re:無題

Posted: 2010年8月27日(金) 10:50
by
回答ありがとうございます。無事解決しました。
<バグさん
   忘れてました。エラー帰ってくる前に気づかせてくれてありがとうございます
<fatensさん
   どうもそれが原因だったようです。そのソースの意味がいまいち良く分かりませんが、解決しました。
   ありがとうございました

Re:無題

Posted: 2010年8月27日(金) 10:57
by fatens
>そのソースの意味がいまいち良く分かりませんが、解決しました。

http://ja.wikipedia.org/wiki/Scanf
「1.2 代入抑止」、「4.1 改行文字の取り扱い」その他、参考になるかと思います。
画像

Re:無題

Posted: 2010年8月28日(土) 01:24
by box
> 二次関数をとく

関数を解く、とは普通いわないと思います。
ソースの内容から推して、「二次方程式を解く」という方が正しいと思います。

> int a,b,c,x1,x2;

x1とx2がint型である理由がわかりません。

> printf ("(x+%d)(x%d)");
> printf ("(x+%d)(x+%d)");

この書式文字列で、何を出力したかったのでしょうか。
また、x1またはx2がゼロの場合を考慮しなくてよいのでしょうか。

Re:無題

Posted: 2010年8月28日(土) 02:19
by フリオ
 
 ひょっとして、
"因数分解"をしたかったのでしょうか? 

Re:無題

Posted: 2010年8月28日(土) 15:17
by
すいません、したかったのは”因数分解”です。
>ハッカーさん
    x1かx2がゼロの場合は正直想定してませんでした。ちょっと考えてみます。
    気付かせてくれてありがとうございます。
    また、
       printf ("(x+%d)(x%d)");
       printf ("(x+%d)(x+%d)");
    は(x+a)(x-b) のような形で出力させたかったのでそんな風に作りました。ただ、その形だと上手く    いかないことがその後分かったので変更してます。以下に変更後のスクリプトを載せます。また何か
    あったらいろいろ書き込みしてください。


#include <stdio.h>
#include <math.h>
int main ()
{
double a,b,c,x1,x2,hantei;
double d;
printf ("A=");
scanf ("%lf",&a);
printf ("B=");
scanf ("%lf",&b);
printf ("c=");
scanf ("%lf%*c",&c);
d=b*b-4*a*c;
if (d<0)
{
b=b*b;
a=2*a;
d=-d;
printf ("%lf±√%lfi/%lf\n",b,d,a);
printf ("計算続行?Y=1 N=2\n");
scanf ("%lf",&hantei);
if (hantei==1)
{
d=sqrt(d);
x1=b/a;
x2=d/a;
printf ("x=%lf±%lfi\n",x1,x2);
}
getchar();
getchar();
return (0);
}
d=sqrt(d);
x1=(-b+d)/(2*a);
x2=(-b-d)/(2*a);
printf ("%lf,%lf\n",x1,x2);
x1=x1*-1;
x2=x2*-1;
if (x1<0&&x2<0){
x1=x1*-1;
x2=x2*-1;
printf ("(x%lf)(x%lf)\n",x1,x2);
}
if (x1<0&&x2>0){
printf ("(x%lf)(x+%lf)\n",x1,x2);
}
if (x1>0&&x2<0){
printf ("(x+%lf)(x%lf)\n",x1,x2);
}
if (x1>0&&x2>0){
printf ("(x+%lf)(x+%lf)\n",x1,x2);
}
getchar();
return (0);
}