実際、プログラムを実行すると正確な出力「数学エラー」を取得しようとしていますが、実際に何を探しているのか正確にわかりません。
#include <stdio.h>
#include<math.h>
int
main ()
{
int a,b,c,d,m,n;
float x1,x2;
printf("enter value of integer :");
scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&m,&n);
x1=(m*d-b*n)/(a*d-c-d);
x2=(n*a-m*c)/(a*d-c*d);
if(a*d-c*d==0)
{
printf("Math error");
}
else
{
printf("value of x1=%f\n",x1);
printf("value of x2=%f\n",x2);
}
return 0;
}
1
a*d-c*d==0 となる入力を探しているので、プログラムを実行してその入力を与えるだけです...?あなたが何をしようとしているのか、どのような問題が発生しているのかが不明瞭です。
– underscore_d
2020 年 9 月 3 日 15:33
1
質問を編集し、使用する入力、取得する出力、および期待する出力を指定してください。 x1=(m*d-b*n)/(a*d-c-d); にタイプミスがある可能性があります。 x1=(m*d-b*n)/(a*d-c*d);ということですか?
– ボド
2020 年 9 月 3 日 15:38
------------------------
x1 と x2 を計算する式で分母として使用した後、a*d-c*d==0 かどうかをチェックしているようです。その分割が失点を引き起こした場合ゼロによる時間除算エラー。チェックされる前に、プログラムが他のエラー出力とともにクラッシュする可能性があります。
これを避けるには、x1 と x2 が計算される行の上に if ブロックを置きます。エラーが発生した場合はそれ以上の計算が無効になるため、プログラムを終了する必要があります。もちろん、x1 と x2 を計算する行の下の else ブロックにコードを保持する必要があります。この時点で計算が有効であることが確実にわかっているため、else を削除するだけで済みます。
注: d と c = 0 を選択すると、分母がゼロになることが保証されます (分母は実際には異なります。これはタイプミスだと思いますが、c=0 と d=0 を指定すると、いずれにしても両方とも 0 になります)。
------------------------
a*d-c*d==0 をチェックする前に整数の除算 (n*a-m*c)/(a*d-c*d) を実行しているため、ゼロによる除算を避けて「数学エラー」が発生することはありません。印刷されました。
また、printf にあるのは「数学エラー」です。 M が大きい場合、予期されない「数学エラー」が発生します。小さい m 付き。
これを試してください:
#include <stdio.h>
#include<math.h>
int
main ()
{
int a,b,c,d,m,n;
float x1,x2;
printf("enter value of integer :");
if(scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&m,&n)!=6)
{
printf("input error");
}
else
if(a*d-c*d==0)
{
printf("math error");
}
else
{
x1=(m*d-b*n)/(float)(a*d-c*d);
x2=(n*a-m*c)/(float)(a*d-c*d);
printf("value of x1=%f\n",x1);
printf("value of x2=%f\n",x2);
}
return 0;
}
修正した点:
入力が成功したかどうかのチェックを追加しました。
a*d-c*d==0 チェックの後に分割を移動しました。
「数学エラー」というメッセージを修正しました。
あなたが望んでいることだと思うので、a*d-c-d を a*d-c*d に変更しました。
望ましくない切り捨てを避けるために、float へのキャストを追加しました。
1
1
プログラムをより明確にするために、2 番目の if/else を中括弧で囲み、else 分岐でインデントを使用することをお勧めします。
– ボド
2020 年 9 月 3 日 15:41