2012-03-21 9 views
0

私は与えられた最も低い入力を見つけなければなりません。 averageScore機能では、アレイから最も低いスコアを見つけるのに少し問題があります。私は出力として非常に奇妙な数字を得ています。これをどのように調整するかについてのご意見をいただければ幸いです。前もって感謝します。配列から最低の入力を削除しますか?

私はあなたがこの行を変更したいと思います
#include <iostream> 
#include <cstdlib> 
using namespace std; 

//function prototypes 
double* allocate(int&); 
double averageScore(int&); 

int main() 
{ 
    double* testArray; 
     int numOfScores; 
    double average; 

    testArray = allocate(numOfScores); 
    average = averageScore(numOfScores); 

    //delete memory created 
    delete[] testArray; 

    return 0; 
} 

//function to collect user info, dynamically allocate 
double* allocate(int &numOfScores) 
{ 
    double* testArray; 

    //prompt user for scores 
    cout << "How many test scores would\n"; 
    cout << "you like to process: "; 

    //user input validation 
    if(!(cin >> numOfScores)) 
    { 
     cout << "Invalid input!\n"; 
     cout << "Program termination, please\n"; 
     cout << "restart the program." << endl; 
     exit(0); 
    } 
    else if(numOfScores < 0) 
    { 
     cout << "Invalid input!\n"; 
     cout << "Program termination, please\n"; 
     cout << "restart the program." << endl; 
     exit(0); 
    } 

    //dynammically allocate an arrray to hold the scores 
    testArray = new double[numOfScores]; 

    //get the scores from user 
    for (int count = 0; count < numOfScores; count++) 
    { 
     cout << "Enter Score: "; 

     //user input validation 
     if(!(cin >> testArray[count])) 
     { 
      cout << "Invalid input!\n"; 
      cout << "Program termination, please\n"; 
      cout << "restart the program." << endl; 
      exit(0); 
     } 
     else if(testArray[count] < 0.0) 
     { 
      cout << "Invalid input!\n"; 
      cout << "Program termination, please\n"; 
      cout << "restart the program." << endl; 
      exit(0); 
     } 


    } 

    return testArray; 
} 

//function to calculate the average score 
double averageScore(int &numOfScores) 
{ 
    double* testArray; 

    double total, 
      average, 
      scores[0], 
      lowest; 

    lowest = scores[0]; 

    //calculate total scores entered 
    for(int count = 0; count < numOfScores; count++) 
    { 
     total += testArray[count]; 

     //find lowest score entered 
     for(int count = 1; count < numOfScores; count++) 
     { 
      if (testArray[numOfScores] < lowest) 
       lowest = scores[numOfScores]; 
     } 
    } 

    //average the total amount of scores drop the lowest 
    average = (total - lowest)/numOfScores; 

    cout << "The average test score is: " << average << endl; 
    cout << "Lowest is: " << lowest << endl; 

    return average; 
} 
+0

2つのコメント:可能な場合は動的に割り当てられた配列の代わりにベクトルを使用し、変更しない場合は 'int&numOfScores'にポイントがありません。 – Bwmat

+0

なぜdouble averageScore(int numOfScores)の代わりに 'double averageScore(int&numOfScores)'をやっていますか? – twain249

+0

最小の値を見つけるために内側の 'for'ループは必要ありません。あなたの外側のループで 'testArray [count]'の値を 'lowest'にそれぞれ比較するだけです。 –

答えて

1

PROBがたくさんありますあなたのaverageScore機能では、私は今のところ最も基本的なものをカバーします。

まず、何らかのデータを渡す必要があります。今すぐ使用していますtestArray私はどこに割り当てられているかわかりません。私はあなたがこれを実行する際にセグメンテーションフォールトを取得していないことに驚いています。

ただし、初期化されていません。 C++では、ポインタを宣言すると、ポインタが指す変数に値が設定されます。それはガベージ値を持ち、そのガベージ値を使って算術演算を実行すると、出力もガベージになります。

averageScoreの機能で利用可能なスコアのリストを、好ましくはパラメーターとして渡すことによって、スコアリストを作成する必要があります。

