Задача 3 Урок 16
Primary tabs
Вспомогательная задача (можно решить, просто используя одномерные массивы):
Пользователь вводит 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
- Log in to post comments
- 3796 reads
vedro-compota
Sun, 11/28/2021 - 13:25
Permalink
function f1(a1:ar): boolean;
-- лучше на вход передавать 4 integer-a
_____________
матфак вгу и остальная классика =)
Vitaliy123
Mon, 11/29/2021 - 20:57
Permalink
Без сложных конструкций "low(a1), low(a1[low(a1)])"
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
Sun, 12/05/2021 - 13:23
Permalink
-- переписать на сигнатуру
-- переписать на сигнатуру
_____________
матфак вгу и остальная классика =)
Vitaliy123
Tue, 12/07/2021 - 21:10
Permalink
С четырьмя переменными
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
Wed, 12/08/2021 - 18:24
Permalink
засчитано
засчитано
_____________
матфак вгу и остальная классика =)