Задача 3 Урок 16

Урок 16

Вспомогательная задача (можно решить, просто используя одномерные массивы):
Пользователь вводит 4 целых числа, считаем все их координатами на прямой,
а именно: первые два числа - начало и конце отрезка 1
вторые два - начало и конец отрезка 2
Задача: напишите подпрограмму, которая определит какой отрезок является
пересечением этих двух заданных отрезков (если это пересечение вообще есть).

Примечание: оформить поиск пересечения в виде процедуры, которая получает
на вход 4 координаты, а также 2 параметра по ссылке:

одномерный массив из 2 элементов, куда будет записано пересечение
(если оно будет найдено)
булево значение, которое показывает найдено ли пересечение

type ar = array[1..2, 1..2] of integer;
     br = array[1..2] of integer;

var a: ar = ((-15, 10), (-5, 5));
    b: br = (0, 0);
    bo: boolean;

procedure p1(a1:ar; var b1: br; var bo1: boolean);
  var i1: integer;

begin
  b1[1] := a1[low(a1), low(a1[low(a1)])];
  b1[2] := a1[high(a1), high(a1[high(a1)])];
  if (a1[low(a1), low(a1[low(a1)])] <= a1[high(a1), high(a1[high(a1)])]) and
     (a1[low(a1), high(a1[low(a1)])] >= a1[high(a1), low(a1[high(a1)])]) then
      bo1 := true;
  if bo1 then
  begin
    for i1 := low(a1[i1]) to high(a1[i1]) do
    begin
      if a1[i1, low(a1[i1])] > b1[1] then
        b1[1] := a1[i1, low(a1[i1])]
      else if a1[i1, high(a1[i1])] < b1[2] then
        b1[2] := a1[i1, high(a1[i1])];
    end;
  end;
end;

procedure printarray(b1:br);
  var i1: integer;

begin
  writeln('Пересечением является отрезок с координатами: ');
  for i1 := low(b1) to high(b1) do
    write(b1[i1], ' ');
end;

begin
  bo := false;
  p1(a, b, bo);
  printarray(b);
  readln();
end.

КОНСОЛЬ

Пересечением является отрезок с координатами:
-5 5
vedro-compota's picture

function f1(a1:ar): boolean;

-- лучше на вход передавать 4 integer-a

function f1(x1, x2, x3, x4: integer): boolean

_____________
матфак вгу и остальная классика =)

type ar = array[1..2, 1..2] of integer;
     br = array[1..2] of integer;

var a: ar = ((-15, 10), (-10, 5));
    b: br = (0, 0);
    bo: boolean;

procedure searchRes(a1:ar; var b1: br; var bo1: boolean);

begin
  b1[1] := a1[1, 1];
  b1[2] := a1[2, 2];
  if (a1[1, 1] <= a1[2, 2]) and
       (a1[1, 2] >= a1[2, 1]) then
      bo1 := true;
  if bo1 then
  begin
    if a1[2, 1] > b1[1] then
      b1[1] := a1[2, 1];
    if a1[2, 2] < b1[2] then
      b1[2] := a1[2, 2];
  end;
end;

procedure printarray(b1:br);
  var i1: integer;

begin
  writeln('Пересечением является отрезок с координатами: ');
  for i1 := 1 to 2 do
    write(b1[i1], ' ');
end;

begin
  bo := false;
  searchRes(a, b, bo);
  printarray(b);
  readln();
end.
vedro-compota's picture

-- переписать на сигнатуру

function f1(x1, x2, x3, x4: integer): boolean

_____________
матфак вгу и остальная классика =)

Примечание: оформить поиск пересечения в виде процедуры, которая получает
на вход 4 координаты, а также 2 параметра по ссылке:

одномерный массив из 2 элементов, куда будет записано пересечение
(если оно будет найдено)
булево значение, которое показывает найдено ли пересечение

type ca = array[1..2] of integer;

var line1Start, line1Stop, line2Start, line2Stop: integer;
    isCross: boolean;
    crossArr: ca;

procedure searchRes(line1Start1, line1Stop1, line2Start1, line2Stop1: integer; var crossArr1: ca; var isCross1: boolean);

begin
  crossArr1[1] := line1Start1;
  crossArr1[2] := line2Stop1;
  if (line1Start1 <= line2Stop1) and
       (line1Stop1 >= line2Start1) then
      isCross1 := true;
  if isCross1 then
  begin
    if line2Start1 > crossArr1[1] then
      crossArr1[1] := line2Start1;
    if line1Stop1 < crossArr1[2] then
      crossArr1[2] := line1Stop1;
  end;
end;

begin
  writeln('Введите точки начала и конца двух отрезков');
  readln(line1Start, line1Stop, line2Start, line2Stop);
  isCross := false;
  searchRes(line1Start, line1Stop, line2Start, line2Stop, crossArr, isCross);
  if isCross then
  begin
    writeln('Пересечением является отрезок с координатами: ');
    write(crossArr[1],' ', crossArr[2]);
  end;
  readln();
end.
vedro-compota's picture

засчитано

_____________
матфак вгу и остальная классика =)