あなたの平均化関数の先頭には、以下のようになります。つまり、あなたが代わりにnumOfScores&numOfScoresを使用するときに代わりに、それはこの

double averageScore(double*testArray, int numOfScores) 
{ 
    ... 

のようになります

double averageScore(int &numOfScores) 
{ 
    double* testArray; 
    ... 

つまり、あなたはnumOfScoresを変更した場合averageScore関数では、main関数でも変更されるよりも、そうするべきではありません。

今、double* testArray;の行では、 "testArray"という名前の新しいポインタが宣言されています。意味のあるデータはありませんが、ガベージがいっぱいです。あなたのコードに "testArray"という名前の他のダブルポインタ変数があるかもしれませんが、それらのどれもaverageScore関数のスコープにはありません。 testArrayを渡すと、メソッド呼び出しでそれを使用できるようになります。たとえば、double someNumber = testArray[i]です。

あなたの配列も参照渡しされていることに注意してください。あなたではなく値によって、それを通過する場合は、

`double averageScore(double testArray[], int numOfScores)` 

を試すことができますが、あなたはそれをやった後は、あなたのコードは、まだいくつかの問題を持っていますが、出力されます、1つの

で私を引用しないでくださいあなた自身の上でそれらをうまくやっていくことができるほど意味があるはずです。

+0

ありがとう。私はスコアのリストを 'averageScore'に '&numOfScores'のパラメーターとして渡していると思った。 – Gmenfan83

+0

@ Gmenfan83 '&numOfScores'は単なるインターガーへの参照に過ぎず、スコアの数と思われる。その機能を利用できるようにすることは、「私は5つの番号を持っています。あなたは平均を見つけることができますか? 私はあなたのお手伝いに少し私の答えを編集します –

+0

あなた@Sam私はこれを私に説明するために時間を取ることが大変です。大変感謝しています。私はこれが必要なものを修正しようとしている。 – Gmenfan83

2

:これまで

if(testArray[numOfScores] < lowest) 

を:

if(testArray[count] < lowest) 

@jzworkmanが指摘するようにまた、平均化のための分母は(numScoresする必要があります - 1)分子から最低スコアを取り除くからです。 (該当する場合は、スコアが1つしかないエッジケースをテストしたい場合は、スコアを最低にすると平均化されません)

2

カップルの問題。ネストされたループのためにこれらの2つを持つべきではありません(代わりにifステートメントを使って値が最低値よりも低いかどうかをチェックするだけです)。この以来

は(私はあなたのステップを与えるだろうと、あなたはを通して、あなたのコード

  1. ループを修正し、合計を計算し、同じ時間
  2. で最低のスコアを見つけることとして平均値を計算することができます宿題です総-最低)/(numScores -1)
  3. リターン平均
+0

私は(合計 - 最低)/(numScores -1)むしろ(合計 - 最低)/ numOfScoresを行う理由を説明することができますか?ありがとうございました。私はちょうど混乱しており、学びたいと思っています。私はこれが宿題だと知っていますが、私もプログラマーになりたいので重要です。 – Gmenfan83

+1

あなたは合計値のうちの1つを取っているからです。私が次の入力をしたとしましょう:1、3、5、私が平均をとっている2つの値があるので、私が最低(1)を取った場合、私の平均は(3 + 5)/ 2です。最も低い値を取り除いた後に2つの値しか残さないので、3を除いて、(3 + 5)/ 3になることを望みません。 – jzworkman

+0

私は、説明をありがとう! – Gmenfan83

3
std::vector<double> scores = {1.2,6.5,3.0,8.3,4.8,6,7.7}; 

// drop lowest score 
scores.erase(min_element(begin(scores),end(scores))); 

double average = accumulate(begin(scores),end(scores),0.0)/scores.size(); 
+1

これは正しいかもしれませんが、これは現在のコースの範囲を超えていると思います(宿題タグに注意してください)。 – jzworkman

+0

あなたはおそらく名前空間指定子を追加すべきですが、この答えのように、より少ないものがあります!そして、標準ライブラリを好む – 111111

関連する問題