• 締切済み

二次関数で

任意の二次方程式(ax^2+bx+c=0)を解くプログラムを作るのですが、以下の条件を満たした方法で作るというものです。 1、関数の引数は、3つの係数と、解の入る変数二つとする。 (計5つの引数をとる。) いずれかの引数がアドレス渡し(ポインタ)になる。 2、解は関数呼出の時に指定した2つの変数にそれぞれ代入されること。 3、解の表示は関数側ではなく呼出側で行うこと。 4、グローバル変数は使用しない。 一応作ってみたのですがコンパイルすらできません。 初心者なので全くわかりません教えてください。 #include<stdio.h> #include<math.h> void solve(double *x, double *y); int main(void) { double x,y; solve(&x,&y); return 0; printf("x=%f\n", x); printf("y=%f\n", y); } void solve(double *x, double *y) { doble a,b,c; puts("二次方程式 a*x^2+b*x+c=0 を解きます"); puts("係数a, b, cを入力してください"); printf("a="), scanf("%lf", a); printf("b="), scanf("%lf", b); printf("c="), scanf("%lf", c); putchar('\n'); double d = b * b - 4 * a * c; if(d >= 0){ x = (-b + sqrt(d)) / (2 * a); y = (-b - sqrt(d)) / (2 * a); } else puts("虚数解"); }

みんなの回答

回答No.4

  #include <stdio.h> #include <math.h> typedef struct quadratic{ int a; int b; int c; double x0; double x1; } QUAD; int SolveQuad(QUAD *quad) { int d = (quad->b) * (quad->b) - 4 * (quad->a) * (quad->c); if(!(quad->a)){ if(quad->b){ quad->x0 = quad->x1 = -(quad->c) / (quad->b); return 0; } else return -2; } if(d < 0) return -1; if(d == 0){ quad->x0 = quad->x1 = -(quad->b) / 2 / (quad->a); return 0; } quad->x0 = (-(quad->b) + sqrt(d)) / 2 / (quad->a); quad->x1 = (-(quad->b) - sqrt(d)) / 2 / (quad->a); return 1; } int main(void) { QUAD quad; if(scanf("%d %d %d", &(quad.a), &(quad.b), &(quad.c)) != 3){ puts("入力エラー"); return 1; } switch(SolveQuad(&quad)){ case -2: puts("?"); break; case -1: puts("虚数解"); break; case 0: printf("x = %f\n", quad.x0); break; case 1: printf("x = %f, %f\n", quad.x0, quad.x1); break; } return 0; }  

  • Werner
  • ベストアンサー率53% (395/735)
回答No.3

Errorの原因 ・doubleがdobleになっている。(スペルミス) ・double dが途中で宣言されている。これは、関数の最初で宣言しなければならない。 ・solve内のxとyに*がついていない。(ANo.1の指摘1) Warningの原因 ・scanfの引数がポインタになっていない。(ANo.1の指摘2) この問題の出題意図としては、 a,b,cは関数solveの呼び出し前に準備しておき 関数solveは純粋に方程式を解くだけという気がします。 後は、戻り値で虚数解かどうか判別できるようにしておいた方がよさそう。 int solve(double a, double b, double c, double *x, double *y); > ★指摘3 > ・double d = b * b - 4 * a * c; の『a * c』は『a + c』でしょうが…。 これは別に間違っていないような。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

コンパイルエラーはNo.1さんの通りですね 他の問題点ですがmain関数でreturn 0で終了してしまうのでそのあとにprintfしても意味がないです。 関数の引数は5個という指示ですがsolve関数には2個の引数しかありません

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

★指摘1 ・scanf( "%lf", a ); の『a』は『&a』とアドレスで指定します。 ・同様に『b』、『c』も『&b』、『&c』と指定します。 ★指摘2 ・x = (-b + sqrt(d)) / (2 * a); の部分は『*x = 』と『*』をつけますよ。 ・同様に『y』も『*y = 』とします。 ★指摘3 ・double d = b * b - 4 * a * c; の『a * c』は『a + c』でしょうが…。 補足: ・『printf("a="), 』は『printf("a="); 』という、カンマ文字でもOKですよ。 ・最後に、アルゴリズムが正しいかどうかはチェックしていません。 ・上記の指摘1~3を直せば、コンパイルは可能ですよ。

関連するQ&A