Постановка задачи:

Два отрезка на прямой  заданы координатами своих концов. Определить,  имеют ли эти отрезки общие точки, и если имеют, то длину общей части. Замечание. Необходимо рассмотреть различные слу­чаи взаимной ориентации отрезков. Тестирование должно предусмотреть все такие ситуации.

Решение:

Пусть А и В – два отрезка, с координатами своих концов  [а1, а2] и [b1, b2] соответственно. a1, b1 –левые координаты, a2, b2 – правые координаты отрезков А и В.

Возможные случаи взаимной ориентации отрезков:

  1. отрезки не имеют общих точек.
  2. отрезки  частично  совпадают.
  3. отрезки могут лежать внутри друг друга.
  4. Могут иметь одну общую точку, в этом случае длина общей части будет равна нулю.
  5. отрезки совпадают.

Алгоритм построен на сравнении координат концов заданных отрезков:

  1. В случае если ни одна из координат одного отрезка не лежит между концевыми координатами другого, то эти отрезки не имеют общих точек;
  2. В случае если одна из координат одного отрезка лежит между концевыми координатами второго, то эти отрезки имеют общую часть;
  3. В случае если обе концевые координаты одного отрезка лежат между концевыми координатами второго отрезка, то один отрезок лежит внутри другого;
  4. Если одна из  концевых координат одного отрезка совпадает с начальной координатой второго, то отрезки имеют одну общую точку.
  5. Если левые и правые концевые координаты одного отрезка совпадают соответственно с координатами другого отрезка, то эти отрезки совпадают.

Ограничения:

Прямая ограничена интервалом от -10 до 10, в случае если  задаваемые координаты выходят за пределы заданного интервала выводится приглашение ввести их повторно. Так как правые координаты не могут быть расположены левее левых, то при их вводе b2<=b1, a2<=a1    приглашение ввести их повторно.

Код программы

#include <iostream.h>

#include <conio.h>

void main()

{

const int NMIN=-10;   // минимальная граница ввода

const int NMAX=10;  // максимальная граница ввода

double a1,a2,b1, b2, dlina;

m1:cout << «Input level coordinate otrezka a: «<<NMIN<<»<=a1<=»<<NMAX<< «\n\r»;

cin >>a1;

if ((a1<NMIN)||(a1>NMAX)) goto m1; //Контроль ввода a1

m2:cout << «Input right coordinate otrezka a: » <<a1<<»<a2<=»<<NMAX<< «\n\r»;

cin >>a2;

if ((a2<=a1)||(a1>NMAX)) goto m2;  //Контроль ввода a2

m3: cout << «Input level coordinate otrezka b: «<<NMIN<<»<=b1<=»<<NMAX<<»\n\r»;

cin >>b1;

if ((b1<NMIN)||(b1>NMAX)) goto m3;  //Контроль ввода b1

m4:cout << «Input right coordinate otrezka b: » <<b1<<»<b2<=»<<NMAX<< «\n\r»;

cin >>b2;

if ((b2<=b1)||(b1>NMAX)) goto m4; //Контроль вводa b2

// проверка пересечения отрезков

if (((a1<=b1)&&(b1<=a2))||((a1<=b2)&&(b2<=a2))||

((a1<=b1)&&(a1<=b2)&&(b1<=a2)&&(b2<=a2))||

((b1<=a1)&&(b1<=a2)&&(a1<=b2)&&(a2<=b2)))

{

if ((b1>=a1)&&(b2>a1)&&(b1<a2)&&(b2<=a2)) dlina=b2-b1; //отрезок B лежит внутри A

else if ((b1<=a1)&&(b1<=a2)&&(a1<=b2)&&(a2<=b2)) dlina=a2-a1; //отрезок A лежит внутри B

else if ((a1<=b1)&&(b1<=a2)) dlina=a2-b1; //  a1<=b1<=a2

else if ((b2>=a1)&&(b2<=a2)) dlina=b2-a1;   // a1<=b2<=a2

cout << «\n\rotrezki are crossed\n\r»;

cout << «\n\rLENGTH of COMMON PART :»<<dlina;

}

else

cout << «\n\rotrezki are not crossed\n\r»;

getch();

}