2次関数を構造体を用いて...

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sakl
記事: 1
登録日時: 6ヶ月前

2次関数を構造体を用いて...

#1

投稿記事 by sakl » 6ヶ月前

構造体を用いて2次関数の答えを出すことはできたのですが
条件で”二次方程式a*x*x + b*x + c = 0の係数a,b,cをscanf_sで入力させ,構造体に格納する.また,入力に成功した場合は1,エラーなどで失敗した場合は0を返す”という条件がよくわかりません。どのようにしたらいいのか教えてください。

コード:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>

typedef struct {
	double a, b, c; //二次方程式の係数a, b, c
	double x1, x2; //実数解(x1 > x2とする.重解の場合は,x1とx2は同値)
	double re, im; //虚数解の場合の,実数部:reと虚数部:im.
	double D; //判別式の結果
} Answer;



double Solve(Answer  *pAns);
int Input(Answer  *pAns);
void Display(Answer *pAns);

double Solve(Answer  *pAns)
{
	double D;
	D = (pAns->b* pAns->b - 4 * pAns->a*pAns->c);

	pAns->x1 = (-pAns->b + sqrt(D)) / (2 * pAns->a);
	pAns->x2 = (-pAns->b - sqrt(D)) / (2 * pAns->a);

	pAns->re = (pAns->b) / (2 * pAns->a);
	pAns->im = (sqrt(-D)) / (2 * pAns->a);

	return D;
}

int Input(Answer  *pAns)
{
	//abcの入力
	printf("二次方程式の係数a:"); scanf_s("%lf", &pAns->a);
	printf("二次方程式の係数b:"); scanf_s("%lf", &pAns->b);
	printf("二次方程式の係数c:"); scanf_s("%lf", &pAns->c);

	return 1;

}

void Display(Answer *pAns)
{
	double D;
	Answer z;

	D = Solve(&z);
	if (D > 0)
	{
		printf("その解は%gと%gです\n", pAns->x1, pAns->x2);//異なる二つの実数解
	}
	else if (D < 0) {
		printf("その解は%g+%giと%g-%giです\n", pAns->re, pAns->im, pAns->re, pAns->im);//虚数解
	}
	else {
		printf("その解は%gのみです\n", pAns->x1);//重解
	}
}

int main()
{
	double D;
	Answer z;

	Input(&z);
	
	D = Solve(&z);

	puts("\n二次方程式");
	printf("%gx*x  %+g*x + %g = 0\n", z.a, z.b, z.c);
	puts("を解きます。\n");
	
	Display( &z);
	
	return 0;
}

 

アバター
もるも
記事: 52
登録日時: 3年前
連絡を取る:

Re: 2次関数を構造体を用いて...

#2

投稿記事 by もるも » 6ヶ月前

入力に失敗したという条件はa,b,cに数字以外が入力されてしまった場合だとおもいます。

かずま

Re: 2次関数を構造体を用いて...

#3

投稿記事 by かずま » 6ヶ月前

sakl さんが書きました:
6ヶ月前
構造体を用いて2次関数の答えを出すことはできたのですが
2次関数の答えとは何ですか?
2次関数と2次方程式は違いますよね。
できたプログラムと実行例を提示してください。
sakl さんが書きました:
6ヶ月前
条件で”二次方程式a*x*x + b*x + c = 0の係数a,b,cをscanf_sで入力させ,構造体に格納する.また,入力に成功した場合は1,エラーなどで失敗した場合は0を返す”という条件がよくわかりません。どのようにしたらいいのか教えてください。
入力エラーは、scanf_s が 1 を返すかどうかを見ればよいでしょう。

Solve の中で、(x1, x2) と (re, im) の両方を求めていますが
D が負かそうでないかで、どちらか一方でよいのではありませんか?
D を Answer構造体の中に入れておかないとあとで困りますよ。

Display は既に求まっている解を表示するものなのに
中で Solve を呼び出すのはなぜですか?
しかも、未初期化の z のアドレスを渡していますから、
a, b, c は不定で解も D も正しく求まりません。

次のコードを参考に、自分の書き方にしたプログラムを提示してください。

コード:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <math.h>

typedef struct {
	double a, b, c; //二次方程式の係数a, b, c
	double x1, x2; //実数解(x1 > x2とする.重解の場合は,x1とx2は同値)
	double re, im; //虚数解の場合の,実数部:reと虚数部:im.
	double D; //判別式の結果
} Answer;

double Solve(Answer  *pAns)
{
	pAns->D = pAns->b* pAns->b - 4 * pAns->a*pAns->c;

	if (pAns->D >= 0) {
		pAns->x1 = (-pAns->b + sqrt(pAns->D)) / (2 * pAns->a);
		pAns->x2 = (-pAns->b - sqrt(pAns->D)) / (2 * pAns->a);
	}
	else {
		pAns->re = (pAns->b) / (2 * pAns->a);
		pAns->im = (sqrt(-pAns->D)) / (2 * pAns->a);
	}
	return pAns->D;
}

int Input(Answer  *pAns)
{
	printf("二次方程式の係数a:");
	if (scanf_s("%lf", &pAns->a) != 1) return 0;
	printf("二次方程式の係数b:");
	if (scanf_s("%lf", &pAns->b) != 1) return 0;
	printf("二次方程式の係数c:");
	if (scanf_s("%lf", &pAns->c) != 1) return 0;
	return 1;
}

void Display(Answer *pAns)
{
	if (pAns->D > 0)  // 異なる二つの実数解
		printf("その解は %g と %g です\n", pAns->x1, pAns->x2);
	else if (pAns->D < 0)  // 虚数解
		printf("その解は %g+%gi と %g-%gi です\n",
				pAns->re, pAns->im, pAns->re, pAns->im);
	else  // 重解
		printf("その解は %g のみです\n", pAns->x1);
}

int main(void)
{
	Answer z;

	if (Input(&z) == 0) { puts("入力エラー"); return 1; }
	Solve(&z);
	printf("\n二次方程式\n" "%gx*x %+g*x %+g = 0\n" "を解きます。\n",
			z.a, z.b, z.c);
	Display(&z);
	return 0;
}
分からないところは質問してください。

返信

“C言語何でも質問掲示板” へ戻る