Информатика ← ЛабораторныеЛабораторная работа №9

Движение точки

Задание

Cоставить и отладить программу на языке С итеративного характера с целочисленными рекуррентными соотношениями, задающими некоторое регулярное движение точки в целочисленной системе координат (i, j) с дискретным временем k и динамическим параметром движения l.

Начальные данные движения задаются в виде констант программы.

Результатом работы программы выводится в следующем виде:

попадание точки в указанную замкнутую область не более чем за 50 шагов (вывести Yes или No); на следующей строке значения координат i, j, значение динамического параметра l на момент окончания движения; время окончания движения (номер шага, на котором движение было прекращено), если точка попала в область, затем перевод строки.

Примеры выходных сообщений.

Точка попала в область на 35-м шаге, значения координат и динамического параметра стали равны −10, 12 и 3 соответственно:

 Yes
 −10 12 3 35

Точка не попала в область за 50 шагов, значения координат и динамического параметра стали равны 0, −1 и −7 соответственно:

 No
 0 −1 −7

Операции div и mod определяются так: a div b = ⌊a / b⌋, a mod b = a − (a div b) × b.

Оценка может быть снижена за неправильное разбиение задачи на функции (или отсутствие разбиения). Не допускается использование операций вещественной арифметики или использование стандартных операторов / и % вместо div и mod.

Оценка может быть повышена за визуалицию траектории движения точки в программе gnuplot.

При составлении программы необходимо обосновать выбранный для реализации тип оператора цикла, рассмотреть инварианты цикла, пред- и постусловия и другие средства доказательства его завершимости и корректности.

