📄 unit1.cpp
字号:
for(jj=48;jj<=49;jj++)
{
Identify_ID_B(jj);
}
for(jj=64;jj<=69;jj++)
{
Identify_ID_B(jj);
}
*/
/*
for(jj=7;jj<42;jj++) //小于12和大于43的量不需要鉴别 for GN forest 小于6大于70的不需要鉴别for HNM
{
if(jj==38||jj==39||jj==42||jj==43||(jj<=63&&jj>=52)) continue; //wind direction need not
Identify_ID_B(jj); //Bad
}
*/
Btn_Perform->Enabled=false;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
int __fastcall 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::CopyDataFromFile()
{
int ii,jj;
int day,num,kk;
char MYMSG[255];
int MONTH[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int MONTH1[12]={31,29,31,30,31,30,31,31,30,31,30,31};
//2002-5-18 11:30
Start_Num=-1;
kk=0;
for(ii=0;ii<Row;ii++)
{
// if((int)(*(Data[ii]+0)+0.5)!=Year) continue;
// if(*(Data_Flag+ii)!=Column) continue;
if( (int)(*(Data[ii]+0)+0.5)/10!=200)
{
sprintf(MYMSG,"ii=%d:%g %g %g %g!",ii,*(Data[ii]+0),*(Data[ii]+1),*(Data[ii]+2),*(Data[ii]+3));
// Application->MessageBox(MYMSG,"Error!",MB_OK);
continue;
}
if(*(Data[ii]+1)<0) *(Data[ii]+1)*=-1;
if(*(Data[ii]+2)<0) *(Data[ii]+2)*=-1;
num=0;day=0;
for(jj=0;jj<(int)(*(Data[ii]+1)+0.5)-1;jj++)
if((int)(*(Data[ii]+0)+0.5)==2004)
day+=MONTH1[jj];
else
day+=MONTH[jj];
day+=(int)(*(Data[ii]+2)+0.5)-1;
num=day*48+(int)(*(Data[ii]+3)+0.5)*2;
if(*(Data[ii]+4)>29.5&&*(Data[ii]+4)<30.5) num+=1;
/*
if((int)(*(Data[ii]+0)+0.5)==2003) //from 2002
num+=17520;
if((int)(*(Data[ii]+0)+0.5)==2004)
num+=17520+17520; */
if((int)(*(Data[ii]+0)+0.5)==2005) // from 2004
num+=17568;
if((int)(*(Data[ii]+0)+0.5)==2006)
num+=17568+17520;
if((int)(*(Data[ii]+0)+0.5)==2007)
num+=17568+17520+17520;
if(num>=NN_NewData||num<0)
{
sprintf(MYMSG,"ii=%d(num=%d):%g %g %g %g!",ii,num,*(Data[ii]+0),*(Data[ii]+1),*(Data[ii]+2),*(Data[ii]+3));
// Application->MessageBox(MYMSG,"Error!",MB_OK);
continue;
}
if(Start_Num<0) Start_Num=num;
// sprintf(MYMSG,"Start_Num=%d!",Start_Num);
// Application->MessageBox(MYMSG,"Start_Num Message!",MB_OK);
End_Num=num;
for(jj=0;jj<*(Data_Flag+ii);jj++)
*(NewData[num]+jj)=*(Data[ii]+jj);
*(NewData_Flag+num)=*(Data_Flag+ii);
kk++;
}
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void __fastcall TForm1::Identify_ID_B(int NoColumn)
{
int ii,jj,num,nn;
double avg,sd,mul2;
int Out_Flag;
char MYMSG[255];
int NN_AVG1, NN_AVG2 ,Repeat_Times,Times_SD_B;
NN_AVG1=Edit_Before->Text.ToInt();
NN_AVG2=Edit_After->Text.ToInt();
Repeat_Times= ComboBox_Circle->Text.ToInt();
Times_SD_B= ComboBox_SD_Times->Text.ToInt();
if(CheckBoxLongCircle->Checked==true)
for(nn=0;nn<Repeat_Times;nn++) //Long circle
{
num=0;avg=0;mul2=0; Out_Flag=0;
for(ii=0;ii<NN_NewData;ii++)
{
if(fabs(*(NewData[ii]+NoColumn))>NO_VALUE1) continue;
avg=avg*num/(num+1.0)+*(NewData[ii]+NoColumn)/(num+1.0);
mul2=mul2*num/(num+1.0)+*(NewData[ii]+NoColumn)* *(NewData[ii]+NoColumn)/(num+1.0);
num++;
}
if(num<=1||mul2-avg*avg<=1e-10) continue;
sd=sqrt(mul2-avg*avg);
for(ii=0;ii<NN_NewData;ii++)
{
if(fabs(*(NewData[ii]+NoColumn))>NO_VALUE1) continue;
if(fabs(*(NewData[ii]+NoColumn)-avg)>Times_SD_B*sd)
{
*(NewData[ii]+NoColumn)=NO_VALUE_SPIKE;
*(SpikeNum+ii)=*(SpikeNum+ii)+1;
Out_Flag++;
}
}
if(Out_Flag==0&&nn>0) break;
}
if(CheckBoxShortCircle->Checked==true)
for(nn=0;nn<Repeat_Times;nn++) //Short Circle
{
Out_Flag=0;
for(ii=0;ii<NN_NewData;ii++)
{
if(fabs(*(NewData[ii]+NoColumn))>NO_VALUE1) continue;
num=0;avg=0; mul2=0;
for(jj=-NN_AVG1;jj<=NN_AVG2;jj++) // calculate the avg and sd;
{
if((jj+ii)<0||(jj+ii)>=NN_NewData) continue;
if(fabs(*(NewData[ii+jj]+NoColumn))>NO_VALUE1) continue;
avg=avg*num/(num+1.0)+*(NewData[jj+ii]+NoColumn)/(num+1.0);
mul2=mul2*num/(num+1.0)+*(NewData[jj+ii]+NoColumn)* *(NewData[jj+ii]+NoColumn)/(num+1.0);
num++;
}
if(num<=1||mul2-avg*avg<=1e-10) continue;
if(mul2-avg*avg<0||mul2-avg*avg>1e50)
{
sprintf(MYMSG,"Row=%d,Column=%d,num=%d,mul2-avg*avg=%g!",ii,NoColumn,num,mul2-avg*avg);
Application->MessageBox(MYMSG,"Message!",MB_OK);
}
sd=sqrt(mul2-avg*avg);
if(fabs(*(NewData[ii]+NoColumn)-avg)>Times_SD_B*sd) // remove the data due to large deviation
{
*(NewData[ii]+NoColumn)=NO_VALUE_SPIKE;
*(SpikeNum+ii)=*(SpikeNum+ii)+1;
Out_Flag+=1;
if(ii==35)
{
sprintf(MYMSG,"*(NewData[%d]+NoColumn)!",ii,*(NewData[ii]+NoColumn));
Application->MessageBox(MYMSG,"Message!",MB_OK);
}
}
}
if(Out_Flag==0&&nn>0) break;
}
}
//-------------------------------------------------------------------------------
void __fastcall TForm1::Range_Check()
{
int ii,jj;
char MYMSG[2000],TMSG[1000];
/* double Range_Fc1=-10,Range_Fc2=10; // mg/(m^2s)
double Range_LE1=-600,Range_LE2=600; // W/m^2
double Range_Hs1=-600,Range_Hs2=600; // W/m^2
double Range_Tao1=-10,Range_Tao2=10; // kg/(ms^2)
double Range_Ustar1=0,Range_Ustar2=10; */ // m/s
double Range_U1=-20,Range_U2=20; // m/s
double Range_V1=-30,Range_V2=20; // m/s
double Range_W1=-10,Range_W2=10; // m/s
double Range_CO21=0,Range_CO22=2000; // mg/m^3
double Range_H2O1=0,Range_H2O2=100; // g/m^3
double Range_Ts1=-30,Range_Ts2=70; // C
double Range_Press1=80,Range_Press2=120; // kPa
int ZeroNum;
if(Row<=0) return;
//--------------------------------for Guangneung data format for MT
/* */
for(ii=0;ii<NN_NewData;ii++)
{
if(*(NewData[ii]+30)<=Range_U1||*(NewData[ii]+30)>=Range_U2) *(NewData[ii]+30)=NO_VALUE_SPIKE;
if(*(NewData[ii]+31)<=Range_V1||*(NewData[ii]+31)>=Range_V2) *(NewData[ii]+31)=NO_VALUE_SPIKE;
if(*(NewData[ii]+32)<=Range_W1||*(NewData[ii]+32)>=Range_W2) *(NewData[ii]+32)=NO_VALUE_SPIKE;
if(*(NewData[ii]+33)<=Range_CO21||*(NewData[ii]+33)>=Range_CO22) *(NewData[ii]+33)=NO_VALUE_SPIKE;
if(*(NewData[ii]+34)<=Range_H2O1||*(NewData[ii]+34)>=Range_H2O2) *(NewData[ii]+34)=NO_VALUE_SPIKE;
if(*(NewData[ii]+35)<=Range_Ts1||*(NewData[ii]+35)>=Range_Ts2) *(NewData[ii]+35)=NO_VALUE_SPIKE;
if(*(NewData[ii]+36)<=Range_Press1||*(NewData[ii]+36)>=Range_Press2) *(NewData[ii]+36)=NO_VALUE_SPIKE;
ZeroNum=0;
for(jj=0;jj<Column;jj++)
if( fabs(*(NewData[ii]+jj))<1e-10) ZeroNum++;
if(ZeroNum>Column-6)
for(jj=6;jj<Column;jj++)
*(NewData[ii]+jj)=*(NewData[ii]+jj)=NO_VALUE_SPIKE;
}
//--------------------------------for Guangneung data format for ST
/*
for(ii=0;ii<NN_NewData;ii++)
{
if(*(NewData[ii]+38)<=Range_U1||*(NewData[ii]+38)>=Range_U2) *(NewData[ii]+38)=NO_VALUE_SPIKE;
if(*(NewData[ii]+39)<=Range_V1||*(NewData[ii]+39)>=Range_V2) *(NewData[ii]+39)=NO_VALUE_SPIKE;
if(*(NewData[ii]+37)<=Range_W1||*(NewData[ii]+37)>=Range_W2) *(NewData[ii]+37)=NO_VALUE_SPIKE;
if(*(NewData[ii]+40)<=Range_CO21||*(NewData[ii]+40)>=Range_CO22) *(NewData[ii]+40)=NO_VALUE_SPIKE;
if(*(NewData[ii]+41)<=Range_H2O1||*(NewData[ii]+41)>=Range_H2O2) *(NewData[ii]+41)=NO_VALUE_SPIKE;
if(*(NewData[ii]+42)<=Range_Ts1||*(NewData[ii]+42)>=Range_Ts2) *(NewData[ii]+42)=NO_VALUE_SPIKE;
if(*(NewData[ii]+44)<=Range_Press1||*(NewData[ii]+44)>=Range_Press2) *(NewData[ii]+44)=NO_VALUE_SPIKE;
ZeroNum=0;
for(jj=0;jj<Column;jj++)
if( fabs(*(NewData[ii]+jj))<1e-10) ZeroNum++;
if(ZeroNum>Column-6)
for(jj=6;jj<Column;jj++)
*(NewData[ii]+jj)=*(NewData[ii]+jj)=NO_VALUE_SPIKE;
}
*/
//--------------------------------for Hannam data format
/*
for(ii=0;ii<NN_NewData;ii++)
{
if(*(NewData[ii]+58)<=Range_U1||*(NewData[ii]+58)>=Range_U2) *(NewData[ii]+58)=NO_VALUE_SPIKE;
if(*(NewData[ii]+59)<=Range_V1||*(NewData[ii]+59)>=Range_V2) *(NewData[ii]+59)=NO_VALUE_SPIKE;
if(*(NewData[ii]+60)<=Range_W1||*(NewData[ii]+60)>=Range_W2) *(NewData[ii]+60)=NO_VALUE_SPIKE;
if(*(NewData[ii]+61)<=Range_CO21||*(NewData[ii]+61)>=Range_CO22) *(NewData[ii]+61)=NO_VALUE_SPIKE;
if(*(NewData[ii]+62)<=Range_H2O1||*(NewData[ii]+62)>=Range_H2O2) *(NewData[ii]+62)=NO_VALUE_SPIKE;
if(*(NewData[ii]+63)<=Range_Ts1||*(NewData[ii]+63)>=Range_Ts2) *(NewData[ii]+63)=NO_VALUE_SPIKE;
if(*(NewData[ii]+64)<=Range_Press1||*(NewData[ii]+64)>=Range_Press2) *(NewData[ii]+64)=NO_VALUE_SPIKE;
ZeroNum=0;
for(jj=0;jj<Column;jj++)
if( fabs(*(NewData[ii]+jj))<1e-10) ZeroNum++;
if(ZeroNum>Column)
for(jj=0;jj<Column;jj++)
*(NewData[ii]+jj)=*(NewData[ii]+jj)=NO_VALUE_SPIKE;
} */ /*
for(ii=0;ii<NN_NewData;ii++)
{
for(jj=7;jj<=14;jj++)
if(*(NewData[ii]+jj)<=Range_CO21||*(NewData[ii]+jj)>Range_CO22) *(NewData[ii]+jj)=NO_VALUE_SPIKE;
for(jj=15;jj<=22;jj++)
if(*(NewData[ii]+jj)<=Range_H2O1||*(NewData[ii]+jj)>Range_H2O2) *(NewData[ii]+jj)=NO_VALUE_SPIKE;
} */
}
//--------------------------------------------------------------------------------
void __fastcall TForm1::CheckBoxShortCircleClick(TObject *Sender)
{
if(CheckBoxShortCircle->Checked==true)
{
Edit_Before->Enabled=true;
Edit_After->Enabled=true;
Label_Before->Enabled=true;
Label_After->Enabled=true;
}
else
{
Edit_Before->Enabled=false;
Edit_After->Enabled=false;
Label_Before->Enabled=false;
Label_After->Enabled=false;
}
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -