Задача 5 Урок 16
Primary tabs
Пользователь вводит 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
- Log in to post comments
- 643 reads