2016-09-19 8 views
-2

私のコードのすべては、最後の数学を除いてすべての種類の狂った負の数を出力します。私の混乱したコード混乱を修正するためのアドバイスはありますか? getScoreC++ポインタの数学の苦闘

#include <iostream> 
using namespace std; 


double getScores(double *, int); 
int sort(double *, int); 
double calcAvg(double *, int);  //function prototypes 
void displayRpt(double *, int); 


int main() { 
    int size; 
    cout << "Welcome to Daniel Mikos' Quiz Score Calculator" << endl << endl; 
    cout << "How many test scores would you like to enter? ";    //prompt for # of test scores 
    cin >> size; 

    double *scores; //pointer for array 
    scores = new double[size]; //Declares a pointer to an array of doubles 
    getScores(scores, size); 
    sort(scores, size); 
    calcAvg(scores,size); 
    displayRpt(scores, size); 


    system("Pause"); 
    return 0; 
} 

double getScores(double *scores, int size) { //prompts for scores 

    while (size <= 0) { 
     cout << "Error! There must be at least one score!" << endl; 
     cout << "Please try again!" << endl; 
     cout << "Enter number of test scores you would like to process: "; 
     cin >> size; 
    } 

    //scores = new double[size]; 
    for (int i = 0; i < size; i++){ 
     cout << "Enter test score " << (i +1)<< ": ";     //prompt for each score 
     cin >> scores[i]; 
    } 

    delete scores; 
    return 0; 
} 

int sort(double *scores, int size) { //sorts array from largest to smallest 
    double temp; 
    for (int i = 1; i <= size; i++) { 
     for (int j = 0; j < size; j++) { 
      if (scores[j + 1] > scores[j]) { 
       temp = scores[j]; 
       scores[j] = scores[j + 1]; 
       scores[j + 1] = temp; 
      } 
     } 
    } 
    return *scores; 
} 

double calcAvg(double *scores, int size) { //calculates average test score 
    double average; 
    double total = 0; 

    for (int i = 0; i < size; i++) { 
     total = total + scores[i]; 

    } 

    average = total/size; 
    cout << endl <<"The average score: " << average <<endl <<endl; 
    return average; 
} 

void displayRpt(double *scores, int size) { //output report 
    for (int i = 1; i <= size; i++) { 
     cout << "Test score ("<< i <<"): "<<scores[i]<<endl; 
    } 

} 
+0

どのくらいの数/どのように大きな数字ですか?おそらくオーバーフローします – user463035818

+3

'displayRpt'は配列の最後から始まります。 'sort'はあなたが望むことをしません。デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+1

ソートには範囲外のアクセスがいくつかあります'j 'が最大値をとるとき、' [j + 1] 'のために。 –

答えて

1

あなたがこれを行う:あなたはnew []に割り当てられているので定義されていない

delete scores; 

正しく実行しても - delete [] scores; - メモリが解放されますscoresが指しています。
その後のそのメモリへのアクセスはすべて未定義です。

割り当て解除をmainに移動します。