#前提・実現したいこと
二次方程式f(x)=(ax - b)^2 + (cx - d)^2=0の解xを解の公式を用いて、求めるプログラムを記述しています。条件は以下の通りです。
・引数yの平方根を出力するmysqrt関数を定義すること
⇒関数頭部をdouble mysqrt(double y)とする
⇒結果に至るまで、計算途中結果と反復回数を表示すること
⇒反復回数が1000回を超えないこと
・<math.h>をインクルードしないこと(sqrt等使用しない)
・a=0の場合には、メッセージを表示し、正常終了すること
⇒<stdlib.h>で定義される標準ライブラリ関数exitを使用すること
・判別式の評価を行い、分岐処理により場合分けを行うこと
⇒D<0,D=0,D<0
##発生している問題・エラーメッセージ
虚数解の場合が表示されません。すべて解がb/aとして計算されてしまいます。
###該当のソースコード
c
1//修正済み 2 3#include <stdio.h> 4#include <stdlib.h> 5 6 7//解の公式の√(判別式)の部分の処理を行う関数 8 9double mysqrt(double y){ 10 11 double a,b,c,d; 12 13 int count=0; //反復回数 14 15 printf(" %21.16g(反復回数%d 回)¥n", y, count); 16 17 while(count < 1000) { 18 count++; 19 y = -(a*d + b*c)*(a*d + b*c); //判別式 20 21 printf(" %21.16g(反復回数%d 回)¥n", y, count); 22 23 } 24 25 //値の更新 26 y = -(a*d + b*c)*(a*d + b*c); 27 28 return y; 29} 30 31int main(){ 32 33 double a=0,b=0,c=0,d=0; 34 35 double num1=0,num2=0; //解 36 double real=0, image=0; //複素数を含む場合 37 38 double y=0; //判別式 39 40 printf("係数を入力せよ\n"); 41 42 scanf("%lf",&a); 43 scanf("%lf",&b); 44 scanf("%lf",&c); 45 scanf("%lf",&d); 46 47 48 //入力データの確認 49 if ((a*a+c*c)==0) { 50 printf("解の公式の分母は0以外の数にしてください¥n"); 51 exit(EXIT_SUCCESS); 52 } 53 54 55 if(y==0){ 56 num1 = num2 = b/a; //重解を持つ場合 57 58 printf("解: x=%.2f, %.2f\n",num1,num2); 59 60 }else{ //虚数解をもつ場合 61 real = (a*b+c*d)/(a*a+c*c); 62 image = mysqrt(y)/(a*a+c*c); 63 64 printf("解: %.2f+%.2fi, %.2f-%.2fi\n",real,image); 65 } 66 return 0; 67}
試したこと
・判別式Dをyとし、その中身をある程度整理した形にした
・全ての変数を初期化
・解を求めるif文の箇所を訂正
補足情報(FW/ツールのバージョンなど)
Raspberry Pi 3A+を使用
回答4件
あなたの回答
tips
プレビュー