【问题标题】:sorting a file of records error对记录文件进行排序错误
【发布时间】:2013-05-08 14:02:50
【问题描述】:

我需要对记录文件进行排序,但我不太确定如何去做。我有一个记录文件,我尝试使用简单的冒泡排序对它们进行排序,但我被卡住了,需要一些帮助。谁能帮助我?我将在下面列出代码。

HighScoreFile = file of HighScoreRecord;


var
frmEnterDetails: TfrmEnterDetails;
HighScoreMasterFile: HighScoreFile;
HighScore:HighScoreRecord;
FileArray:array[1..20] of HighScoreRecord;
i:integer;

Procedure Sort
var
  i,j,temp:integer;

AssignFile(HighScoreMasterFile, 'HighScores.dat');
Reset(HighScoreMasterFile);
while not eof(HighScoreMasterFile) do
begin    
  i:=i+1;
  read(HighScoreMasterFile, HighScore);
  FileArray[i].Name:=HighScore.Name;
  FileArray[i].Date:=HighScore.Date;
  FileArray[i].FinalScore:=HighScore.FinalScore;

  for i:=0 19 do
    for j:=0 to 18 do
      if FileArray[j].Score > FileArray[j+1].Score then
        begin
          FileArray[temp]:=FileArray[j];
          FileArray[j]:=FileArray[j+1];
          FileArray[j+1]:=FileArray[temp];
       end;
end;

任何帮助都会很棒。

【问题讨论】:

  • 您的排序过程不完整。 i 未初始化。索引 FileArray 应该在你的 for 循环中从 1 开始。 temp 从未初始化。 i 从未在 for 循环中使用。等等
  • 您也可以在读取文件期间进行排序。读取整个文件,然后进行排序。
  • 谢谢大家的帮助
  • 请不要关闭这个帖子,因为我只能在明天的学校测试它
  • 有一些小细节可以改进:(1)您可以直接从 HighScoreMasterFile 读取到 FileArray[i],无需 HighScore 变量。 (2) 排序部分可以用'i'代替'temp'。

标签: delphi record pascal bubble-sort


【解决方案1】:

可能 100% 不正确,我没有在 IDE 中测试。您可以使用调试器来逐步查看该算法是如何工作的。这个链接也很好地解释了冒泡排序是如何工作的http://delphi.wikia.com/wiki/Bubble_sort

    HighScoreFile = file of HighScoreRecord;


    var
    frmEnterDetails: TfrmEnterDetails;
    HighScoreMasterFile: HighScoreFile;
    HighScore:HighScoreRecord;
    FileArray:array[1..20] of HighScoreRecord;
    i:integer;

    Procedure Sort
    var
      i,j,temp:integer;
    begin
    AssignFile(HighScoreMasterFile, 'HighScores.dat');
    Reset(HighScoreMasterFile);
    i := 0;
    while not eof(HighScoreMasterFile) do
    begin    
      i:=i+1;
      read(HighScoreMasterFile, HighScore);
      FileArray[i].Name:=HighScore.Name;
      FileArray[i].Date:=HighScore.Date;
      FileArray[i].FinalScore:=HighScore.FinalScore;
    end;

      for i:=1 to 19 do
        for j:=1 to 18 do
          if FileArray[i].Score > FileArray[j+1].Score then
            begin
              temp := i;
              HighScore := FileArray[temp];
              FileArray[temp]:=FileArray[j];
              FileArray[j]:=HighScore;
           end;
  end;

【讨论】:

  • 使用标签显示数组,我会使用这样的东西吗? lblScore1.Caption:=FileArray[1].HighSore.FinalScore
猜你喜欢
  • 2018-04-29
  • 2022-01-18
  • 2019-08-04
  • 2011-07-02
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
相关资源
最近更新 更多