задача 3 урок 16

задача 3 урок 16

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

Решение

program task3_lesson16;
type
  arrTwo = array[1..2, 1..2] of integer;
procedure per(a: arrTwo);
begin
  if ((a[1][2] <= a[2][1]) or (a[2][2] <= a[1][1])) then
    write('pereseceniya net')
  else
    if ((a[1][2] > a[2][1]) and (a[1][2] <= a[2][2]) and (a[1][1] <= a[2][1])) then
      write(a[2][1], ' ', a[1][2])
    else
      if ((a[2][2] > a[1][1]) and (a[2][2] <= a[1][2]) and (a[1][1] >= a[2][1])) then
        write(a[1][1], ' ', a[2][2])
        else
          if ((a[1][1] >= a[2][1]) and (a[1][2] <= a[2][2])) then
            write(a[1][1], ' ', a[1][2])
            else
              if ((a[1][1] <= a[2][1]) and (a[2][2] <= a[1][2])) then
                write(a[2][1], ' ',a[2][2]);
end;
var a: arrTwo;
  i, j, n: integer;
begin
  for i := 1 to 2 do
    begin
    writeln('vvedite koordinati');
    for j := 1 to 2 do
      begin
        readln(n);
        a[i][j] := n;
      end;
    end;
  per(a);
  readln
end.

Консоль

vvedite koordinati
5
10
vvedite koordinati
-5
7
5 7
vedro-compota's picture

if () then
  // операции
else if () then
  // операции
else if () then
  // операции
else if () then
  // операции

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

vedro-compota's picture

per(a: arrTwo);

-- переделать на 4 аргумента целого типа

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

Заменил процедуру на Функцию которая получает 4 аргумента и возвращает координаты отрезка
пересечения

program task3_lesson16;
type
  koordinat = array[1..2] of integer;
  arrTwo = array[1..2, 1..2] of integer;
function find(x1, y1, x2, y2: integer) : koordinat;
var a: koordinat;
begin
  if ((y1 <= x2) or (y2 <= x1)) then // когда перечение ТОЧКА НЕ рассматриваю! -по условию
    begin
      a[1] := 0;
      a[2] := 0;
    end
  else if ((x1 <= x2) and (x2 <= y1)) then
    begin
      if (y2 <= y1) then  // --x1--(x2--y2)--y1--
        begin
          a[1] := x2;
          a[2] := y2;
        end
      else                // --x1--(x2--y1)--y2--
        a[1] := x2;
        a[2] := y1;
    end
  else if ((x2 <= x1) and (x1 <= y2)) then
    begin
      if (y1 <= y2) then  // --x2--(x1--y1)--y2--
        begin
          a[1] := x1;
          a[2] := y1;
        end
      else                // --x2--(x1--y2)--y1--
        begin
          a[1] := x1;
          a[2] := y2;
        end;
    end;
  result := a;
end;

var a: arrTwo;      // координаты 2-х отрезков
    b: koordinat;   // координаты отрезка пересечения
    i, j, n: integer;
begin
  for i := 1 to 2 do
    begin
    writeln('vvedite koordinati');
    for j := 1 to 2 do
      begin
        readln(n);
        a[i][j] := n;
      end;
    end;
  b := find(a[1][1], a[1][2], a[2][1], a[2][2]);
  if (b[1] = 0) and (b[2] = 0) then
    write('Net pereseceniya ')
  else
    write(b[1], ' ', b[2]);
  readln
end.

Можно ли result := 2 элемента массива сразу!, что-то вроде result := [1,2]; Возможно? и если да, то как это писать?

vedro-compota's picture

засчитано

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