質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

4回答

1010閲覧

二次方程式の解を求めるプログラムで、実行時に"Segmentation fault"と表示されます。

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2020/05/12 02:10

編集2020/05/13 06:04

#前提・実現したいこと

 二次方程式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+を使用

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

majiponi

2020/05/12 21:30

質問文は修正できます。まだ問題があるようでしたら、修正した結果としてのコードと、どのような問題があるかの記載をお願いいたします。
退会済みユーザー

退会済みユーザー

2020/05/13 06:05 編集

修正しましたが、解がすべてb/a(重解の場合)として計算されてしまいます。
guest

回答4

0

if (!(aa+cc)==0) {

ここ,おかしくないですか.
「0のときはダメ」ということをやりたいなら,それをそのまま素直に書けばよいのでは.


すべて解がb/aとして計算されてしまいます

その処理に入る条件は「yが0なら」となっています.
あなたのコードではyの値は0で初期化されていて,この判定の箇所までそのままですから,常に条件を満たします.

投稿2020/05/13 05:44

編集2020/05/13 06:10
fana

総合スコア11632

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/13 05:58 編集

ご回答ありがとうございます。ご指摘の箇所、訂正しました。
fana

2020/05/13 06:15

一応回答に追記はしときましたが, 1点指摘されたら質問修正して別の問題が発覚して…ってのを「完成」まで繰り返すつもりなんでしょうか? そういうやり方はこの場にふさわしくないと思いますし, それ以前に,「自身で取り組む気が全く無いならば,やらなければいいのに」と感じてしまいます.
退会済みユーザー

退会済みユーザー

2020/05/13 08:23

分かりました。今後は気を付けます。
guest

0

ベストアンサー

(ax - b)^2 + (cx - d)^2=0 を解くのよね?

(ax - b)^2 >= 0, (cx - d)^2 >= 0 だから
左辺が0になるのは (ax - b)^2 = 0, (cx - d)^2 = 0 のとき。
つまり x = b/a かつ x = d/c
b/a != d/c のとき解はない。

投稿2020/05/12 03:04

編集2020/05/12 03:10
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/12 03:33

ご回答ありがとうございます。 ご指摘の通り、計算が誤っていました。修正します。
episteme

2020/05/12 06:16

なんで低評価? なんか間違ったコト言ってる?
退会済みユーザー

退会済みユーザー

2020/05/13 04:42

私はまだ低評価を付ける条件を満たしていないので、そのような評価は付けられません。 episteme様の回答、とても参考になりました。ありがとうございます。
guest

0

気づいた点だけ指摘、代入になっています。

C

1 if (!(a=0)) { // 誤 2 if (!(a==0)) { // 正

投稿2020/05/12 02:44

kaina

総合スコア418

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/12 03:03

ご回答ありがとうございます。 ご指摘の箇所、修正いたしました。
guest

0

scanf("%lf",a);

scanfの引数はアドレスですよ

投稿2020/05/12 02:12

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/05/12 02:24

ご回答ありがとうございます。 該当の部分、修正しました。"Segmentation fault"とは表示されなくなりましたが、aの数値が0以外にも関わらず、正常終了してしまいます。また、入力データの確認の部分の"a=0"を"a==0"と修正しました。
maisumakun

2020/05/12 02:39

> aの数値が0以外にも関わらず、正常終了してしまいます 「2次方程式を解くプログラム」なのに、「2次方程式を入力して正常終了する」のが問題なのですか?
majiponi

2020/05/12 02:48

質問。これ、問題文合ってますか? みた感じ、ad=bcのときに重解b/aを持ち、それ以外は虚数解になるんですが…。判別式も、文字通り問題文を解釈すると、y=-(ad+bc)^2になりますよ?
退会済みユーザー

退会済みユーザー

2020/05/12 03:02

その部分は、解の方程式の分母がもし0であれば正常終了するという記述になっています。"a"というのは、二次方程式a*x^2+b*x+cの解の公式における分母"2*a"を指します。 そこで今間違いに気づいたのですが、入力データの確認の部分は「aの数値」ではなく、「a^2+c^2の値」(f(x)の解の公式における分母)正しいです。説明不足で申し訳ありません。
退会済みユーザー

退会済みユーザー

2020/05/12 03:29

majiponi様 問題文は合っていますが、ご指摘の通り判別式の計算が間違っていました。解も重解と虚数解になりますね。訂正しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問