Обратные строки в массиве

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' в массиве, процедура даст мне "боб" три раза, потому что длина 3) ... не знаю, почему это не работает должным образом и что я пропускаю

5 ответов

Решение

Строка - это массив символов с добавлением некоторых дополнительных функций.
Так что 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 трюк, как показано в коде. Он генерирует гораздо более быстрый код.
  • Вместо Sleep Вы можете использовать ReadLn остановить консольное приложение. Это продолжится, как только вы нажмете клавишу.
  • Не кладите writeln в вашей рабочей рутине.
  • Обратите внимание, что первый элемент в строке равен 1, но первый элемент в массиве равен 0 (если не указано иное); Динамические массивы всегда начинают отсчет с нуля.
  • Обратите внимание, что array of string в определении параметра - открытый массив; отличная вещь от динамического массива.
  • Одиночные заглавные идентификаторы, такие как T, Kи т. д. обычно используются для универсальных типов, вы не должны использовать их для обычных переменных; Вместо этого используйте описательное имя.

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.
uses
   System.SysUtils, System.StrUtils;

var
   Forwards, backwards : string;

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

// dcba

Мое предпочтительное решение для этого

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;

Давай! "Боб" - это одно из тех слов, которые вы не должны пытаться проверить в обратном порядке. Но проблема выходит за рамки этого.

Ваша проблема здесь

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;
Другие вопросы по тегам