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

Fil*_*lik 1 arrays delphi sorting pascal bubble-sort

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

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.
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 7

使用动态数组.这是一个可以更改它所包含的元素数量的数组.

而不是声明:

number : array[1..10] of integer;
Run Code Online (Sandbox Code Playgroud)

而是跳过边界声明:

Number : array of integer;
Run Code Online (Sandbox Code Playgroud)

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

SetLength(Number, 10);
Run Code Online (Sandbox Code Playgroud)

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

SetLength(Number, 0);
Run Code Online (Sandbox Code Playgroud)

注意:

  • 动态数组的索引从0开始,而不是1.也就是说,它Number[0]是第一个元素,Number[9]是第十个元素.这在编程中很常见,但如果它不是你以前遇到的东西,可能会让人感到困惑.
  • 您还可以对代码进行其他"质量"更改.正如评论者David Heffernan所说,停止使用全局变量.我还建议使用try/finally进行资源分配和清理,并使用流(和另一个链接,将其包装完毕TFileStream)而不是您当前正在执行的旧式文件IO.另外,考虑一下你的变量名 - Number对于一个数组是奇数 - 为什么不添加S并调用它Numbers,例如?

这可能是一点一点,所以慢慢地,小步骤,经常保存和备份(最好是源代码控制),玩得开心!