2017-02-09 6 views
0

C++で二次式ソルバーを作成するこの課題を作業していますが、大部分はすべてが得られていると思いますが、 :二次式ソルバーの作成 - スコープ内で宣言されていない変数

main.cppに:54:11:エラー: '' この範囲

で宣言された。しかし、私はequSolver内のすべての変数(のために、このエラーが表示されていなかった)とoutResults()

#include <iostream> 
#include <cmath> 

using namespace std; 

void findCoeff(); 
void equSolver(double a, double b, double c, double d); 
double discr(double a, double b, double c); 
void outResults(double root1, double root2, double a, double b, double c, double d); 

void findCoeff(){ 
     double a; 
     double b; 
     double c; 

     cout << "\nEnter coefficient a:\n"; 
     cin >> a; 
     cout << "\nEnter coefficient b:\n"; 
     cin >> b; 
     cout << "\nEnter coefficient c:\n"; 
     cin >> c; 
} 

double discr(double a, double b, double c){ 

    double d; 
    d = pow(b, 2) - (4 * a * c); 
    return d; 
} 

void equSolver(double a, double b, double c, double d){ 
    double root1 = ((-1 * b) + sqrt(d))/(2 * a); 
    double root2 = ((-1 * b) - sqrt(d))/(2 * a); 

} 

void outResults(double root1, double root2, double a, double b, double c, double d){ 
    if(std::isnan(root1) || std::isnan(root2)){ 
     cout << "Quadratic equation with the following coefficients: \n"; 
     cout << "a: " << a << "; b: " << b << "; c: " << c << "\n"; 
     cout << "has no roots in the real domain\n"; 
    } 
    else { 
     cout << "Quadratic equation with the following coefficients: \n"; 
     cout << "a: " << a << "; b:" << b << "; c:" << "\n"; 
     cout << "has the following roots\n"; 
     cout << "Root1: " << root1 << "; Root2: " << root2 << "\n"; 

    } 
} 

int main(){ 
findCoeff(); 
equSolver(a, b, c, d); 
outResults(root1, root2, a, b, c, d); 
} 

私は、メインまたは変数としてdelcareを試みましたが、 yはすべて0に留まります。プログラムは実行されますが、計算は実際には行われません。

おかげ

+2

あなたが 'equSolver(a、b、c、d);を実行するときに' main'で使うと期待されるのは 'a'、' b'、 'c'と' d'ですか? – NathanOliver

+1

エラーメッセージはかなり明確です。それのどの部分を理解できないのですか? – IInspectable

+0

findCoeff()からの入力です。 プログラムをコンパイルして実行することはできますが、変数が使用されていないときは実行します。 http://imgur.com/uI6DExF – Mathium

答えて

2

あなたは変数がC++で使用されている方法を理解する問題があります。たとえば、あなたの関数

void findCoeff(); 

は、3つのローカルdouble変数を作成しますstd::cinからそれらに値を入力し、それらを破棄します。何らかの理由で、その機能を呼び出すmain()に魔法のように表示されると思われますが、そうではありません。 equSolver()と同じです.2つの値を計算し、2つの変数に格納して破棄します。後でそれらが魔法のようにmain()の中に現れ、次の関数に渡されることを期待します。これはC++ではこのように動作しません。これらの変数をmain()に定義し、何らかの形でそれらに値を格納する関数を作成する必要があります。たとえば、あなたは、参照を使用することができます。その関数は値(のようなdiscr()がない)ことが、原因のトピックは、現時点ではあなたのためにあまりにも高度であることを複数の値を返すの合併症に戻るの

void findCoeff(double &ra, double &rb, double &rc){ 
    cout << "\nEnter coefficient a:\n"; 
    cin >> ra; 
    cout << "\nEnter coefficient b:\n"; 
    cin >> rb; 
    cout << "\nEnter coefficient c:\n"; 
    cin >> rc; 
} 

int main() 
{ 
    double a = 0, b = 0, c = 0; 
    findCoeff(a, b, c); // now findCoeff() would modify a,b, and c through reference and you can use that values 
    double d = discr(a, b, c); 
    ... 
} 

良い方法は次のようになります。

+0

ああ!どうもありがとうございます! これは今、ずっと多くの意味があります。 mainの変数と関数のパラメータで変数を定義する場合、関数内で宣言する必要がありますか? – Mathium

+0

@Mathium np、注意してください、私は参照名を変更しました。私はあなたの名前と 'main()'の変数の名前が無関係であることをあなたに知らせるべきだと思います。 – Slava

+0

@Mathium変数内でローカル変数を宣言すると、この関数が終了するまであなたのケースでは、それを作成する必要はありません。 'main()'内のローカル変数 'a'は' findCoeff() '内のローカル変数' a'と同じではないことを理解しておいてください。 – Slava

0

あなたmain()機能を見てみると:

int main(){ 
    findCoeff(); 
    equSolver(a, b, c, d); 
    outResults(root1, root2, a, b, c, d); 
} 

あなたのプログラムがmain()を入力することによって開始しfindCoeff()を呼び出します。彼らは関数内であるため、ここで

void findCoeff(){ 
     double a; 
     double b; 
     double c; 

     cout << "\nEnter coefficient a:\n"; 
     cin >> a; 
     cout << "\nEnter coefficient b:\n"; 
     cin >> b; 
     cout << "\nEnter coefficient c:\n"; 
     cin >> c; 
} 

ab、および cローカルスコープです。 findCoeff()のみがそれらを見ることができます。ユーザーが ab、および cおよび findCoeff()出口の値を入力すると、これらのローカルスコープ変数は破棄されます。

それではmain()に戻ってみましょう:今、あなたはabcを求め、そしてdている

int main(){ 
    findCoeff(); 
    equSolver(a, b, c, d); 
    outResults(root1, root2, a, b, c, d); 
} 

、のどれもmain()内で宣言されていません。main.cpp:54:11: error: 'a' was not declared in this scope

あなたがabc(およびd)はバックmain()に見えるようにしたい場合は、一つの解決策は、関数のグローバルスコープですなわち外側を入れることです:あなたが得る理由です。

double a; 
double b; 
double c; 
double d; 
void findCoeff(){ 
     cout << "\nEnter coefficient a:\n"; 
     cin >> a; 
     cout << "\nEnter coefficient b:\n"; 
     cin >> b; 
     cout << "\nEnter coefficient c:\n"; 
     cin >> c; 
} 
... 

グローバル変数を使用することは悪いことです。よりよい解決策は、グローバル変数を避けるSlavaの答えです。しかし、それらのコンセプトがあなたの目の前にある場合は、これで十分です。

関連する問題