初歩の質問で恐縮です。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
constructor2016810
記事: 22
登録日時: 7年前

初歩の質問で恐縮です。

#1

投稿記事 by constructor2016810 » 7年前

極、最近 C++の勉強を始めたばかりです。 Windows10 にVisual Studio Express 2015 をインストールし、 あるテキストのプログラムを入力して動作させてみましたが、 エラーがかかり動きません。
どのように修正したらよろしいでしょうか? 尚、 このときに表示されたエラーも記載しておきました。

コード:

#include "stdafx.h"
#include"math.h"

int main()
{
	double	a, b, c, D, x1, x2;


		printf("ax^2+bx+c= 0 の a b cを入力してください>>>");

	scanf_s("%1f %1f %1f, &a, &b, &c, &x1, &x2");
	
	if (a == 0.0)
	{
		if(b==0.0)
		{
		printf("係数がおかしい。\n");
	}
	else
	{
		x1 = -c / b;
		printf("解は、%gです。\n", x1);
	}
    }
	else                          /*判別式でのはんだんいより解の有無を調べる*/
	{
		D = b* b - 4 * a * c;

		if (D >= 0.0)
		{
		x1 = (-b + sqrt(D)) / (2 * a);
		x2 = (-b - sqrt(D)) / (2 * a);
		if (D == 0)
		{
			printf("解は、重解となり%gです。\n", x1);
		}
		else
		{
			printf("解は、%gと%gです。\n", x1, x2);
		}
	}
	else
	{
		printf("虚数解となるため、カイはありません。\n");
	}
}

    return 0;
	}

表示されたエラー
1.  重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
   警告 C4473 'scanf_s': 書式文字列として渡された引数が不足しています Secondary_eq c:\users\user\documents\visual studio 2015\projects\secondary_eq\secondary_eq\secondary_eq.cpp 14
2.  重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
   エラー C4700 初期化されていないローカル変数 'a' が使用されます Secondary_eq c:\users\user\documents\visual studio 2015\projects\secondary_eq\secondary_eq\secondary_eq.cpp 16
3.  重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
   エラー C4700 初期化されていないローカル変数 'b' が使用されます Secondary_eq c:\users\user\documents\visual studio 2015\projects\secondary_eq\secondary_eq\secondary_eq.cpp 18
4.  重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
   エラー C4700 初期化されていないローカル変数 'c' が使用されます Secondary_eq c:\users\user\documents\visual studio 2015\projects\secondary_eq\secondary_eq\secondary_eq.cpp 24

以上、 ご教授よろしくお願い申し上げます。

box
記事: 2002
登録日時: 13年前

Re: 初歩の質問で恐縮です。

#2

投稿記事 by box » 7年前

constructor2016810 さんが書きました:

コード:

	scanf_s("%1f %1f %1f, &a, &b, &c, &x1, &x2");
カッコの中全体を""で囲っているのがまずいと思います。仮にそこを

コード:

    scanf_s("%1f %1f %1f", &a, &b, &c, &x1, &x2);
こんな風に修正したとして、今度は、""で囲った書式文字列の中身で
1f(数字の1とアルファベットのf)となっているところは、本当は
lf(アルファベットのl(エル)とf)ではないでしょうか。さらに、書式文字列では3個の数値を読みたいように書いていますが、
第2引数以降には5個の数値を読みたいように書いています。数が食い違っています。
ていうか、x1とx2は計算で求める値ですから、そもそもscanf_sの対象にはならないはずです。
2次方程式を解くには、
係数a, b, cを読み取って(ここでscanf_s)、
x1, x2を計算する、ということになるはずです。

それから、インデント(字下げ)のやり方がグチャグチャで、
{

}
との対応がわかりづらい箇所が見受けられます。今のうちから正しい(と思われる)やり方を
身に付けておく方がいいと思います。
他のかたがたがどういう字下げをしているか、他のトピック(特にポイント数が多い常連のかた。当方は除く)を参考にしてみてはどうでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 13年前

Re: 初歩の質問で恐縮です。

#3

投稿記事 by box » 7年前

せっかくなので、main関数に何でもかんでも押し込めない版を作ってみました。
なお、当方はVisual Studioを使っていませんので、ヘッダやscanfは標準のものを使っています。

コード:

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

#define OK  (0)
#define NG1 (1)
#define NG2 (2)

void get_coefficient(double *a, double *b, double *c)
{
    printf("2次方程式 ax^2 + bx + c = 0の解を求めます\n");
    printf("係数a, b, cを入力:");
    scanf("%lf%lf%lf", a, b, c);
}

int check_coefficient(double a, double b)
{
    if (a == 0.0) {
        return (b == 0.0) ? NG1 : NG2;
    }
    return OK;
}

double get_answer(double a, double b, double c, double *x1, double *x2)
{
    double D = b * b - 4 * a * c;

    if (D >= 0.0) {
        *x1 = (-b + sqrt(D)) / (2 * a);
        *x2 = (-b - sqrt(D)) / (2 * a);
    }
    return D;
}

void print_answer(double D, double x1, double x2)
{
    if (D > 0.0) {
        printf("答えは%gと%gです\n", x1, x2);
    }
    else if (D == 0.0) {
        printf("答えは重解で、%gです\n", x1);
    }
    else {
        printf("実数の範囲に解はありません\n");
    }
}

void solve(int ret, double a, double b, double c)
{
    double D, x1, x2;

    if (ret == NG1) {
        printf("係数がおかしい\n");
    }
    else if (ret == NG2) {
        printf("1次方程式で、答えは%gです\n", -c / b);
    }
    else {
        D = get_answer(a, b, c, &x1, &x2);
        print_answer(D, x1, x2);
    }
}

int main(void)
{
    double a, b, c;

    get_coefficient(&a, &b, &c);
    solve(check_coefficient(a, b), a, b, c);
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

constructor2016810
記事: 22
登録日時: 7年前

Re: 初歩の質問で恐縮です。

#4

投稿記事 by constructor2016810 » 7年前

box 様

解決のところをクリックするのを忘れてしまいました。
お蔭さまで、 問題は、解決しました。
ありがとうございました。
        constructor2016810

閉鎖

“C言語何でも質問掲示板” へ戻る