用Delphi编程拉丁方?

时间:2017-06-10 17:57:29

标签: delphi pascal

我试图制作一个接受用户输入的方形大小的拉丁方方案(例如输入5将生成拉丁方5x5),然后将格式化的方格输出给用户。

如果您不知道拉丁广场是什么或想要查看我设置的实际任务,look no further

我稍微编了一些,但我在第一道障碍时失败了。教师没有提供帮助,你很多是我唯一的希望。

uses
  System.SysUtils;

var
  // Variables

  // 2D array, size defined in main code
  Square: array of array of integer;
  // Integer holding the square size
  SquareSize: integer;

begin
  // Introduction
  writeln('This program will generate a Latin Squar of a size designated by you.');
  // Ask for user input, receive and store in a variable
  write('Enter the size of the Latin Square (1 value): ');
  readln(SquareSize);
  // More user friendly garbage
  writeln('Latin Square size: ', SquareSize, ' x ', SquareSize, '.');

  // Calculations

  // Set size of the 2D array to user designated dimensions
  setlength(Square, SquareSize, SquareSize);

end.

在最后一行代码(setlength)之后,我想将新2D数组中的所有值设置为用户输入的数字。我想。

除此之外,我不知道我在做什么。

如果您想帮助我,请尽量让它尽可能简单,以便我能理解吗?

对于第一次在Stack Overflow上发生的任何搞砸而感到抱歉。

2 个答案:

答案 0 :(得分:3)

您提供的link也给出了答案,请参阅下面的代码。

program LatinSquare;

{$APPTYPE CONSOLE}

type 
  TSquare = array of array of Integer;

procedure WriteLatinSquare(var Square: TSquare; N: Integer);
var
  X, Y: Integer;
begin
  { Allocate and fill the square array. }
  SetLength(Square, N, N);
  for Y := 0 to High(Square) do
    for X := 0 to High(Square[Y]) do
      Square[X, Y] := (Y + X) mod N + 1;

  { Display the Square array. }
  for Y := 0 to High(Square) do
  begin
    for X := 0 to High(Square[Y]) do
      Write(Square[X, Y]:3);
    Writeln;
  end;
  Writeln;
end;

var
  Square: TSquare;
  SquareSize: Integer;

begin
  SquareSize := 6;
  WriteLatinSquare(Square, SquareSize);
  Readln;
end.

正如链接所说:从1 2 3 4 5 6开始,然后下一行,移一,所以变为2 3 4 5 6 1等......这就是第一部分({{1} }},X循环):它填充了正方形。

当然,Y可以超过Y + X的限制(我稍后会添加0..5),因此您使用1来包装值,所以mod变为60变为7等。实际上:

1

然后你添加1,所以取代1st line: 0+0=0 -> 0, 0+1=1 -> 1, 0+2=2 -> 2, 0+3=3 -> 3, 0+4=4 -> 4, 0+5=5 -> 5 2nd line: 1+0=1 -> 1, 1+1=2 -> 2, 1+2=3 -> 3, 1+3=4 -> 4, 1+4=5 -> 5, 1+5=6 -> 0 3rd line: 2+0=2 -> 2, 2+1=3 -> 3, 2+2=4 -> 4, 2+3=5 -> 5, 2+4=6 -> 0, 2+5=7 -> 1 etc... 而不是0 1 2 3 4 5

例程的第二部分只打印1 2 3 4 5 6数组。

如果您不需要保存正方形,可以在一个部分中完成:

Square

输出(N = 6):

procedure WriteMagicSquare2(N: Integer);
var
  X, Y: Integer;
begin
  for Y := 0 to N - 1 do
  begin
    for X := 0 to N - 1 do
      Write((Y + X) mod N + 1, ' ');
    Writeln;
  end;
  Writeln;
end;

答案 1 :(得分:0)

假设你在我的学校,这是我从同一本书中逐字逐句的确切作业。注意上面的代码我将添加一个点,拉丁方块大小应该是用户输入的,所以在最后一段代码中将其更改为:

  var
  Square: TSquare;
  X, UserI, SquareSize: Integer;

begin
  X := 0;
  Writeln('type -1000 to stop the loop');
  repeat
    Writeln('What size square do you want?');
    readln(UserI);
    if UserI = -1000 then
    begin
      goto gotolable;
    end

    else
      SquareSize := UserI;
    WriteLatinSquare(Square, SquareSize);
    writeln ('Press enter to do another Latin square');
    readln;
  until X = 1;
gotolable: