二次方程式を解くプログラムを作ったのですが、ビルドしてデバッグした直後に
○○○(実行ファイル名)の 0x54d2f508 (msvcr100d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 に書き込み中にアクセス違反が発生しました。
と表示され、プログラムがそれ以上動かなくなります。
ソースコード:
#include<stdio.h>
#include<math.h>
double SolveEquation1(double n1, double n2, double n3);
double SolveEquation2(double n1, double n2, double n3);
double SolveEquation3(double n1, double n2, double n3);
double a=0, b=0, c=0;
void main()
{
printf("This program solves quadratic equation.\n");
printf("\nax^2+by+c=0\n");
printf("\nType in a:");
scanf("%lf" , a);
printf("\nType in b:");
scanf("%lf" , b);
printf("\nType in c:");
scanf("%lf" , c);
double disc = 0;
disc = b*b - 4*a*c;
if(0 > disc)
{
printf("\n\nNo real number solution\n");
}
if(disc = 0)
{
printf("\n\nThe answer is %lf.\n" , SolveEquation1(a,b,c));
}
if(a = 0)
{
printf("\n\na cannot be 0.\n");
}
if(0 < disc)
{
printf("\n\nThe answer is %lf and %lf.\n" , SolveEquation2(a,b,c) , SolveEquation3(a,b,c));
}
}
double SolveEquation1(double n1, double n2, double n3)
{
double m = 0, n = 0;
double s = 0;
m = 2*a;
n = -b;
s = n / m;
return s;
}
double SolveEquation2(double n1, double n2, double n3)
{
double m = 0, n = 0, o = 0;
double s = 0;
m = 2*a;
n = -b;
o = sqrt(b*b-4*a*c);
s = (n+o)/m;
return s;
}
double SolveEquation3(double n1, double n2, double n3)
{
double m = 0, n = 0, o = 0;
double s = 0;
m = 2*a;
n = -b;
o = sqrt(b*b-4*a*c);
s = (n-o)/m;
return s;
}
コンパイラ:Microsoft Visual C++ 2010 Express Edition
OS:Windows Vista Business (英語版)
今までに無いようなエラーなので、解決方法が全く分かりません。
よろしくお願い致します。
プログラムが実行できない
Re:プログラムが実行できない
> scanf("%lf" , a);
↑とか
> scanf("%lf" , b);
↑とか
> scanf("%lf" , c);
↑とかが怪しい
↑とか
> scanf("%lf" , b);
↑とか
> scanf("%lf" , c);
↑とかが怪しい
Re:プログラムが実行できない
× void main(){ }
○ int main(){省略 return(0);}
プログラム的には間違ってないけど、c的にはこっちのほうが良い感じ
【アドバイス】
>>たかぎさんが言うとおり、scanf三つとも怪しい
よく見てみると気づくと思う
後、scanfを使う時には
char buf[xxx];
scanf(中身);
gets(buf); //改行ポイ捨て
ってやった方がいいと思う
○ int main(){省略 return(0);}
プログラム的には間違ってないけど、c的にはこっちのほうが良い感じ
【アドバイス】
>>たかぎさんが言うとおり、scanf三つとも怪しい
よく見てみると気づくと思う
後、scanfを使う時には
char buf[xxx];
scanf(中身);
gets(buf); //改行ポイ捨て
ってやった方がいいと思う
Re:プログラムが実行できない
他にもありますね。
>if(disc = 0)
>if(a = 0)
よくあるミスですが比較は==です。これだとdisc,aに0が代入されます。
あと、SolveEquation関数がおかしいです。
関数の引数n1,n2,n3を使わず、a,b,cをグローバル変数にして解いています。
SolveEquation関数ではa,b,cではなく、n1,n2,n3を使ってください。
正しい答えは返ってくると思いますが、修正してください。

>if(disc = 0)
>if(a = 0)
よくあるミスですが比較は==です。これだとdisc,aに0が代入されます。
あと、SolveEquation関数がおかしいです。
関数の引数n1,n2,n3を使わず、a,b,cをグローバル変数にして解いています。
SolveEquation関数ではa,b,cではなく、n1,n2,n3を使ってください。
正しい答えは返ってくると思いますが、修正してください。
