【发布时间】:2013-03-23 20:09:31
【问题描述】:
我正在创建一个使用 AMB MyLaps 解码器 P3 协议的应用程序。
我想不出一种根据圈数和圈速对赛车手进行分类的方法。例如,第 1 位的人跑了 3 圈,第 2 位的人跑了 2 圈。但是,我如何订购 2 人在同一圈的情况?
这是我用来保存信息的记录:
type
TTimingRecord = record
position: integer;
transId: integer;
racerName: string;
kartNumber: integer;
lastPassingN: integer;
laps: integer;
lastRTCTime: TDateTime;
bestTimeMs: Extended;
lastTimeMs: Extended;
gapTimeMs: Extended;
splitTimeMs: Extended;
timestamp: TDateTime;
end;
为每位赛车手创造一个新纪录。
我目前使用的代码是:
procedure sortRacers();
var
Pos, Pos2: Integer;
Temp: TTimingRecord;
GapTime: Extended;
begin
for Pos := 0 to length(DriversRecord)-1 do
begin
for Pos2 := 0 to Length(DriversRecord)-2 do
begin
if(DriversRecord[Pos2].laps < DriversRecord[Pos2+1].laps)then
begin
Temp := DriversRecord[Pos2];
DriversRecord[Pos2] := DriversRecord[Pos2+1];
DriversRecord[Pos2+1] := Temp;
end
else if DriversRecord[Pos2].laps = DriversRecord[Pos2+1].laps then
begin
if DriversRecord[Pos2].lastRTCTime > DriversRecord[Pos2+1].lastRTCTime then
begin
Temp := DriversRecord[Pos2];
DriversRecord[Pos2] := DriversRecord[Pos2+1];
DriversRecord[Pos2+1] := Temp;
end;
end;
end;
end;
for pos := 1 to length(DriversRecord) -1 do //Gap Time
begin
if DriversRecord[Pos].laps = DriversRecord[0].laps then
begin
DriversRecord[Pos].gapTimeMs := DriversRecord[Pos].lastRTCTime - DriversRecord[0].lastRTCTime;
DriversRecord[Pos].splitTimeMs := DriversRecord[Pos].lastRTCTime - DriversRecord[Pos-1].lastRTCTime;
end;
end;
end;
但效果不太好:)
【问题讨论】:
-
首先你需要把排序和比较分开。编写(或查找)排序方法。然后写一个方法来比较。然后将两者放在一起。像这样将它们混合在一起是无处可去的。
-
所以我使用简单的冒泡排序重写了排序方法...
procedure sortRacers2(); var i,x: integer; Temp: TTimingRecord; begin for i := 0 to length(DriversRecord)-2 do begin for x := i to length(DriversRecord)-1 do begin if DriversRecord[i].laps < DriversRecord[x].laps then begin Temp := DriversRecord[i]; DriversRecord[i] := DriversRecord[x]; DriversRecord[x] := Temp; end; end; end; end;我现在如何使用 lastRTCTime 考虑同一圈的那些?
标签: delphi sorting datetime racing