2016-03-16 1 views
0

Я работаю над этим кодом некоторое время, и я почти получил его на работу, но у меня проблема. Я теряю данные, когда сортирует их. Чем больше числа я ввожу, тем больше чисел отображает только целые числа. link to the image of my outputПотерянные данные из double и Error: Windows вызвала точку останова в exe. Это может быть связано с повреждением кучи,

Кроме того, как только запускается код я получаю всплывающее окно с этим сообщением (я заметил, что я получаю эту ошибку после того, как я добавил функцию суммы и все функции после этого, и я не нажимал F12):

«Windows вызвало точку останова в project3.exe.

Это может быть связано с коррупцией в куче, что указывает на ошибку в project3.exe или любой из библиотек DLL он загруженными.

Это может также вызвано нажатием кнопки F12, а project3.exe имеет фокус.

В выходном окне может быть больше диагностической информации. "

Это мой код: Попросите пользователя для номера после того, как последний пронумерованный ввести они должны нажать ноль, отобразить его обратно данные, отображает некоторые статистические данные и сортирует данные я не проверяла пользователя. error

(* Окно терминала закрывается, если я не использую system("pause"), поэтому он есть, и я знаю, что должен быть 'delete []arr, но он даст мне сообщение о контрольной точке после того, как я поставлю нуль, поэтому это комментарий

#include <iostream> 
#include <iomanip> 
using namespace std; 
void getdata(double *arr, double &data, int &floatpt); 
void display (double *arr, int floatpt); 
void computesum (double *arr, int floatpt, double sum); 
void computearthmeticmean (double *arr, int floatpt, double aMean); 
void computeharmonicmean (double *arr, int floatpt, double hMean); 
void median(double *arr, int floatpt); 
void sort (double *arr, int floatpt); 
int main() 
{ 
    double data, sum=0, aMean=0, hMean=0; 
    int count=0, floatpt; 
    double *arr =new double[count]; 

    getdata (arr, data, floatpt); 
    cout<<"Thank you. The data you entered are "<<endl; 
    display(arr, floatpt); 
    cout<<"The following statistics were computed "<<endl; 
    computesum(arr,floatpt, sum); 
    computearthmeticmean(arr, floatpt, aMean); 
    median(arr, floatpt); 
    computeharmonicmean (arr, floatpt, hMean); 
    sort(arr, floatpt); 
    cout<<"The original data set is "<<endl; 
    display(arr, floatpt); 
    cout<<"Thank you for using this program. Enjoy your statistics "<<endl; 

    //delete []arr; 


    system ("pause"); 
    return 0; 
} 
void getdata(double *arr, double &data, int &floatpt) 
{ 
    int count=0; 

    cout<<"Please enter floating point data.\n"; 
    cout<<"After the last number has been entered press 0 (zero) \n"; 
    do 
    { 
     cin>>arr[count]; 
     data = arr[count]; 

     count++; 

    }while(data != 0); 
    floatpt=(count-1); 

} 
void display (double *arr, int floatpt) 
{ 
    for(int i=0; i<floatpt; i++) 
    { 
     cout<<arr[i]<<endl; 
    } 

} 
void computesum (double *arr, int floatpt, double sum) 
{ 
    for (int j=0; j<floatpt; j++) 
    { 
     sum+=arr[j]; 
    } 
    cout<<"Sum: "<<sum<<endl; 

} 
void computearthmeticmean (double *arr, int floatpt, double aMean) 
{ 
    for (int a=0; a<floatpt; a++) 
    { 
     aMean+=arr[a]; 
    } 
    aMean=aMean/floatpt; 
    cout<<"Arithmetic Mean: "<<aMean<<endl; 

} 
void computeharmonicmean (double *arr, int floatpt, double hMean) 
{ 
    for (int h=0; h<floatpt; h++) 
    { 
     hMean+=(1/arr[h]); 
    } 
    hMean=floatpt/hMean; 
    cout<<"Harmonic Mean: "<<hMean<<endl; 

} 
void median(double *arr, int floatpt) 
{ 
    int temp; 
    double median; 

    for (int s=0; s<floatpt; s++) 
    { 
     for (int r=0; r<(floatpt-1); ++r) 
     { 
      if (arr[r] > arr[r+1]) 
      { 
       temp = arr[r]; 
       arr[r] = arr[r+1]; 
       arr[r+1] = temp; 
      } 
     } 

     if (floatpt%2 == 0) 
     { 
      median = (arr[s/2] + arr[(s/2)-1])/2.0; 
     } 
     else 
     { 
      median = arr[s/2]/1.0; 
     } 
    } 

    cout<<"Median: "<<median<<endl; 

} 
void sort (double *arr, int floatpt) 
{ 
    cout<<"The sorted data set is: "<<endl; 
    for (int sd=0; sd<floatpt; sd++) 
    { 
     cout<<arr[sd]<<endl; 
    } 
} 

ответ

1
int count=0, floatpt; 
double *arr =new double[count]; 

count равно 0, поэтому массив, который вы создаете, не имеет выделения. В getdata вы поэтому читаете в местах расположения, которые находятся за пределами поля:

Вы намерены перераспределить позже?

Возможно, если вы попытаетесь использовать std::vector<double>, тогда все будет работать. Он автоматически изменяет размеры, и легко выполнить проверку границ.

Что-то вроде этого (не проверено):

#include <vector> 
// ... 
std::vector<double> data; 
getdata(arr); 
// ... 

void getdata(std::vector<double>& arr) 
{ 
    double nextValue; 

    cout<<"Please enter floating point data.\n"; 
    cout<<"After the last number has been entered press 0 (zero) \n"; 
    cin>>nextValue; 
    while(nextValue != 0) 
    { 
     arr.push_back(nextValue); 
     cin >> nextValue; 
    } 
} 
+0

Спасибо я получил это единственное изменение, которое я сделал я был изменен 'станд :: вектор data' в' станд :: вектор arr'. Если вам не о чем спросить, можете ли вы показать мне, как это будет сделано с суммой, и я мог бы выяснить остальное. В классе мы рассмотрели только один пример с использованием векторной библиотеки. –

+0

Для выполнения суммирования на 'arr' вы можете использовать [' std :: accumulate'] (http://en.cppreference.com/w/cpp/algorithm/accumulate). 'double sum = std :: accumulate (arr.begin(), arr.end(), 0);' – AndyG

Смежные вопросы