本系统设计方案如下:
1.将全年的时间以分钟为单位连接成一条链表;
2.将各时段的降水量分摊到每一分钟的水坑中;
3.有了以上的数据结构,就可以方便的对降水量进行各种方式的统计;
到目前为止对降水量分摊算法已调整三次
第一次:本算法在2008年4月14日前,没有发现问题
procedure DecodePLtoMec(PH:PPminrec;BT,ET:TDateTime;PL:Real;Pw,Ps:Integer;mnum,hbindex:Integer);
var Pt:PPminrec;
Pv:real;
begin//分摊降水量
Pv:=PL/mnum;//每分钟的降水量
Pt:=PH;
while ((Pt<>nil)and(Pt^.minrec.T<BT))do begin
Pt:=Pt^.next;
end;//找到了时段开始时间
while Pt^.minrec.T<ET do//最后一点存储下一时段降水量
begin
Pt^.minrec.P:=Pv;
Pt^.minrec.PW:=Pw;
Pt^.minrec.PS:=Ps;
Pt^.minrec.hbindex:=hbindex;
Pt:=Pt^.next;
end;
Pt_SegB:=Pt;//作为下一段的开始时间
end;
第二次:以上算法在2008年4月15日进行人工雨量站数据处理发现问题,改成以下算法
procedure DecodePLtoMec(PH:PPminrec;BT,ET:TDateTime;PL:Real;Pw,Ps:Integer;mnum,hbindex:Integer);
var Pt,Pe:PPminrec;
Pv:real;
begin//分摊降水量
Pv:=PL/mnum;//每分钟的降水量
Pt:=PH;
Pe:=Pt; //20080415增加 赋初值
while ((Pt<>nil)and(Pt^.minrec.T<BT))do begin
Pe:=Pt;Pt:=Pt^.next;
end;//找到了时段开始时间
Pt:=Pe;//20080415增加
while Pt^.minrec.T<ET do//最后一点存储下一时段降水量
begin
Pt^.minrec.P:=Pv;
Pt^.minrec.PW:=Pw;
Pt^.minrec.PS:=Ps;
Pt^.minrec.hbindex:=hbindex;
Pt:=Pt^.next;
end;
Pt_SegB:=Pt;//作为下一段的开始时间
end;
第三次:以上算法在2008年4月16日被发现问题,以前计算正确的数据计算错误了,改成以下算法
procedure DecodePLtoMec(PH:PPminrec;BT,ET:TDateTime;PL:Real;Pw,Ps:Integer;mnum,hbindex:Integer);
var Pt,Pe:PPminrec;
Pv:real;
begin//分摊降水量
Pv:=PL/mnum;//每分钟的降水量
Pt:=PH;
Pe:=Pt; //20080415增加 赋初值
while ((Pt<>nil)and(Pt^.minrec.T<BT))do begin //如07:59 <08:00;则下一分钟08:00终止,应从终止指针开始分配
Pe:=Pt;
Pt:=Pt^.next;
end;//找到了时段开始时间
Pt:=Pe; //20080417增加
if ((Pt^.minrec.T+1/(24*60*10))<BT) then begin
Pt:=Pt^.next;
end;
while Pt^.minrec.T<ET do//最后一点存储下一时段降水量
begin
Pe:=Pt; //20080417增加 保存前一个地址
Pt^.minrec.P :=Pv;
Pt^.minrec.PW:=Pw;
Pt^.minrec.PS:=Ps;
Pt^.minrec.hbindex:=hbindex;
Pt:=Pt^.next;
end;
Pt_SegB:=Pe;//以前Pt作为下一段的开始时间
end;