⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 互相关计算程序 非常实用的一个数据处理程序 非常好用
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Btn_OpenFileClick(TObject *Sender)
{
  int RFileHandle;
  int RFileLength;
  int RBytesRead;
  char *pszBuffer;
  int ii,jj,kk,dd,mm,mm_max=0,LineNum_Max;
  char MYMSG[2255],TMSG[255];;
  char CH;
  double data[400];
  int Static[NN_Row];
  if (OpenDialog1->Execute())
  {
    try
    {
      RFileHandle = FileOpen(OpenDialog1->FileName, fmOpenRead);
      RFileLength = FileSeek(RFileHandle,0,2);
      FileSeek(RFileHandle,0,0);
      pszBuffer = new char[RFileLength+1];
      RBytesRead = FileRead(RFileHandle, pszBuffer, RFileLength);
      FileClose(RFileHandle);
      for(ii=0;ii<NN_Row;ii++)
        for(jj=0;jj<NN_Column;jj++)
          *(Data[ii]+jj)=NO_VALUE;
      kk=0;jj=0;
      for(ii=0;ii<RBytesRead;ii++)
            {
                   CH=pszBuffer[ii];
				     switch(CH)
					    {
					      case 10: MYMSG[kk]='\0';
							   kk=0;
						       dd=CharToDouble(MYMSG,data,400);
                                                          for(mm=0;mm<dd&&mm<NN_Column;mm++)
                                                            *(Data[jj]+mm)=data[mm];
                                                          *(Data_Flag+jj)=mm;
                                                      /*   sprintf(TMSG,"dd=%d",dd);
                                                           strcpy(MYMSG,TMSG);
                                                           for(mm=0;mm<dd;mm++)
                                                            {
                                                             sprintf(TMSG,"jj=%d, dd=%d[%f]",jj,mm,data[mm]);
                                                             strcat(MYMSG,TMSG);
                                                            }
                                                        Application->MessageBox(MYMSG,"Message !",MB_OK);  */
                                                       if(mm_max<mm)mm_max=mm;
                                                          jj++;
                                                       break;
					      default: MYMSG[kk]=CH;
						       kk++;
						       break;
					    }
                        if(jj>=NN_Row) break;
            }
         delete [] pszBuffer;
//                                                        Application->MessageBox(MYMSG,"Message !",MB_OK);  */
                              sprintf(MYMSG,"There are %d Rows by %d Columns data",jj,mm_max);
                              Label1->Caption=OpenDialog1->FileName+" has been opened.";
                              Label2->Caption=MYMSG;
      Column=mm_max;
      Row=jj;
          mm_max=0; LineNum_Max=0;
          for(ii=0;ii<NN_Column;ii++)
             Static[ii]=0;
          for(ii=0;ii<Row;ii++)
           {
            if(*(Data_Flag+ii)>=NN_Column) *(Data_Flag+ii)=NN_Column-1;
             Static[*(Data_Flag+ii)]++;
            }

          for(ii=0;ii<NN_Column;ii++)
             if(Static[ii]>LineNum_Max)
              {
                mm_max=ii;  LineNum_Max=Static[ii];
//                sprintf(MYMSG,"ii=%d,Static[ii]=%d",ii,Static[ii]);
//                Application->MessageBox(MYMSG,"Message !",MB_OK);
              }


      Column=mm_max;
                                                           MYMSG[0]='\0';
                                                           for(mm=0;mm<Column;mm++)
                                                            {
                                                             sprintf(TMSG,"%g, ",*(Data[Row-1]+mm));
                                                             strcat(MYMSG,TMSG);
                                                            }
                                                          Label_Example->Caption=MYMSG;
    ComboBox_Line1->Items->Clear();
    ComboBox_Line2->Items->Clear();
  TStringList* MyList = new TStringList();
      for(jj=0;jj<Column;jj++)
       {
        sprintf(MYMSG,"%2d",jj);
        MyList->Add(MYMSG);
      }
        ComboBox_Line1->Items->AddStrings(MyList);
        ComboBox_Line2->Items->AddStrings(MyList);
   }
    catch(...)
    {
      Application->MessageBox("Can't perform one of the following file operations: Open, Seek, Read, Close.", "File Error", IDOK);
    }
  }

}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
 int  TForm1::CharToDouble (char string[],double data[],unsigned int nn)
 {
  unsigned int ii,jj,dd,mm;                 //ii for index of character which can be transfered by AnsiString.ToDouble(),dd for index of data array
  char MYMSG[255],TMSG[200];                 //TMSG is the character hich can be transfered by AnsiString.ToDouble()
  unsigned  int EndRD;                       //when EndRD=1, the current datum has been read over because meeting undatum character.
  int FlagE,FlagD;  //for e(or E) and Dot respectively
  dd=0;
  FlagE=0;  FlagD=0; EndRD=0;ii=0;      //
  ii=0;TMSG[0]='0';
 for(jj=0;jj<strlen(string);jj++)
 {
   if(string[jj]=='-'||string[jj]=='+'||string[jj]=='.'||string[jj]=='e'||string[jj]=='E'||(string[jj]<=57&&string[jj]>=48))
     {
	     switch(string[jj])
                {
		   case  '+':
		   case  '-':
                             if(ii==0) {TMSG[ii]=string[jj]; ii++; }        //+- only presents at the first
                             else
                               if(TMSG[ii-1]=='e'||TMSG[ii-1]=='E')               //similar 1e+4
                                      {TMSG[ii]=string[jj]; ii++; }
                               else   EndRD=1;
                             break;
		   case  '.':
                             if(FlagE==1||FlagD==1){EndRD=1;break;  }
                             TMSG[ii]=string[jj];
                             ii++;
                             FlagD=1;
                             break;
		   case  'e':
		   case  'E':
                             if(FlagE==1){EndRD=1;break; }
                             if((TMSG[ii-1]<=57&&TMSG[ii-1]>=48)||TMSG[ii-1]=='.')
                                  {TMSG[ii]=string[jj];ii++; FlagE=1;}
                             else EndRD=1;
                             break;
                   default:

                             TMSG[ii]=string[jj];
                             ii++;
                             break;
                }
     }
   else
     {
       EndRD=1;
       FlagE=0;  FlagD=0;
     }
    if(EndRD==1)
      {
        if(ii>0)
          {
                              TMSG[ii]='\0';
                              if(!(strlen(TMSG)==1&&(TMSG[0]=='+'||TMSG[0]=='-'||TMSG[0]=='.'||TMSG[0]=='e'||TMSG[0]=='E')) )
                                {
                                      data[dd]=AnsiString(TMSG).ToDouble();
                                      dd++;
                                }
       ii=0;
        if(string[jj]=='+'||string[jj]=='-')
          {
           TMSG[0]=string[jj];
           ii++;
          }
        if(string[jj]=='.')
          {
           TMSG[0]=string[jj];
           FlagD=1;
           ii++;
          }
          }
          FlagE=0; FlagD=0; EndRD=0;
      }
 }
                    if(ii>0)
                            {
                              TMSG[ii]='\0';
                              if(!(strlen(TMSG)==1&&(TMSG[0]=='+'||TMSG[0]=='-'||TMSG[0]=='.'||TMSG[0]=='e'||TMSG[0]=='E')) )
                                {
                                      data[dd]=AnsiString(TMSG).ToDouble();
                                      dd++;
                                }
                            }

   return dd;
 }
