アプリ版:「スタンプのみでお礼する」機能のリリースについて

任意の二次方程式(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("虚数解");

}

A 回答 (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;
}
 
    • good
    • 0

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』でしょうが…。
これは別に間違っていないような。
    • good
    • 0

コンパイルエラーはNo.1さんの通りですね



他の問題点ですがmain関数でreturn 0で終了してしまうのでそのあとにprintfしても意味がないです。
関数の引数は5個という指示ですがsolve関数には2個の引数しかありません
    • good
    • 0

★指摘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を直せば、コンパイルは可能ですよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!