c - 正確な出力「数学エラー」を取得するにはどうすればよいですか?

okwaves2024-01-25  9

実際、プログラムを実行すると正確な出力「数学エラー」を取得しようとしていますが、実際に何を探しているのか正確にわかりません。

#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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。