当edit1至edit10中有任意个edit的值(不确定)是空的如何取平均值放在editzh中? ( 积分: 50 )

  • 主题发起人 主题发起人 huxhang
  • 开始时间 开始时间
H

huxhang

Unregistered / Unconfirmed
GUEST, unregistred user!
我有个问题请教:
当edit1至edit10中有任意个edit的值(不确定)是空的如何取平均值放在editzh中?
10个edit,如果有n个是空的,那平均值的分母是10-n,
分母是依据非空值的edit的个数而定。下面的代码,当edit1-edit10中有一个空值,就完蛋。
editzh.text:=inttostr((
1/strtoint(trim(edit1.text))
1/strtoint(trim(edit2.text))
+1/strtoint(trim(edit3.text))
+1/strtoint(trim(edit4.text))
+1/strtoint(trim(edit5.text))
+1/strtoint(trim(edit6.text))
+1/strtoint(trim(edit7.text))
+1/strtoint(trim(edit8.text))
+1/strtoint(trim(edit9.text))
+1/strtoint(trim(edit10.text))/(10-n))
 
var
// iCount 合法的个数
// iSum 总和
iCount,iSum,iE,i: Integer;
begin
iCount := 0;
iSum := 0;

Val(Trim(Edit1.Text), i, iE);
if iE = 0 then begin
Inc(iSum,i);
Inc(iCount);
end;

...........

Val(Trim(Edit10.Text), i, iE);
if iE = 0 then begin
Inc(iSum,i);
Inc(iCount);
end;

editzh.Text := IntToStr(iSum div iCount);
end;

//如果 Edit1 .. Edit10 的名字有规律,就可以用循环来简约代码
 
procedure TForm1.Button1Click(Sender: TObject);
var
i,t:integer;
g:Double;
begin
t:=0;
g:=0;
for i:=1 to 10 do
begin
if Trim((Findcomponent('edit'+inttostr(i)) as TEdit).Text)<>'' then
begin
t:=t+1;
g:=g+1/StrToFloat((Findcomponent('edit'+inttostr(i)) as TEdit).Text);
end;
end;
showmessage(FloatToStr(g/t)); // editzh.text:=FloatToStr(g/t);
end;

//结贴是一种责任,也是对别人劳动的尊重.楼主55个问题未结贴.
 
55个未结帖,晕!
看来这个就是楼主的第 55 个未结帖子了。
顺便问一下楼主第 56 个什么时候出来?
 
很简单的问题
随便说一下,楼主求平均的方法是错的 (a+b)/2=1/a+1/b ???
 
原来要结帖,不知道啊
 
liyinwei的答案有点问题:
平均值总免不了是浮点
改成这样ok!
var
// iCount 合法的个数
// iSum 总和
iCount,iSum,iE,i: Integer;
allSum: Double;
begin
iCount := 0;
iSum := 0;

Val(Trim(Edit1.Text), i, iE);
if iE = 0 then begin
Inc(iSum,i);
Inc(iCount);
end;

Val(Trim(Edit2.Text), i, iE);
if iE = 0 then begin
Inc(iSum,i);
Inc(iCount);
end;

Val(Trim(Edit3.Text), i, iE);
if iE = 0 then begin
Inc(iSum,i);
Inc(iCount);
end;

Val(Trim(Edit4.Text), i, iE);
if iE = 0 then begin
Inc(iSum,i);
Inc(iCount);
end;

Val(Trim(Edit5.Text), i, iE);
if iE = 0 then begin
Inc(iSum,i);
Inc(iCount);
end;
allsum:=strtofloat(inttostr(isum)) ;


editzh.Text :=formatfloat('0.0000',allSum/iCount);// IntToStr(iSum div iCount);
end;
 
后退
顶部