我试图制作一个接受用户输入的方形大小的拉丁方方案(例如输入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上发生的任何搞砸而感到抱歉。
答案 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
变为6
,0
变为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: