質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.57%

こちらのプログラムの書き方がわかりません。教えてください。

受付中

回答 5

投稿

  • 評価
  • クリップ 1
  • VIEW 891

Kazut0

score 10

こちらのプログラムの書き方がわかりません。教えてください。

整数 a, b, c を引数とし,2次方程式 a x^2 + b x + c = 0 の判別式を計算して戻り値する関数 int discriminant( int a, int b, int c ) を 作成せよ.
さらに,main 関数においてキーボードから a, b, c を受け取り, 「a x^2 + b x + c = 0 の実数解の個数は?個です」のような表示 をするプログラムを作成せよ.ただし,関数 discriminant からの戻り値を用いて実数解の個数を求めること.

a は 0 でないと仮定してよい.

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • dice142

    2018/11/01 11:09

    まずはできるところまで書いてみましょう。また、C#なのかCなのかわからないので不要なタグは外してください。

    キャンセル

  • 退会済みユーザー

    2018/11/02 09:51

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 5

0

https://ja.wikipedia.org/wiki/%E5%88%A4%E5%88%A5%E5%BC%8F
判別式を使えば大丈夫です

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

テストはしていませんがこれでどうでしょうか.
また, わからない部分は適宜調べてください.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>


// 標準入力から数値を取得
int
get_value_from_stdin(char *msg) {
  char buf[256];

  do {
    char *p;

    if(msg != NULL) printf("%s", msg);

    memset((void *)buf, '\0', sizeof(buf));
    fgets((char *)buf, sizeof(buf) - 1, stdin);

    // 改行文字の削除(なくてもいい)
    if((p = strchr(buf, '\r')) != NULL || (p = strchr(buf, '\n')) != NULL) *p = '\0';
  } while(strlen(buf) == 0);

  return (int)strtol((const char *)buf, NULL, 10);
}


// 判定式
int
discriminant(int a, int b, int c) {
  double delta = pow(b, 2.0) - (4.0 * a * c);

  if(delta > 0.0)       return 2;
  else if(delta == 0.0) return 1;

  return 0;
}


int
main(int argc, char *argv[]) {
  int a, b, c;


  a = get_value_from_stdin("a = ");

  if(a == 0) {
    // TODO: エラーメッセージなど.
    return -1;
  }

  b = get_value_from_stdin("b = ");
  c = get_value_from_stdin("c = ");


  printf("a = %d, b = %d, c = %d\n", a, b, c);
  printf("  実数解の個数 = %d\n", discriminant(a, b, c));

  return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

CなのかC#なのかわからなかったので、中間のC++で書きました。(C++17 + boost 1.68.0)

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>

template <typename T> T discriminant(const T &a, const T &b, const T &c)
{
    return b * b - 4 * a * c;
}

int main()
{
    boost::multiprecision::cpp_int a, b, c;
    while (!(std::cin >> a >> b >> c)) {
        std::cin.clear();
        std::cin.ignore();
    }
    auto d = discriminant(a, b, c);
    auto n = d > 0 ? 2 : d == 0 ? 1 : 0;
    std::cout << a << u8" x^2 + " << b << u8" x + " << c
          << u8" = 0 の実数解の個数は " << n << u8" 個です。"
          << std::endl;
    return 0;
}

メモリが許す限り、どんなに大きい数であっても対応しています。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

オーバーフローを考慮すると、単純に

int discriminant( int a, int b, int c )
{
    return b * b - 4 * a * c;
}


では駄目そうですね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

学校の課題ですかね。とりあえずこれで。

#include <stdio.h>

int discriminant(int a, int b, int c){
        return b * b - 4 * a * c;
}


int main(){
        int a, b, c;
        scanf("%d", &a);
        scanf("%d", &b);
        scanf("%d", &c);
        if(discriminant(a,b,c) > 0){
                printf("%dx^2 + %dx + %d = 0 の実数解の個数は2個です\r\n",a,b,c);
        }else if(discriminant(a,b,c) == 0){
                printf("%dx^2 + %dx + %d = 0 の実数解の個数は1個です\r\n",a,b,c);
        }else{
                printf("%dx^2 + %dx + %d = 0 の実数解の個数は0個です\r\n",a,b,c);
        }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る