27.05.2008, 09:59
общий
это ответ
Здравствуйте, Хощенко Артём Владимирович!
Задача лекго решилась при помощи вспомогательного массива. Обратите внимание: вспомогательный массив <b>Tmp</b> обладает чуть более широкими границами, чем основной, иначе пришлось бы очень аккуратно проверять индексы и при выходе за границы массива перекидывать их на противоположный конец. Граничные значения <b>Tmp</b> берутся с противоположных концов основного массива <b>Arr</b>, что позволяет легче реализовать "закольцованность" данных. Основная же задача <b>Tmp</b> - хранение неизменного "снимка" данных с прошлого шага, когда на текущем шаге данные уже меняются.
Приложение:
Program Pr137971; Uses CRT; Var Arr: Array[1..100] of Integer; Tmp: Array[0..101] of Integer; n, i: Integer; Procedure ReadData(var n: Integer); var i: Integer; begin ClrScr; Write(‘n = ‘); ReadLn(n); for i := 2 to n do Arr[i] := 0; Arr[1] := 1; end; Procedure MoveData(n: Integer); var i: Integer; begin for i:= 1 to n do Tmp[i] := Arr[i]; Tmp[0] := Arr[n]; Tmp[n+1] := Arr[1]; for i := 1 to n do Arr[i] := Abs(2 * Tmp[i] - Tmp[i-1] - Tmp[i+1]); end; procedure PrintData(k, n: Integer); var i: integer; begin Write(k:2, ‘: ‘); for i := 1 to n do Write(Arr[i]:3, ‘ ‘); WriteLn; end;Begin ReadData(n); PrintData(0, n); for i := 1 to n do begin MoveData(n); PrintData(i, n); end; ReadLn;End.