Имате въведени коефициентите на общите уравнения на две прави:
g1: A1x + B1y + C1
g2: A2x + B2y + C2
Да се състави програма, чрез която се извеждат възможните положения на двете прави в равнината: съвпадат, успоредни (разстояние между тях), пресичат се под определен ъгъл – дали са перпендикулярни.
Пример: 2,3,4; 4,5,6 Изход: Пресечна точка 1,-2, ъгъл 0.086738 [rad].
Решение
#include <iostream>
#include<cmath>
using namespace std;
void whod (int mas[], int koe)
{
cout<<"Wywevdate koeficientite w obshoto urawnenie na prawa "<<koe+1<<".\n";
cout<<"Wywedete stojnost na koewficienta A[1..100]: ";cin>>mas[3*koe];
cout<<"Wywedete stojnost na koewficienta B[1..100]: ";cin>>mas[3*koe+1];
cout<<"Wywedete stojnost na koewficienta C[1..100]: ";cin>>mas[3*koe+2];
}//void whod (int mas[], int koe)
void presech(int mas[], double &x, double &y)
{double a1,a2,a3;
//Izchislqwa presechna tochka po koeficienti ot obshite urawneniq
//reshawame sistema urawneniq ot 2 urawneniq s dwe nizwestni
//po formulite na Kramer; !!swobodniq chlen se mesti wdqsno na urawnenieto
//osnowna mas[0]*mas[4]-mas[1]*mas[3];
if (mas[0]*mas[4]!=mas[1]*mas[3]){
a1= mas[0]*mas[4]-mas[1]*mas[3];
a2= -mas[2]*mas[4]+mas[1]*mas[5];
a3= -mas[0]*mas[5]+mas[2]*mas[3];
x=a2/a1;
y=a3/a1;
}//if
}//void presech
void prawi(int mas[])
{int i,j=0;
double yg,y1,x,y,d;
for (i=0;i<2;i++) whod(mas,i); //for
if (mas[0]*mas[4]==mas[3]*mas[1] && mas[0]*mas[5]==mas[3]*mas[2])
{ cout<<"Prawite sywpadat.\n";j=1;}
if (mas[0]*mas[4]==mas[3]*mas[1] && mas[0]*mas[5]!=mas[3]*mas[2])
{ cout<<"Prawite sa usporedni.\n";j=2;
//priemame x=0 ichislqwame y=-mas[2]/mas[1] ot urawnenieto na pyrwata prawa
//polagame dwete stojnosti w urawnenieto na wtorata prawa
//d = (A2x +B2y +C2)/sqrt(A2*A2 + B2*B2);
x=0;
y=(double) mas[2]/mas[1]*(-1);
y1=sqrt(mas[3]*mas[3] + mas[4]*mas[4]);
yg=(double)(mas[3]*x + mas[4]*y + mas[5]);
d=fabs(yg/y1);
cout<<"Razstoqnieto mevdu tqh e: "<<d<<endl;
}
if (mas[0]*mas[1]+mas[3]*mas[4]==0)
{ cout<<"Prawite sa wzaimno perpendikulqrni.\n";j=3;
presech(mas, x, y);
cout<<"Presechnata im tochka e s koordinati: "<<x<<","<<y<<endl;
}
if (j==0)//posledniq sluchaj - prawite se presichat
{//tg a = (a1*b2 - a2*b1)/(a1*a2 +b1*b2)
y1 =(double) (mas[0]*mas[4] - mas[3]*mas[1]);
yg=atan(y1/(mas[0]*mas[3]+mas[1]*mas[4]));
yg=fabs(yg);//winagi po-malkiq ygyl
cout<<"Prawite se presichat pod ygyl "<<yg<<" [rad].\n";
presech(mas, x, y);
cout<<"Presechnata im tochka e s koordinati: "<<x<<","<<y<<endl;
}//if
}//void prawi(int mas[])
int main()
{
int mas[6];
char ose;
cout<<"Da se systawi programa, chrez koqto se izwevdat wzaimnite\n";
cout<<"poloveniq na 2 prawi pri wywedeni koeficienti w obshite urawneniq.\n";
cout<<"Programata da izwede dali prawite sywpadat, sa usporedni ili se presichat.\n";
cout<<"Primer 2,3,4; 4,5,6 Izhod Presechna tochka 1,-2, ygyl 0.086738 rad.\n";
do
{prawi( mas);
cout<<"She wywevdate li drugi danni <y/n>: ";cin>>ose;
} while (ose=='y');
return 0;
}