Задача 4 урок 16

Пользователь вводит N (N отрезков на прямой,сохраните их в двумерный массив.
Напишите подпрограмму, которая определит - есть ли у них общее пересечение,
и если есть - вычислит координаты отрезка-пересечения

Задача 4 урок 16

type
segment = array[1..20]of integer;
var n,i:integer;
a,b,s:segment;
f:boolean;
Procedure intersection(n,a1,b1,a2,b2: integer; var s:segment; var f1:boolean);
var i,s1,s2: integer;
begin
  a[1]:= a1;
  b[1]:= b1;
  a[2]:= a2;
  b[2]:= b2;
  s1:=a[1];
  s2:=b[1];

  for i:=1 to n do
  begin
    if a[i]>s1 then
    s1:=a[i];
  if b[i]<s2 then
    s2:=b[i];
  end;
  f1:=true;
    s[1]:=s1;
    s[2]:=s2;
  for i:=1 to n do
  begin
    if s1>b[i]then
      f1:=false;
    if s2<a[i]then
      f1:=false;
  end;
 end;

 begin
  writeln('Enter the numbers of the segments < 20');
  readln(n);
  for i:=1 to n do
  begin
   writeln('Enter the ends of the segments');
   readln(a[i],b[i]);
  end;

  intersection(n,a[1],b[1],a[2],b[2], s, f);

  if f then
    writeln('Yes intersection! Segment of this is: ',s[1],' - ',s[2])
  else
    writeln('No intersection');
  readln();
end. 
vedro-compota's picture

1) использовать двумерный массив

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

program project1;
const n = 10;
Type dublmass = array[1..n,1..2] of integer;
var
a: dublmass;
i,j, start, finish: integer;
f: boolean;
function Crest(var start, finish: integer; var a: dublmass; var f: boolean):boolean;
var i,j: integer;
begin
  writeln('chislo:');
  for i:= 1 to n do
    for j:= 1 to 2 do
    begin
      readln(a[i,j]);
    end;
  writeln('massiv:');
  for i:= 1 to n do
  begin
    writeln();
    for j:= 1 to 2 do
      write(a[i,j]:4);
    end;
  start:= a[i,1];
  finish:= a[i,2];
  writeln();
  writeln('segment:');
  for i:= 1 to n do
  begin
    if a[i,1] > start then
      start:= a[i,1];
    if a[i,2] < finish then
       finish:= a[i,2];
  end;
  f:= true;

  if (start > a[i,2]) or  (finish < a[i,1]) then
    f:= false;
  writeln();
end;

begin
   Crest(start, finish,a,f);
   if f then
     write(' Segment of the intersection is: ', start,', ',finish)
   else
     write('No intersection');
    readln();
end.              
vedro-compota's picture

-- свести к вызову базовой функции, которая вычисляет пересечение 2 отрезков (если оно есть)

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

program project1;
Type dublmass = array[1..10,1..2] of integer;

var
a: dublmass;
n,start, finish: integer;
f: boolean;

function CreatArr(): dublmass;
var i, j: integer;
begin
  writeln('vvedite koordinaty otrezkov:');
  for i:= 1 to n do
    for j:= 1 to 2 do
    begin
      readln(a[i,j]);
    end;
  writeln('massiv:');
  for i:= 1 to n do
  begin
    writeln();
    for j:= 1 to 2 do
      write(a[i,j]:4);
  end;
  result := a;
end;

function Crest(var start, finish: integer; a: dublmass):boolean;
var i: integer;
begin
  f:= true;
  start:= a[n,1];
  finish:= a[n,2];
  writeln();
  writeln('segment:');
  for i:= 1 to n do
  begin
    if a[i,1] > start then
      start:= a[i,1];
    if a[i,2] < finish then
       finish:= a[i,2];
  end;
  if (start > a[i,2]) or  (finish < a[i,1]) then
    f:= false;
  writeln();
  result := f;
end;

begin
   writeln('vvedite kolichestvo otrezkov:');
   writeln('n=');
   readln(n); //кол-во отрезков ( строк матрицы)
   CreatArr();
   Crest(start, finish,a);
   if f then
     write(' Segment of the intersection is: ', start,', ',finish)
   else
     write('No intersection');
    readln();
end.  
vedro-compota's picture

1) Уйти от использования глобальной f
1) Уйти от использования глобальной n

Проверить на наборе:

1    3
         4  5
1              7

start:= a[n,1];
  finish:= a[n,2];
  writeln();
  writeln('segment:');
 for i:= 1 to n do
  begin
    if a[i,1] > start then
      start:= a[i,1];
    if a[i,2] < finish then
       finish:= a[i,2];
  end;
  if (start > a[i,2]) or  (finish < a[i,1]) then
    f:= false;

if (4 > 7) or  (3 < 1) then
    f:= false;

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

vedro-compota's picture

#####
  ############
             ###########


 ####
      ######

     ##  // break
            ###########

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