#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;
}
分からないところは質問してください。
[quote=sakl post_id=152553 time=1547701377 user_id=2815]
構造体を用いて2次関数の答えを出すことはできたのですが
[/quote]
2次関数の答えとは何ですか?
2次関数と2次方程式は違いますよね。
できたプログラムと実行例を提示してください。
[quote=sakl post_id=152553 time=1547701377 user_id=2815]
条件で”二次方程式a*x*x + b*x + c = 0の係数a,b,cをscanf_sで入力させ,構造体に格納する.また,入力に成功した場合は1,エラーなどで失敗した場合は0を返す”という条件がよくわかりません。どのようにしたらいいのか教えてください。
[/quote]
入力エラーは、scanf_s が 1 を返すかどうかを見ればよいでしょう。
Solve の中で、(x1, x2) と (re, im) の両方を求めていますが
D が負かそうでないかで、どちらか一方でよいのではありませんか?
D を Answer構造体の中に入れておかないとあとで困りますよ。
Display は既に求まっている解を表示するものなのに
中で Solve を呼び出すのはなぜですか?
しかも、未初期化の z のアドレスを渡していますから、
a, b, c は不定で解も D も正しく求まりません。
次のコードを参考に、自分の書き方にしたプログラムを提示してください。
[code]
#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;
}
[/code]
分からないところは質問してください。