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

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

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

первые два числа - начало и конце отрезка 1
вторые два - начало и конец отрезка 2

Задача: напишите подпрограмму, которая определит пересекаются ли данные отрезки.

Решение:

program u16z02;
type newArr = array[1..4] of integer;
var a:newArr;
  i,n: integer;
  s: string;

function otrezki(arr:newArr): string;
begin
  if (arr[1]>arr[3])and(arr[2]<arr[4]) then
    result:='Otrezki peresekayutsya'
  else
    if (arr[1]<arr[3])and(arr[2]>arr[4]) then
      result:='Otrezki peresekayutsya'
    else
      if (arr[1]<arr[3])and(arr[2]>arr[3])and(arr[2]<arr[4]) then
        result:='Otrezki peresekayutsya'
      else
        if (arr[2]>arr[4])and(arr[1]<arr[4])and(arr[1]>arr[3]) then
          result:='Otrezki peresekayutsya'
        else
          result:='Otrezki ne peresekayutsya';
end;

begin
  for i:=low(a) to high(a) do
  begin
    write('Vvedite celoe chislo: ');
    readln(n);
    a[i]:=n;
  end;
  writeln();
  s:=otrezki(a);
  writeln(s);
  readln();
end.

Консоль:

Vvedite celoe chislo: 1
Vvedite celoe chislo: 5
Vvedite celoe chislo: 2
Vvedite celoe chislo: 7

Otrezki peresekayutsya
vedro-compota's picture

  1. Для случая если вложенность есть только в then можно форматировать линейно см. http://fkn.ktu10.com/?q=node/8763 (рекомендация)
  2. попроверять на разных значениях (взаимных положениях отрезков)
  3. рекомендую делать только одно сравнение в if- остальное вложенное
  4. Надо учитывать варианты, когда границы полностью или частично совпадают

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

Решение:

program u16z02;
type newArr = array[1..4] of integer;
var a:newArr;
  i,n: integer;
  s: string;

function otrezki(arr:newArr): string;
begin
  if (arr[2]<arr[3]) then result:='Otrezki ne peresekayutsya'
  else
    if (arr[1]>arr[4]) then result:='Otrezki ne peresekayutsya'
    else
      result:='Otrezki peresekayutsya'
end;

begin
  for i:=low(a) to high(a) do
  begin
    write('Vvedite celoe chislo: ');
    readln(n);
    a[i]:=n;
  end;
  writeln();
  s:=otrezki(a);
  writeln(s);
  readln();
end.  

Консоль:

Vvedite celoe chislo: 1
Vvedite celoe chislo: 5
Vvedite celoe chislo: 5
Vvedite celoe chislo: 7

Otrezki peresekayutsya


Vvedite celoe chislo: 1
Vvedite celoe chislo: 3
Vvedite celoe chislo: 4
Vvedite celoe chislo: 6

Otrezki ne peresekayutsya
vedro-compota's picture

Возвращать boolean для случая пересечения (алгоритм любой рабочий)

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

Решение:

program u16z02;
type newArr = array[1..4] of integer;
var a:newArr;
  i,n: integer;

function otrezki(arr:newArr): boolean;
begin
  if (arr[2]<arr[3]) then result:=FALSE
  else
    if (arr[1]>arr[4]) then result:=FALSE
    else
      result:=TRUE;
end;

begin
  for i:=low(a) to high(a) do
  begin
    write('Vvedite celoe chislo: ');
    readln(n);
    a[i]:=n;
  end;
  writeln();
  if otrezki(a) then
    writeln('otrezki peresekayutsya')
  else
    writeln('otrezki ne peresekayutsya');
  readln();
end.