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

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

Пользователь вводит N (N ) пар целых чисел, считаем что это пары координат отрезков на прямой, сохраните их в двумерный массив.
Напишите подпрограмму, которая определит - есть ли у них общее пересечение, и если есть - вычислит координаты отрезка-пересечения.
type
  SegmentArray = array[1..20, 1..2] of integer;  // Двумерный массив для хранения отрезков

var
  segments: SegmentArray;  // Массив для хранения координат отрезков
  N, i: integer;  // N - количество отрезков, i - счетчик
  intersect_start, intersect_end: integer;  // Границы общего пересечения
  hasIntersection: boolean;  // Флаг наличия пересечения

begin
  writeln('Введите количество отрезков (N < 20):');
  readln(N);  // Читаем количество отрезков

  // Проверяем, чтобы N было в допустимых пределах
  if (N >= 20) or (N <= 0) then
  begin
    writeln('Некорректное значение N!');
    exit;
  end;

  writeln('Введите ', N, ' пар чисел (начало и конец отрезка):');

  // Читаем отрезки от пользователя
  for i := 1 to N do
    readln(segments[i, 1], segments[i, 2]); // segments[i,1] - начало, segments[i,2] - конец

  // Инициализируем границы пересечения первым отрезком
  intersect_start := segments[1, 1];  // Начальная точка пересечения
  intersect_end := segments[1, 2];    // Конечная точка пересечения
  hasIntersection := true;  // Предполагаем, что пересечение есть

  // Проверяем пересечение со всеми остальными отрезками
  for i := 2 to N do
  begin
    // Если текущий отрезок не пересекается с найденным ранее пересечением
    if (segments[i, 1] > intersect_end) or (segments[i, 2] < intersect_start) then
    begin
      hasIntersection := false; // Пересечения нет
      break;  // Выходим из цикла, так как дальше проверять бессмысленно
    end;

    // Обновляем границы пересечения, если новый отрезок заужает его
    if segments[i, 1] > intersect_start then
      intersect_start := segments[i, 1];  // Сдвигаем начало пересечения вправо

    if segments[i, 2] < intersect_end then
      intersect_end := segments[i, 2];  // Сдвигаем конец пересечения влево
  end;

  // Выводим результат
  if hasIntersection then
    writeln('Общий отрезок пересечения: ', intersect_start, ' ', intersect_end)
  else
    writeln('Общего пересечения нет');

  readln();
end.       

Вывод консоли:

Введите количество отрезков (N < 20):
3
Введите 3 пар чисел (начало и конец отрезка):
2 3
4 5
6 7
Общего пересечения нет
Введите количество отрезков (N < 20):
3
Введите 3 пар чисел (начало и конец отрезка):
1 5
3 7
2 4
Общий отрезок пересечения: 3 4