4
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)......不知道为什么它不能正常工作以及我错过了什么

4

5 回答 5

3

Delphi在单元中有一个ReverseString()函数。StrUtils

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.
于 2016-06-09T05:27:57.800 回答
2

字符串是一个 char 数组,添加了一些额外的花里胡哨。
所以 anarray 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代码中显示的技巧。它生成更快的代码。
  • Sleep您可以使用 a代替aReadLn来停止控制台应用程序。只要您按下一个键,它就会继续。
  • 不要把它writeln放在你的工作程序中。
  • 注意字符串中的第一个元素是 1,但数组中的第一个元素是 0(除非另有定义);动态数组总是从零开始计数。
  • 请注意,array of string在参数定义中是一个开放数组;与动态数组不同。
  • T像,等单个大写标识符K通常用于泛型类型,您不应该将它们用于普通变量;请改用描述性名称。
于 2016-06-08T21:45:47.010 回答
1

来吧!'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;
于 2016-06-09T04:50:14.003 回答
1

我的首选解决方案是

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;
于 2016-06-09T08:28:07.317 回答
1
uses
   System.SysUtils, System.StrUtils;

var
   Forwards, backwards : string;

begin
    forwards:= 'abcd';
    backwards:= ReverseString(forwards);
    Writeln(backwards);
    Readln;
end;

// dcba
于 2018-07-26T13:31:52.170 回答