//------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 int ii;
 char MYMSG[255];
    for(ii=0;ii<NN_Row;ii++)
      if((Data[ii]=(double *)malloc(NN_Column*sizeof(double) ))==NULL)
              {
              sprintf(MYMSG,"Cannot allocate for KoData!");
              Application->MessageBox(MYMSG,"Cannot allocate!",MB_OK);
              }
      if((Data_Flag=(int *)malloc(NN_Row*sizeof(int) ))==NULL)
              {
              sprintf(MYMSG,"Cannot allocate for KoData!");
              Application->MessageBox(MYMSG,"Cannot allocate!",MB_OK);
              }
    Row=0;Column=0;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Btn_SaveResultsClick(TObject *Sender)
{
  char szFileName[MAXFILE+4];
  int WFileHandle;
  int WLength;
  char MYMSG[1500],tempMSG[40];
  double *dataA,*dataB;
  double avgA,mulA,avgB,mulB,mulAB,mul;
  int Column_ReadA,Column_ReadB;
  int row;
      Column_ReadA=ComboBox_Line1->Text.ToInt();
      Column_ReadB=ComboBox_Line2->Text.ToInt();
//  char
  char CH1=13,CH2=10;
  int ii,jj,kk;
   if(Column<=0||Row<=0) return;
      if((dataA=(double *)malloc(Row*sizeof(double) ))==NULL)
              {
              sprintf(MYMSG,"Cannot allocate for KoData!");
              Application->MessageBox(MYMSG,"Cannot allocate!",MB_OK);
              }
      if((dataB=(double *)malloc(Row*sizeof(double) ))==NULL)
              {
              sprintf(MYMSG,"Cannot allocate for KoData!");
              Application->MessageBox(MYMSG,"Cannot allocate!",MB_OK);
              }
     row=0;
     for(ii=0;ii<Row;ii++)
        {
          if(*(Data_Flag+ii)!=Column)
                continue;
          *(dataA+row)=*(Data[ii]+Column_ReadA);
          *(dataB+row)=*(Data[ii]+Column_ReadB);
          row++;
        }

  if (SaveDialog1->Execute())
  {
    if (FileExists(SaveDialog1->FileName))
    {
      fnsplit(SaveDialog1->FileName.c_str(), 0, 0, szFileName, 0);
      strcat(szFileName, ".BAK");
      RenameFile(SaveDialog1->FileName, szFileName);
    }
    WFileHandle = FileCreate(SaveDialog1->FileName);

  if(RadioButton_Corr->Checked==true)                  //Calculate Cross corelation
       for(ii=-row+1;ii<row;ii++)
       {
        avgA=0;mulA=0;avgB=0;mulB=0;mulAB=0; jj=0;mul=0;
          for(kk=0;ii+kk<row&&kk<row;kk++)           //keep dataA quiet, move dataB{-row,+row}
            {
                  if(ii+kk>=0)
                  {
                          if(*(dataA+ii+kk)<-9998||*(dataB+kk)<-9998) continue;
                          avgA=avgA*jj/(jj+1.0)+*(dataA+ii+kk)/(jj+1.0);
                          mulA=mulA*jj/(jj+1.0)+*(dataA+ii+kk)* *(dataA+ii+kk)/(jj+1.0);
                          avgB=avgB*jj/(jj+1.0)+*(dataB+kk)/(jj+1.0);
                          mulB=mulB*jj/(jj+1.0)+*(dataB+kk)* *(dataB+kk)/(jj+1.0);
                          mulAB=mulAB*jj/(jj+1.0)+*(dataA+ii+kk)* *(dataB+kk)/(jj+1.0);
                          mul+=*(dataA+ii+kk)* *(dataB+kk);
                          jj++;
                  }
            }
            if(!(avgA==0||mulA==0||avgB==0||mulB==0||mulAB==0||jj==0||mul==0))
             {
              sprintf(MYMSG,"%d   %g %d%c%c", ii,mul,kk,CH1,CH2);
//              sprintf(MYMSG,"%d %g%c%c", ii,(mulAB-avgA*avgB)/sqrt(mulA-avgA*avgA)/sqrt(mulB-avgB*avgB),CH1,CH2);
              FileWrite(WFileHandle, MYMSG, strlen(MYMSG));
             }
       }
  else
       for(ii=-row/2;ii<=row/2;ii++)                              //Calculate Cross corelation coefficient
       {
        avgA=0;mulA=0;avgB=0;mulB=0;mulAB=0; jj=0;mul=0;
          for(kk=0;ii+kk<row&&kk<row;kk++)           //keep dataA quiet, move dataB{-row/2,+row/2}
            {
                  if(ii+kk>=0)
                  {
                          if(*(dataA+ii+kk)<-9998||*(dataB+kk)<-9998) continue;
                          avgA=avgA*jj/(jj+1.0)+*(dataA+ii+kk)/(jj+1.0);
                          mulA=mulA*jj/(jj+1.0)+*(dataA+ii+kk)* *(dataA+ii+kk)/(jj+1.0);
                          avgB=avgB*jj/(jj+1.0)+*(dataB+kk)/(jj+1.0);
                          mulB=mulB*jj/(jj+1.0)+*(dataB+kk)* *(dataB+kk)/(jj+1.0);
                          mulAB=mulAB*jj/(jj+1.0)+*(dataA+ii+kk)* *(dataB+kk)/(jj+1.0);
                          mul+=*(dataA+ii+kk)* *(dataB+kk);
                          jj++;
                  }
            }
            if(avgA!=0&&mulA!=0&&avgB!=0&&mulB!=0&&mulAB!=0&&jj!=0&&mul!=0&&(mulA-avgA*avgA)>0&&(mulB-avgB*avgB)>0)
             {
               sprintf(MYMSG,"%d %g %d%c%c", ii,(mulAB-avgA*avgB)/sqrt(mulA-avgA*avgA)/sqrt(mulB-avgB*avgB),kk,CH1,CH2);
               FileWrite(WFileHandle, MYMSG, strlen(MYMSG));
             }
       }

 /*    for(ii=0;ii<row;ii++)
     {

       sprintf(MYMSG,"%g  %g%c%c", *(dataA+ii),*(dataB+ii),CH1,CH2);
       FileWrite(WFileHandle, MYMSG, strlen(MYMSG));
     }
   for(ii=0;ii<row;ii++)
     {
                                                          MYMSG[0]='\0';
                                                           for(jj=0;jj<Column;jj++)
                                                            {
                                                             sprintf(tempMSG,"%g, ",*(Data[ii]+jj));
                                                             strcat(MYMSG,tempMSG);
                                                            }
                                                             sprintf(tempMSG,"%c%c",CH1,CH2);
                                                             strcat(MYMSG,tempMSG);
              FileWrite(WFileHandle, MYMSG, strlen(MYMSG));
     }
           */




  if(RadioButton_Corr->Checked==true)
    Label5->Caption="Saved into file: "+SaveDialog1->FileName;
  else
    Label5->Caption="Saved into file: "+SaveDialog1->FileName;

    FileClose(WFileHandle);
  }
}
//---------------------------------------------------------------------------



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -