2016-09-19 1 views
-2

Tout dans mon code fonctionne, sauf pour les mathématiques à la fin, produit toutes sortes de nombres négatifs fous. Des conseils pour réparer mon désordre de code?C++ Pointer math lutte

#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

combien/comment grands nombres? Le dépassement – user463035818

+3

'displayRpt' va probablement de la fin du tableau. 'sort' ne fait pas ce que vous attendez. Il semble que vous deviez apprendre à utiliser un débogueur pour parcourir votre code. Avec un bon débogueur, vous pouvez exécuter votre programme ligne par ligne et voir où il dévie de ce que vous attendez. C'est un outil essentiel si vous voulez faire de la programmation. Pour en savoir plus: ** [Comment déboguer de petits programmes] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+1

Le tri aura des accès hors de portée pour '[j + 1]' quand 'j' a sa valeur maximale. –

Répondre

1

Dans getScore vous faites ceci:

delete scores; 

qui est indéfini puisque vous avec new [] alloué.

Même si vous deviez le faire correctement - delete [] scores; - il libérerait la mémoire scores points à.
Tout accès ultérieur à cette mémoire est indéfini.

Déplacez le désallocation vers main.