Delphi(object Pascal)中的数组使用变量?

Arrays in Delphi (object Pascal) using variables?

我在文本文件中有这 10 个数字(每行一个),我需要从最高数字开始按时间顺序对它们进行排序。我写了一个工作正常的代码,但问题是代码不灵活,因为一旦我向文本文件添加另一个数字,它就不会工作,因为代码设置为仅对 10 个数字进行排序......这是由于我的整数数组应该在排序过程开始之前读取值,但不允许我向数组的属性添加变量,因此它将能够读取和排序任何大小的文本文件。 .我知道必须有一种方法可以制作一个可以对这种结构的任何大小的文件进行排序的程序,请告诉我如何改进我的代码。 (如果你认为我的方法不太有效,那是因为那是我高中的作业,我需要使用这些数组来实现冒泡排序)。

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  numbers, sortednumbers : TextFile;
  count : integer=0;
  number : array[1..10] of integer;
  I : integer;

Procedure Swap(var X, Y : Integer);
  var
  Temp : integer;
  begin
    Temp := X;
    X := Y;
    Y := Temp;
  end;

procedure Assign;
  var I : Integer;
  begin
    reset(numbers);
    for I := 1 to count do ReadLn(numbers, number[I]);
  end;

procedure BubbleSort;
  var I, J : integer;
  begin
    for I := 2 to count do
    begin
     for J := count downto I do
     if (number[J] > number[J - 1]) then
     Swap(number[J - 1], number[J]);
    end;
  end;

begin
  AssignFile(numbers, 'Numbers.txt');
  AssignFile(sortednumbers, 'Sorted-Numbers.txt');
  Reset(numbers);
  While not EoF(numbers) do
    begin
    ReadLn(numbers);
    Inc(count);
    end;
  Reset(numbers);
  ReWrite(sortednumbers);
  Assign;
  BubbleSort;
  For I := 1 to count do writeln(sortednumbers, number[I]);
  CloseFile(numbers);
  CloseFile(sortednumbers);
end.

使用一个dynamic array。这是一个数组,可以改变它持有的元素数量。

而不是声明:

number : array[1..10] of integer;

而是跳过边界声明:

Number : array of integer;

然后,在开始使用之前,设置它的长度:

SetLength(Number, 10);

完成后,通过将其长度设置为 0 来释放内存:

SetLength(Number, 0);

注意:

  • 动态数组的索引从0开始,不是1。即Number[0]是第一个元素,Number[9]是第十个元素。这在编程中很常见,但如果您以前没有遇到过,可能会感到困惑。
  • 您还可以对代码进行其他 'quality' 更改。正如评论者 David Heffernan 所说,停止使用全局变量。我还建议使用 try/finally for resource allocation and cleanup, and using streams (and another link,将其包裹在 TFileStream) 而不是您当前正在执行的旧式文件 IO。此外,请考虑您的变量名称 - Number 对于数字数组是奇数 - 为什么不添加 S 并将其命名为 Numbers,例如?

一次可能有点多,所以慢慢来,小步走,经常保存和备份(最好进入源代码管理),玩得开心!

如果不是学校项目:

function Comparer(List: TStringList; index1, index2: integer): integer;
begin
  try
    Result:= StrToInt(List[index1]) - StrToInt(List[Index2]);
  except
    raise Exception.Create('Your file does not contain numbers'); 
  end;
end;

function SortNumbers
var
  lStringList: TStringlist;
begin
  lStringList := TStringlist.create;
  try
    lStringList.LoadFromFile('Numbers.txt');
    lStringList.CustomSort(Comparer);
    lStringList.SaveToFile('Sorted-Numbers.txt');
  finally
    lStringList.Free;
  end;
end;

但是 Delphi RTL 使用 Quicksort,而不是冒泡排序。