delphi 循环比较

TZX100 2008-06-02 05:43:27
在delphi memo1中有这些内容:
02L0097H 2 77.018
02L0098H 2 73.802
02L0099H 2 72.437
03L0097H 3 77.245
03L0098H 3 70.354
03L0099H 3 68.533
04L0097H 4 81.41
04L0098H 4 78.267
04L0099H 4 75.295
2,3,4,三组数,比较各对应的行(97H,98H,99H)的第三个数,如果第3组数的三行的数都在对应的,第2组数的三行的数的+/-0.5范围以内,则删除这二组数,继续查找有没有其它组数的各行在第4组各行的+/-0.5范围以内,找不到则退出!
...全文
542 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
喝口水 2008-06-03
  • 打赏
  • 举报
回复
type
ARecord=record
a,b,c:double;
end;
var
R1,R2:ARecord;

function GetNum(str:string):double;
var
ss:TStringList;
begin
ss:=TStringlist.Create;
ss.Delimiter:=' ';
ss.DelimitedText:=str;
result:=strtofloat(trim(ss[2]));
ss.Free;
end;

procedure dodo(memo:TMemo);
var
i,k:integer;
rr:ARecord;
begin
k:=1;
for i:=0 to memo.Lines.Count-1 do
begin
if i<3 then
begin
if k=1 then
begin
rr.a:=GetNum(memo.Lines[i]);
inc(k);
end;
if k=2 then
begin
rr.b:=GetNum(memo.Lines[i]);
inc(k);
end;
if k=3 then
begin
rr.c:=GetNum(memo.Lines[i]);
k:=1;
R2:=rr;
end;
end else begin
if k=1 then
begin
rr.a:=GetNum(memo.Lines[i]);
inc(k);
end;
if k=2 then
begin
rr.b:=GetNum(memo.Lines[i]);
inc(k);
end;
if k=3 then
begin
rr.c:=GetNum(memo.Lines[i]);
k:=1;
R1:=R2;
R2:=rr;
if (abs(r2.a-r1.a)<0.5)and(abs(r2.b-r1.b)<0.5)and(abs(r2.c-r1.c)<0.5) then
begin
memo.Lines.Delete(i-3);
memo.Lines.Delete(i-4);
memo.Lines.Delete(i-5);
end;
end;
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
dodo(memo1);
end;
mygodsos 2008-06-03
  • 打赏
  • 举报
回复
还是不明白
喝口水 2008-06-03
  • 打赏
  • 举报
回复
终算说明白了,晚上帮你做做
TZX100 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 gzmhero 的回复:]
引用 1 楼 gzmhero 的回复:
好难理解。。。,有点看明白了。


以为看明白了,发现还是没明白。

Memo1中有很多组这样的数据么?
第三组和第二组比较,那么第四组和哪组比较?和第五组么?那么就是2*n+1和2*n组比较?

想要的输出结果是处理后的Memo1内容么?


.........理解问题比解决问题还难!
[/Quote]
不好意思,想说简单点,没描述清楚!
是有很多组,第二组先和第三组比,附合条件,则记录下这二组到Memo2中并删除这二组,继续找第四组与之条件相附的;如第二组和第三组不附合则第二组和第四组,第五组比,至到有附合条件的,如第二组全部比完都没有附合的,则记录第二组到Memo3中,继续第三组重复上面动作!
TZX100 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 gzmhero 的回复:]
怎样比较,你说的是3组和2组比较,关4组啥事?

看了你的描述心堵的慌。。。。
[/Quote]
兄弟,冷静!!我描述不清,把你急出事来我可过意不去!


memo1中只写了三组,事实上有更多组,写多了怕更不好看!
gzmhero 2008-06-03
  • 打赏
  • 举报
回复
怎样比较,你说的是3组和2组比较,关4组啥事?

看了你的描述心堵的慌。。。。
TZX100 2008-06-03
  • 打赏
  • 举报
回复
是每三组一比较!
找出相符的一对后删除,再重来
大大怪老张 2008-06-03
  • 打赏
  • 举报
回复
// 这是每三组一个单元进行比较的:

procedure TForm1.Test1;
var
i, j : Integer;
secndgroup, thdgroup : array [0..2] of TStringList;
begin
for i := 0 to 2 do
begin
secndgroup[i] := TStringList.Create;
secndgroup[i].Delimiter := ' ';

thdgroup[i] := TStringList.Create;
thdgroup[i].Delimiter := ' ';
end;

i := 1;

while i <= memo1.Lines.Count - 9 do
begin
secndgroup[0].DelimitedText := memo1.Lines[i + 3];
secndgroup[1].DelimitedText := memo1.Lines[i + 4];
secndgroup[2].DelimitedText := memo1.Lines[i + 5];

thdgroup[0].DelimitedText := memo1.Lines[i + 6];
thdgroup[1].DelimitedText := memo1.Lines[i + 7];
thdgroup[2].DelimitedText := memo1.Lines[i + 8];

