#include<iostream> #include<fstream> #include<string> using namespace std; void main() { string str; char *s;//读取文件中的字符串 double **Yto;//周期分组 double *Y;//数据 double *Yi; //均值 double *ss; //方差 double *sk; //平方差 int L; //周期数 int count=0; ifstream read("data.dat");//打开文件 while(!read.eof()) { read>>str; count++; //计算文件行数 } read.close(); //关闭文件 s=new char[15]; Y=new double[count]; ofstream dd("out.dat"); ifstream r("data.dat"); int i=0; //数组下标 while(!r.eof()) { r>>s; Y[i]=atof(s); //将char 转换为double i++; } r.close(); int kk=0; ss=new double[66-2+1]; sk=new double[66-2+1]; double temp; //平均方差最小缓存 int km=0; //平均方差最小所对应的周期 for(int k=2;k<66;k++) //分组 { L=(count-1)/k; Yto=(double **)new double *[L]; for(int j=0;j<L;j++) { Yto[j]=new double[k]; } int n=0; for(int m=0;m<L;m++) { for(int mm=0;mm<k;mm++) { Yto[m][mm]=Y[n]; n++; } } Yi=new double[k]; for(int nn=0;nn<k;nn++) { double sum=0; for(int m=0;m<L;m++) { sum+=Yto[m][nn]; } Yi[nn]=(double)sum/(L+1); //求均值 dd<<"均值Y"<<nn<<"为"<<Yi[nn]<<endl; } ss[kk]=0; sk[kk]=0; for(int nn=0;nn<k;nn++) //求方差 { double ssum=0; for(int m=0;m<L;m++) { ssum+=(Yto[m][nn]-Yi[nn])*(Yto[m][nn]-Yi[nn]); } ss[kk]+=ssum; } dd<<"周期为"<<k<<"的方差为"<<ss[kk]<<endl; sk[kk]=(double)ss[kk]/L; dd<<"平均方差为"<<sk[kk]<<endl; if(kk==0) //选择最小平均方差 { temp=sk[kk];km=k; } if(kk>0&&temp>sk[kk]) { temp=sk[kk]; km=k; } kk++; } dd<<"最小平均方差所对应的周期为"<<km<<endl; dd.close(); system("pause"); }