Варианты

  1. Кольцо, ограниченное двумя окружностями с центрами в точках (10, 10), радиус внутренней окружности равен 5, радиус внешней равен 10.
      • i0 = 18, j0 = −9, l0 = 5,

      • ik+1 = ik max(jk, lk) mod 30 + jk min(ik, lk) mod 20 + k,

      • jk+1 = min(ik, max(jk, min(lk, max(ik − lk, jk − lk)))),

      • lk+1 = sign(k − 10) |ik − jk + lk − k|.

      • i0 = 0, j0 = −3, l0 = −7,

      • ik+1 = |ik − jk + lk| div (3 − sign(ik − jk+ k)) + 10,

      • jk+1 = |ik + jk − lk| div (3 − sign(jk − ik+ k)) + 10,

      • lk+1 = max(ikjk, jklk) mod 40.

      • i0 = 1, j0 = −30, l0 = 1,

      • ik+1 = max(min(ik + jk − lk − k, ik − jk + lk − k), min(k + ik − jk − lk, k − ik − jk + lk)),

      • jk+1 = jk + lk sign jk mod 20 + k sign ik mod 10,

      • lk+1 = |ik − jk + lk − k| sign ik sign jk.

      • i0 = 26, j0 = 8, l0 = −3,

      • ik+1 = min(ik + jk, ik + lk)(k + 1) mod 30,

      • jk+1 = jk + lk sign jk mod 20 + k sign ik mod 10,

      • lk+1 = max(ikjk, iklk, jklk) mod 30.

      • i0 = −1, j0 = −1, l0 = −9,

      • ik+1 = max(jk − k, lk − k) mod 30 + max(ik + lk,jk + k) mod 20,

      • jk+1 = (|ik − lk| ⋅ sign (jk + k) + |ik − k|(jk + k)) mod 20,

      • lk+1 = (ik + k)(jk − k)(lk + k) mod 25.

  2. Квадрат с длиной стороны 10, стороны квадрата параллельны осям координат, центр квадрата в точке (10, −10).
      • i0 = 22, j0 = 10, l0 = 10,

      • ik+1 = min(lk mod 5, ikk mod 5) + jk + k div 3,

      • jk+1 = max(−3ik, 2jk) div 5 − |jk − lk|,

      • lk+1 = jk + lk mod 7 + k sign ik mod 10.

      • i0 = 11, j0 = 13, l0 = 10,

      • ik+1 = |k − 15| − min(ik div 3, (jk + lk) mod 10) − 20,

      • jk+1 = −(jk + k) div 5 + |iklk mod 8|,

      • lk+1 = max((ik + jk) mod 15, (lk + k) mod 14).

      • i0 = −11, j0 = −6, l0 = −5,

      • ik+1 = (ik + jk + lk)(k + 1) mod 25 − ikjklk(k + 2) mod 10 + 10,

      • jk+1 = min((ik + jk + lk)(k + 3) mod 25, ikjklk(k + 4) mod 25) + 10,

      • lk+1 = 2 sign lk |(ik + jk + lk)(k + 5) mod 10 - ikjklk(k + 6) mod 25|.

      • i0 = 10, j0 = 20, l0 = −1,

      • ik+1 = (|max(ik(k + 5), jk(k + 6))| − |min(jk(k + 7), lk(k + 8))|) mod 20,

      • jk+1 = (3 − sign(ik − jk)) ⋅ |min(iklk + 5, jklk − 3, ikjk + 6)| mod 25 − 7,

      • lk+1 = ik mod 10 + jk mod 10 + lk mod 10.

      • i0 = 24, j0 = −14, l0 = 9,

      • ik+1 = (ik + k)(jk − k)(lk + k) mod 25,

      • jk+1 = min(ik + k, max(jk − k, lk − k)) mod 30,

      • lk+1 = |jk − lk| sign ik − |ik − lk| sign jk.

  3. Лунка, являющаяся пересечением двух кругов радиуса 10, центр первого круга — в точке (−10, −10), центр второго — в точке (−20, −20).

      • i0 = 5, j0 = 5, l0 = 4,

      • ik+1 = ik div 3 − |ik − k|·sign(lk − jk),

      • jk+1 = jk mod 10 − max(ik, lk) mod (k + 1),

      • lk+1 = ik + jkk mod 5 + lk div 5 + 3.

      • i0 = −22, j0 = 29, l0 = 4,

      • ik+1 = sign min(ik, jk) max ((ik + k) mod 20, (jk + lk) mod 20),

      • jk+1 = |max(ik, jk)| - k min(jk, lk),

      • lk+1 = (k − lk) div ((ik + jk + lk)(ik + jk + lk) mod 5 + 1).

      • i0 = 13, j0 = −9, l0 = −4,

      • ik+1 = ((ik + jk) mod 30) div (|lk| mod 5 + 1) + ((ik + lk) mod 30) div (|jk| mod 5 + 1),

      • jk+1 = max(kik, (k + 1)jk) mod 20 − |jk − lk| div 10,

      • lk+1 = |jk − lk| div 10 + min((ik + lk) mod 20, jkk mod 20) − 10.

      • i0 = 6, j0 = 27, l0 = −15,

      • ik+1 = (ik3 − jk3 + lk3 − k) mod 20,

      • jk+1 = min(ikjk2 − k, ik2lk − k, jklk2 − k) mod 30,

      • lk+1 = max(ikjk2 − k, ik2lk − k, jklk2 − k) mod 30.

      • i0 = 7, j0 = −4, l0 = −10,

      • ik+1 = max(47ik mod 25, min(47jk mod 30, 47lk mod 30)) − k mod 15,

      • jk+1 = min(max(47ik mod 25, 47jk mod 25), 47lk mod 30) + k mod 5,

      • lk+1 = 47ikjklk mod 25 + k mod 5.

  4. Полоса, ограниченная прямыми i + j + 10 = 0 и i + j + 20 = 0.
      • i0 = −30, j0 = −4, l0 = 12,

      • ik+1 = |ik − lk| + min(jk mod 10, lkk mod 10) − 20,

      • jk+1 = max(k − ik, min(jk, max(ik − lk, jk − lk))) mod 30,

      • lk+1 = lk2 mod 20 − max(ik, jk) mod (k + 1).

      • i0 = 13, j0 = 19, l0 = 14,

      • ik+1 = sign(ik + 1) ⋅ ||k − jk| − |ik − lk||,

      • jk+1 = jk mod 20 + max(ik mod 20, min(jk − k, lk − k)) − 10,

      • lk+1 = k(ik + 1)(jk + 2)(lk + 3) mod 20.

      • i0 = 12, j0 = 4, l0 = 3,

      • ik+1 = (ikjk div (|lk| + 1) + jklk div (|ik| + 1) + iklk div (|jk| + 1)) mod 30,

      • jk+1 = ik max(jk, lk) mod 20 + jk min(ik, lk) mod 30 − k,

      • lk+1 = max(ikjk, iklk, jklk) mod 30 + 20.

      • i0 = −22, j0 = 14, l0 = −14,

      • ik+1 = (ik min(jk, lk) + jk min(ik lk) + k2) mod 20,

      • jk+1 = (ik mod 10 − k)(jk mod 10 + k)(lk mod 10 − k) mod 25,

      • lk+1 = max(min(ik + jk, ik + lk) mod 25, max(ik + lk, jk + k) mod 20) + 10.

      • i0 = −25, j0 = −9, l0 = −8,

      • ik+1 = (|ik − jk| ⋅ lk − |jk − lk| ⋅ ik + |ik − lk| ⋅ jk) mod 20 − k,

      • jk+1 = min(ik, jk) max(jk, lk) min(ik, lk) mod 25 + 5 sign ik + k,

      • lk+1 = |lk| ⋅ sign(ik − jk) − |ik| ⋅ sign(jk − lk) + |jk| ⋅ sign(ik − lk).

  5. Треугольник с вершинами в точках (−10,0), (0, 10), (−10, 20).
      • i0 = −12, j0 = −22, l0 = 11,

      • ik+1 = max(min(ik − jk, jk − lk) mod 20, min(ik − lk, jk − k) mod 20) + 10,

      • jk+1 = sign(ik − jk) ⋅ min(ik mod 20, jk mod 20) − max(|ik − lk|, |k − 20|) mod 20 + 20,

      • lk+1 = (ik mod 10)(jk mod 20) + lk mod 10.

      • i0 = 8, j0 = 15, l0 = 10,

      • ik+1 = ((ik + jk) mod |min(jk − lk, lk − k)| + 1 − k) mod 20 + 10,

      • jk+1 = max((ik + jk) div (2 + sign(jklk − ikk)), (jk + lk) div (2 + sign(ikjk − lkk))) − 10,

      • lk+1 = max(ik, jk) min(ik, lk) mod 30.

      • i0 = 29, j0 = −6, l0 = 1,

      • ik+1 = min(max(min(ik − jk, ik − lk), jk − lk), ik − k) mod 30,

      • jk+1 = max(min(max(ik − jk, ik − lk), jk − lk), ik − k) mod 30,

      • lk+1 = ik mod 30 − jk mod 30 + lk mod 30 − k mod 30.

      • i0 = 20, j0 = 0, l0 = 11,

      • ik+1 = ((ik − k) max(jk, lk) + (jk − k) min(ik, lk) + (lk − k) max (ik, jk)) mod 23,

      • jk+1 = −((ik − k) min(jk, lk) + (jk − k) max(ik, lk) + (lk − k) min(ik, jk)) mod 27,

      • lk+1 = |ik + jk − lk − k| ⋅ sign(ik − jk + lk − k).

      • i0 = −8, j0 = −5, l0 = 12,

      • ik+1 = (ik2 div (|jk − lk| +1 + k) − jk2 div (|ik − lk| + k)) mod 30,

      • jk+1 = sign lk min(ik, jk) − sign jk max(ik, lk) + k,

      • lk+1 = (ik − jk)(jk − lk)(lk − ik) mod 20.

  6. Эллипс с центром в точке (20, 0), проходящий через точки (10, 0), (30, 0), (20, 5) и (20, −5).
      • i0 = −10, j0 = −10, l0 = 6,

      • ik+1 = |max(min(ik + jk, ik + lk) mod 30, max(ik + lk, jk + k) mod 25)|,

      • jk+1 = |ik + k| mod 10 + |jk + k| mod 10 + |lk + k| mod 10,

      • lk+1 = (ik3 + jk3 + lk3 − k) mod 35.

      • i0 = −24, j0 = 4, l0 = −3,

      • ik+1 = |(ik + k)(jk + 2k)(lk + 3k)| mod 35,

      • jk+1 = sign max(ik,jk)min((ik + k) mod 20, (jk + lk) mod 20),

      • lk+1 = ik div 3 − |ik − k|sign(lk − jk).

      • i0 = −29, j0 = 3, l0 = 9,

      • ik+1 = ik max(jk, lk) mod 20 + jk min(ik, lk) mod 30 + k,

      • jk+1 = |ik − jk + lk − k| sign(k − 10) mod 20,

      • lk+1 = (|ik − jk|lk − |jk − lk|ik + |ik − lk|jk) mod 20 - k.

      • i0 = −7, j0 = −19, l0 = 4,

      • ik+1 = max(ikjk, iklk, jklk) mod 30 + k,

      • jk+1 = |jk − lk|sign ik - |ik - lk| sign jk,

      • lk+1 = min(ik, max(jk, min(lk, max(ik − lk, jk − lk)))).

      • i0 = −1, j0 = 2, l0 = −1,

      • ik+1 = |sign(ik − jk)lk − sign(jk − lk)ik + sign(ik − lk)jk − k| mod 35,

      • jk+1 = ik max(jk, lk) mod 30 + jk min(ik, lk) mod 20 − k,

      • lk+1 = (ik + k)(jk − k)(lk + k) mod 25.