C ++ со стандартным отклонением и средним значением выдает плохой вывод

Здравствуйте, может кто-нибудь, пожалуйста, помогите, мои цифры для SD и среднее значение выходят очень странно, и я не знаю почему. Я чувствую, что я получаю доступ к массиву неправильный путь, может быть? Есть структура, но также и независимый массив, который я использую. Я получаю средний штраф, но все остальное очень странный вывод.

#include<iostream>
#include<fstream>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>

using namespace std;

#define output_bit 1  // change it to 1/0 if you want(don't want to print/output

struct Stock{
char  date[10];
double open;
double high;
double low;
double close;
int    volume;
double adj_close;
};

//debug tip: pause your program

void pauseIT(){
cout << "Wait, press ENTER to continue,...";
cin.clear(); //clear errors
cin.sync();  //clear the buffer
cin.get();   //wait for a letter
}

void setOutputPrecision(int n){

cout.setf(ios::fixed);
cout.setf(ios::showpoint);
cout.precision(n);
}
double* sortArray(double *a, int size);
int findMaxIndex(const double *a, int size);
void MedianandMean(double * stock, int size, double& stockMedian, double& stockMean);
void standardDeviation(double *stock, int size, double& sum, double& avg, double& sum2, double& stdDev);

int main(int argc, char** argv) {

const int n = 249;

Stock GoogleStock[n]; // a struct array
char filename[100] = "google_stock_.txt";

double *google_stock_adj_close=new double[n];

FILE *fp;

char header[100];

// items since the 2nd line in the file
double open, high, low, close, adj_close;
int    volume;
char   date[10];

//header information
char date_s[10],open_s[10], high_s[10], low_s[10],
close_s[10],  volume_s[10], adj_s[10], adj_close_s[10];int i=0;

// Read a file

fp=fopen(filename, "r"); //open a file for read

// book keeping: make sure it is not a NULL
if(!fp)
perror("Double-check your input file");

// read the header information (first line)
if(!feof(fp)){
fscanf(fp, "%s  %s  %s  %s  %s  %s  %s %s\n", date_s, open_s,
high_s, low_s, close_s,volume_s, adj_s, adj_close_s);
}
// merge the "adj"  and "Close"  to "AdjClose"strcat(adj_s, adj_close_s);
strcpy(adj_close_s, adj_s);

//read the main information from the 2nd line to the file end:
// feof will tell you if the file ends

while(!feof(fp)){
fscanf(fp, "%s  %lf  %lf  %lf  %lf  %10d  %lf\n",
date, &open, &high, &low, &close, &volume, &adj_close);

//copy information to a structure array

strcpy(GoogleStock[i].date, date);
GoogleStock[i].open      = open;
GoogleStock[i].high      = high;
GoogleStock[i].low       = low;
GoogleStock[i].close     = close;
GoogleStock[i].volume    = volume;
GoogleStock[i].adj_close = adj_close;

//copy the adj close price to an independent array

google_stock_adj_close[i]= adj_close;

i++;
}

fclose(fp); //close your program after finishing reading

cout<<"Finish reading \n"<<endl;if (output_bit) {

cout<<"The stock information is written in a structure array: \n"<<endl;
pauseIT();
for(int i=0;i<n;i++){
fprintf(stderr, "%s  %lf  %lf  %lf  %lf  %d  %lf\n",
GoogleStock[i].date,
GoogleStock[i].open,
GoogleStock[i].high,
GoogleStock[i].low,
GoogleStock[i].close,
GoogleStock[i].volume,
GoogleStock[i].adj_close);
}
cout<<endl<<endl;
}

if(output_bit){
cout<<"This is the adjusted close price of Google stock"<<endl;
pauseIT();
setOutputPrecision(3);
for(int i=0;i<n;i++)
cout<<google_stock_adj_close[i]<<endl;
}double stockMedian,stockMean,stdDev,sum,avg,sum2;
stockMedian=stockMean=stdDev=0.0;

MedianandMean((double *) google_stock_adj_close,n, stockMedian, stockMean);

standardDeviation((double *) google_stock_adj_close, n, sum, avg, sum2, stdDev);

cout<<"The stock median = "<<stockMedian<<endl;
cout<<"The stock mean = "<<stockMean<<endl;
cout<<"The stock standard deviation = "<<stdDev<<endl;

delete []google_stock_adj_close;

return 0;
}int findMaxIndex(const double *a, int size){
int index=0;
double max=a[0];
for (int i=1;i<size;i++){
if (a[i]>max){
max=a[i];
index=i;
}
}
return index;
}

double * sortArray(double *a, int size){
int index;
double *sortedArray=new double[size];
for(int i=0;i<size;i++){
index =findMaxIndex(a, size);
sortedArray[i]=a[index];
a[index]=LONG_MIN;
}
return sortedArray;
}void MedianandMean(double * stock, int size, double& stockMedian, double& stockMean){
stockMedian=0.0;
double *sorted_stock=sortArray(stock,size);

if(size%2==0)
stockMedian=sorted_stock[(size-1)/2];
else
stockMedian=(sorted_stock[(size-1)/2]+sorted_stock[((size-1)/2)+1])/2;

//Mean
stockMean=0.0;
for(int i=0;i<size;i++)
stockMean=stockMean+stock[i];
stockMean=stockMean/size;

}

void standardDeviation(double *stock, int size, double& sum, double& avg, double& sum2, double& stdDev){

//stanadard deviation
double temp=0.0;
for (int i=0; i<size;i++)
sum=sum+stock[i];
avg=sum/float(size);

for(int i=0; i<size; i++)
sum2 += pow((stock[size]-avg),2);
temp =sum2/(size-1);
stdDev= pow(temp, 0.5);

}

-1

Решение

  1. Вы должны разработать и протестировать новый код в изоляции прежде чем пытаться интегрировать его.
  2. Ваш опубликованный пример не является ни минимальным, ни полным.
  3. Ваш код не имеет хорошего формата.
  4. Ваши переменные живут слишком долго.
  5. Вы никогда не инициализируете `sum`.
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]