反转数组中的字符串
Reverse strings in an array
procedure ReverseArray(var A : array of string);
var I,J,L : integer;
begin
for I := Low(A) to High(A) do
begin
L := length(A[I]);
for J := L downto 1 do M := M + A[I];
end;
writeln(M);
end;
begin
for I := 1 to 4 do readln(T[I]);
ReverseArray(T);
sleep(40000);
end.
我想在这里做的基本上是反转数组中的每个字符串,但我做不到,上面的代码所做的基本上是重复单词取决于它们的长度(我写 'bob' 在数组中,该过程将给我 'bob' 三次,因为长度是 3) ...不确定为什么它不能正常工作以及我缺少什么
字符串是一个 char 数组,添加了一些额外的功能。
所以 array of string
很像 array of array of char
.
如果要反转字符串,则必须访问每个字符并将其反转。
procedure ReverseArray(var A : array of string);
var
i,j,Len : integer;
B: string;
begin
for i := Low(A) to High(A) do begin
Len := length(A[i]);
SetLength(B, Len); //Make B the same length as A[i].
//B[Len] = A[i][1]; B[Len-1]:= A[i][2] etc...
for j := Len downto 1 do B[j]:= A[i][(Len-J)+1];
//Store the reversed string back in the array.
A[i]:= B;
//Because A is a var parameter it will be returned.
//Writeln(B); //Write B for debugging purposes.
end;
end;
var
i: integer;
Strings: array [0..3] of string;
begin
for i := 0 to 3 do readln(Strings[i]);
ReverseArray(Strings);
for i := 0 to 3 do writeln(Strings[i]);
WriteLn('Done, press a key...');
ReadLn;
end.
一些提示:
- 不要像
M
那样使用全局变量,而是声明一个局部变量。
- 如果可以避免,不要在循环中执行
AStr:= AStr + AChar
。如果您知道结果将持续多长时间,请使用代码中所示的 SetLength
技巧。它生成更快的代码。
- 您可以使用
ReadLn
而不是 Sleep
来停止控制台应用程序。只要你按下一个键,它就会继续。
- 不要把
writeln
放在你的日常工作中。
- 注意字符串的第一个元素是1,但是数组的第一个元素是0(除非另有定义);动态数组总是从零开始计数。
- 注意参数定义中的
array of string
是一个open array;与动态数组不同。
- 像
T
、K
等单个大写标识符通常用于泛型类型,你不应该将它们用于普通变量;请改用描述性名称。
加油! 'bob' 是您不应该尝试测试反向例程的那些词之一。但问题不止于此。
你的问题就在这里
for J := L downto 1 do
M := M + A[I];
您正在尝试将整个字符串而不是您要访问的字符添加到 M 变量。所以,应该是
for J := L downto 1 do
M := M + A[I][J];
此外,您还需要在第一个循环中设置 M := ''
,当您开始向其中累积字符时,它将没有任何内容。
第三,将写作部分 WriteLn(M)
移动到第一个循环中,您将获得一个漂亮的分离输出。
放在一起,它将是:
for I := Low(A) to High(A) do
begin
L := length(A[I]);
M := '';
for J := L downto 1 do
M := M + A[I][J];
writeln(M);
end;
Delphi 在 StrUtils
单元中有一个 ReverseString()
函数。
uses
StrUtils;
type
TStrArray = array of string;
procedure ReverseArray(var A : TStrArray);
var
I: integer;
begin
for I := Low(A) to High(A) do
A[I] := ReverseString(A[I]);
end;
var
T: TStrArray;
I: Integer
begin
SetLength(T, 4);
for I := 1 to 4 do Readln(T[I]);
ReverseArray(T);
...
end.
我的首选解决方案是
type
TStringModifier = function(const s: string): string;
procedure ModifyEachOf( var aValues: array of string; aModifier: TStringModifier );
var
lIdx: Integer;
begin
for lIdx := Low(aValues) to High(aValues) do
aValues[lIdx] := aModifier( aValues[lIdx] );
end;
最后是
var
MyStrings: array[1..3] of string;
begin
MyStrings[1] := '123';
MyStrings[2] := '456';
MyStrings[3] := '789';
ModifyEachOf( MyStrings, SysUtils.ReverseString );
end;
uses
System.SysUtils, System.StrUtils;
var
Forwards, backwards : string;
begin
forwards:= 'abcd';
backwards:= ReverseString(forwards);
Writeln(backwards);
Readln;
end;
// dcba
procedure ReverseArray(var A : array of string);
var I,J,L : integer;
begin
for I := Low(A) to High(A) do
begin
L := length(A[I]);
for J := L downto 1 do M := M + A[I];
end;
writeln(M);
end;
begin
for I := 1 to 4 do readln(T[I]);
ReverseArray(T);
sleep(40000);
end.
我想在这里做的基本上是反转数组中的每个字符串,但我做不到,上面的代码所做的基本上是重复单词取决于它们的长度(我写 'bob' 在数组中,该过程将给我 'bob' 三次,因为长度是 3) ...不确定为什么它不能正常工作以及我缺少什么
字符串是一个 char 数组,添加了一些额外的功能。
所以 array of string
很像 array of array of char
.
如果要反转字符串,则必须访问每个字符并将其反转。
procedure ReverseArray(var A : array of string);
var
i,j,Len : integer;
B: string;
begin
for i := Low(A) to High(A) do begin
Len := length(A[i]);
SetLength(B, Len); //Make B the same length as A[i].
//B[Len] = A[i][1]; B[Len-1]:= A[i][2] etc...
for j := Len downto 1 do B[j]:= A[i][(Len-J)+1];
//Store the reversed string back in the array.
A[i]:= B;
//Because A is a var parameter it will be returned.
//Writeln(B); //Write B for debugging purposes.
end;
end;
var
i: integer;
Strings: array [0..3] of string;
begin
for i := 0 to 3 do readln(Strings[i]);
ReverseArray(Strings);
for i := 0 to 3 do writeln(Strings[i]);
WriteLn('Done, press a key...');
ReadLn;
end.
一些提示:
- 不要像
M
那样使用全局变量,而是声明一个局部变量。 - 如果可以避免,不要在循环中执行
AStr:= AStr + AChar
。如果您知道结果将持续多长时间,请使用代码中所示的SetLength
技巧。它生成更快的代码。 - 您可以使用
ReadLn
而不是Sleep
来停止控制台应用程序。只要你按下一个键,它就会继续。 - 不要把
writeln
放在你的日常工作中。 - 注意字符串的第一个元素是1,但是数组的第一个元素是0(除非另有定义);动态数组总是从零开始计数。
- 注意参数定义中的
array of string
是一个open array;与动态数组不同。 - 像
T
、K
等单个大写标识符通常用于泛型类型,你不应该将它们用于普通变量;请改用描述性名称。
加油! 'bob' 是您不应该尝试测试反向例程的那些词之一。但问题不止于此。
你的问题就在这里
for J := L downto 1 do
M := M + A[I];
您正在尝试将整个字符串而不是您要访问的字符添加到 M 变量。所以,应该是
for J := L downto 1 do
M := M + A[I][J];
此外,您还需要在第一个循环中设置 M := ''
,当您开始向其中累积字符时,它将没有任何内容。
第三,将写作部分 WriteLn(M)
移动到第一个循环中,您将获得一个漂亮的分离输出。
放在一起,它将是:
for I := Low(A) to High(A) do
begin
L := length(A[I]);
M := '';
for J := L downto 1 do
M := M + A[I][J];
writeln(M);
end;
Delphi 在 StrUtils
单元中有一个 ReverseString()
函数。
uses
StrUtils;
type
TStrArray = array of string;
procedure ReverseArray(var A : TStrArray);
var
I: integer;
begin
for I := Low(A) to High(A) do
A[I] := ReverseString(A[I]);
end;
var
T: TStrArray;
I: Integer
begin
SetLength(T, 4);
for I := 1 to 4 do Readln(T[I]);
ReverseArray(T);
...
end.
我的首选解决方案是
type
TStringModifier = function(const s: string): string;
procedure ModifyEachOf( var aValues: array of string; aModifier: TStringModifier );
var
lIdx: Integer;
begin
for lIdx := Low(aValues) to High(aValues) do
aValues[lIdx] := aModifier( aValues[lIdx] );
end;
最后是
var
MyStrings: array[1..3] of string;
begin
MyStrings[1] := '123';
MyStrings[2] := '456';
MyStrings[3] := '789';
ModifyEachOf( MyStrings, SysUtils.ReverseString );
end;
uses
System.SysUtils, System.StrUtils;
var
Forwards, backwards : string;
begin
forwards:= 'abcd';
backwards:= ReverseString(forwards);
Writeln(backwards);
Readln;
end;
// dcba