2017-11-28 18 views
1

私の問題は、なぜ私は配列の乱数の望ましい合計を得ることができないのですか?誰も私がエラーを理解するのを助けることができますか?クラス再帰配列

#include <iostream> 
using namespace std; 
class Recursion{ 
    int max_size; 
    double sum; 
    int index; 
    double* arr; 
public: 
    Recursion(int); 
    void fill_array(); 
    void sum_array(); 
}; 
Recursion::Recursion(int size){//from main 
    max_size = size; 
    sum = 0; 
    index = 0; 
    arr = new double[max_size]; 
} 
void Recursion::fill_array(){ 
    if (index == max_size){ 
     cout << "Array is Full." << endl; 
     //stop array 
    } 
    else{ 
     arr[index] = rand() % 10+1; 
     cout << arr[index] << endl; 
     index++; 
     fill_array(); 
    } 
} 
void Recursion::sum_array(){ 
    if (index == max_size){ 
     cout << "Sum is: "<< sum << "!"<< endl; 
    } 
    else{ 
     sum = sum + arr[index]; 
     index++; 
     sum_array(); 
    } 
} 
int main(){ 
    Recursion connect(5); 
    connect.fill_array(); 
    connect.sum_array(); 
    return 0; 
} 

出力は次のとおりfill_array後

8 
10 
4 
9 
1 
Array is Full. 
Sum is: 0! 

答えて

1

connect.fill_array(); 

indexmax_sizeに等しいです。

if (index == max_size){ 
     cout << "Array is Full." << endl; 
     index =0; 
     //stop array 
    } 

今出力は次のとおりです:

4 
7 
8 
6 
4 
Array is Full. 
Sum is: 29! 

あなたはこのように、(それは他の機能のために利用できるようにするため)配列を充填完了したら、あなたは0、それを再初期化したいです

個人的な意見:

二つの機能の間でそれを共有するために、インデックスクラスのデータmemebr作るが、共有の必要なしに、(私はそれは1がintermediatに現在の値を使用することはありません意味あなたがすでに経験しているように、奇妙で、間違いにつながる可能性があります。

インデックス、つまり配列をループするカウンタは、その時点で配列をループする関数にローカルスコープを設定する必要があります。そのため、クラスのindexをデータメンバーとして破棄し、関数内のパラメータ。さらに、配列の先頭からループしたいので、そのパラメータのデフォルト値をprodiveすることができます。一緒にすべてを置く

は、我々が得る:

#include <iostream> 
using namespace std; 
class Recursion{ 
    int max_size; 
    double sum; 
    double* arr; 
public: 
    Recursion(int); 
    void fill_array(int index); 
    void sum_array(int index); 
}; 
Recursion::Recursion(int size){//from main 
    max_size = size; 
    sum = 0; 
    arr = new double[max_size]; 
} 
void Recursion::fill_array(int index = 0){ 
    if (index == max_size){ 
     cout << "Array is Full." << endl; 
     //stop array 
    } 
    else{ 
     arr[index] = rand() % 10+1; 
     cout << arr[index] << endl; 
     index++; 
     fill_array(index); 
    } 
} 
void Recursion::sum_array(int index = 0){ 
    if (index == max_size){ 
     cout << "Sum is: "<< sum << "!"<< endl; 
    } 
    else{ 
     sum = sum + arr[index]; 
     index++; 
     sum_array(index); 
    } 
} 
int main(){ 
    Recursion connect(5); 
    connect.fill_array(); 
    connect.sum_array(); 
    return 0; 
} 

を最終印刷物における!は私を少し怖がって、あなたはそれが混乱かもしれないので、(例えばドットと交換)、それを削除したい場合があることユーザー、階乗

0

()インデックスはMAX_SIZEするように設定されています。

1

sum_arrayのインデックスをmax_sizeと呼ぶときは、fill_arrayの方法でクリアする必要があります。この呼び出しの後

void Recursion::fill_array(){ 
if (index == max_size){ 
    cout << "Array is Full." << endl; 
    //stop array 
    index = 0; 
} 
2

indexのような変数は通常、パラメータとして渡されます。..再帰のためのオブジェクトフィールドを使用するのが最も珍しいです:

double Recursion::sum_array(int index) { 
    if (index >= max_size) { 
     return 0; 
    } else { 
     return arr[index] + sum_array(index + 1); 
    } 
} 

int main() { 
    // ... 
    cout << "Sum is: "<< sum_array(0) << "!"<< endl; 
    // ... 
} 

そうでない場合は、他の回答が言うように、あなたの元のコードでは、あなたがインデックスをリセットするのを忘れて(それは、クラスに格納されているのが奇妙な理由です)。