Консультация № 137971
27.05.2008, 09:00
0.00 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Я начал изучил процедуры и функции, поэтому эту задачу нужно разбить на максимальное количесво процедур и функций (три процедуры обязательны: ReadDate, Move, Print). Я прошу, чтобы вы подкинули мне идею написания программы. Ну что-то ничего в голову не идёт!
По круку записаны n (n < 100) чисел - одна единица и остальные нули. Каждую секунду вместо числа x(k) (в круглых скобках я пишу индекс) пишут |2x(k)-x(k-1)-x(k+1)|. Определите, какие числа будут через n секунд. Выведите все промежуточные результаты, как указано ниже:
15
0: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1: 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1
2: 2 0 1 0 0 0 0 0 0 0 0 0 0 1 0
3: 4 3 2 1 0 0 0 0 0 0 0 0 1 2 3
4: 2 0 0 0 1 0 0 0 0 0 0 1 0 0 0
5: 4 2 0 1 2 1 0 0 0 0 1 2 1 0 2
6: 4 0 3 0 2 0 1 0 0 1 0 2 0 3 0
7: 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7
8: 2 0 0 0 0 0 0 1 1 0 0 0 0 0 0
9: 4 2 0 0 0 0 1 1 1 1 0 0 0 0 2
10: 4 0 2 0 0 1 1 0 0 1 1 0 0 2 0
11: 8 6 4 2 1 1 1 1 1 1 1 1 2 4 6
12: 4 0 0 1 1 0 0 0 0 0 0 1 1 0 0
13: 8 4 1 1 1 1 0 0 0 0 0 1 1 1 4
14: 8 1 3 0 0 1 1 0 0 1 1 0 0 3 1
15: 14 9 5 3 1 1 1 1 1 1 1 1 3 5 9

Вся соль в том, что числа записаны по кругу. Заранее благодарен!

Обсуждение

Неизвестный
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.
Форма ответа