if (Abs(StrToFloat(thdgroup[0].Strings[2]) - StrToFloat(secndgroup[0].Strings[2])) < 0.5)
and (Abs(StrToFloat(thdgroup[1].Strings[2]) - StrToFloat(secndgroup[1].Strings[2])) < 0.5)
and (Abs(StrToFloat(thdgroup[2].Strings[2]) - StrToFloat(secndgroup[2].Strings[2])) < 0.5) then
begin
memo1.Lines.Delete(i + 3);
memo1.Lines.Delete(i + 3);
memo1.Lines.Delete(i + 3);
Inc(i, 6);
end
else
Inc(i, 9);

end;

for i := 0 to 2 do
begin
FreeAndNil(secndgroup[i]);
FreeAndNil(thdgroup[i]);
end;
end;
大大怪老张 2008-06-03
  • 打赏
  • 举报
回复
是每三组一比较嘛?

k,这问题描述的真...无法形容!
大大怪老张 2008-06-03
  • 打赏
  • 举报
回复
奇怪为什么是第三组与第二组比,而不是后一组比前一组呢?
gzmhero 2008-06-03
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gzmhero 的回复:]
好难理解。。。,有点看明白了。
[/Quote]

以为看明白了,发现还是没明白。

Memo1中有很多组这样的数据么?
第三组和第二组比较,那么第四组和哪组比较?和第五组么?那么就是2*n+1和2*n组比较?

想要的输出结果是处理后的Memo1内容么?


.........理解问题比解决问题还难!
阿三 2008-06-03
  • 打赏
  • 举报
回复
一看算法头就大,呵
TZX100 2008-06-03
  • 打赏
  • 举报
回复
第2组数----第3组数 相附
第4组数----第6组数 相附
第5组数----第8组数 相附

那种显示结果都可以自己改。

主要的是每组数只要找到一个匹配的就可以了!
喝口水 2008-06-03
  • 打赏
  • 举报
回复
你要显示什么样的一个结果,把结果举个例子出来
TZX100 2008-06-03
  • 打赏
  • 举报
回复
hys_427

每组数只要找到一个匹配的就可以了,如果第2组数还和第4组数匹配也不显示
喝口水 2008-06-03
  • 打赏
  • 举报
回复
每组数是不是只要找到一个匹配的就可以了,如果第2组数还和第4组数匹配还显示不显示?
喝口水 2008-06-03
  • 打赏
  • 举报
回复
如果你确保每组数是3个一组的话,是不会出现索引超出范围这种错误的
你确信是要的这种结果吗
第2组数----第3组数 相附
第4组数----第6组数 相附
第5组数----第8组数 相附

你意思表达不清,让我改了好几次代码
喝口水 2008-06-03
  • 打赏
  • 举报
回复
你上面说的是
则记录下这二组到Memo2中并删除这二组
所以我才那样写的
zdlou 2008-06-03
  • 打赏
  • 举报
回复
汗。。。。没看懂
先导到数据库,再用SQL语句吧。。。。
TZX100 2008-06-03
  • 打赏
  • 举报
回复
hys_427

出错了,
如果第二组数和他后面所的的组数都附合条件,
你那代码结果是:
第2组数
第3组数
第2组数
第4组数
第2组数
第5组数
一直排下去 而且还提示:list index out of bounds(索引超出范围)

我想每一组数只要找到一个与他相附的就行,比如这种结果:

第2组数----第3组数 相附
第4组数----第6组数 相附
第5组数----第8组数 相附
加载更多回复(10)
Delphi 跳出循环的几种方法Delphi 跳出循环的几种方法 我常用的几种方法 希望大家看看 那个是大家常用的而且比较不错的 以下是引用片段: Delphi中break,exit,abort跳出循环比较 exit: 退出函数体 abort: 遇到异常,安静处理,就是不显示不提示 break: 退出当前循环体,包括for ,while, repeat等循环体 continue: 结束循环内的本次处理,继续从循环体的开始位置继续执行 Exit 是跳出当前代码块,也就是当前函数,跳出后是要继续向下执行的(如果有后续代码)。 Abort 是从 EAbort 过来的,可以激发 exception,其实质就是 Abort = RaiseException(),是一个不出现对话框的异常。所以 Abort 的行为和异常是一样的,其代码执行顺序也是follow异常的流程。 例如: try (1) //执行了 abort; (2) //不执行 exception (3) //执行了 end; 用 Abort 能够执行 exception 里边的代码,但是如果用 Exit,就直接离开,不管 exception。 delphi中表示跳出的有break,exit,abort。 【break】 离开循环 只能放在循环中 【exit】 跳出本模块(过程和函数),放在循环中是跳出循环在所在的模块。 【abort】 中止程序的运行,产生不报错的异常信息。跳出祖先模块。和【exit】的区别是 procedure p1; begin p2; p3; end; procedure p2; begin abort; //exit; end; procedure p3; begin //showmessage().. end; 如果用 Abort,则执行不到 P3,如果用 Exit 就能够执行到 P3。

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