任意の二次方程式(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件)
- 最新から表示
- 回答順に表示
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;
}
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』でしょうが…。
これは別に間違っていないような。
No.2
- 回答日時:
コンパイルエラーはNo.1さんの通りですね
他の問題点ですがmain関数でreturn 0で終了してしまうのでそのあとにprintfしても意味がないです。
関数の引数は5個という指示ですがsolve関数には2個の引数しかありません
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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 二分法 プログラム
-
C言語を実行すると-infが出てき...
-
C言語の型による処理速度の違い
-
プログラムでの数字につく”f”の...
-
(C言語)ニュートン法のプログ...
-
C++で外積
-
指数の表示
-
C言語プログラム(二分法)につい...
-
ある線が円の範囲に入っている...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
関数のプログラム
-
プログラミングについての質問
-
c言語で、繰り返し文の中で、0....
-
C言語でのFFT(構造体とポインタ...
-
プロトタイプ宣言の説明
-
シンプソン公式の数値計算
-
ルンゲクッタ法によるマクスウ...
-
long doubleの表示方法
-
MATLABで画像のヒストグラムを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C 開放してるのにエラー(doubl...
-
関数におけるif文とreturn文に...
-
至急です! マクロ定義で #defi...
-
C言語 関数プロトタイプ宣言の...
-
浮動小数点の定数
-
int とdoubleの比較
-
C言語の型による処理速度の違い
-
c言語のコンパイルエラー canno...
-
doubleは常に%lfとするべきなのか
-
difftime()について
-
C言語初心者 構造体 課題について
-
C言語でintをdoubleに
-
listに構造体を格納
-
たくさんの数の平均を求める方...
-
(C,C++言語)関数の引数は自動キ...
おすすめ情報