4.2.5 编程(www.cppentry.com)题(1)
【例4.13】编写一个程序,判断两个线段相交的情况。
解:设线段AB的端点为A(x1,y1)、B(x2,y2),线段CD的端点为C(x3,y3)、D(x4,y4),则有:
- r1=y3(x4-x3)-y1(x4-x3)+(x1-x3)(y4-y3)
- r2=(y2-y1)(x4-x3)-(x2-x1)(y4-y3)
- r=r1/r2
- t=(x1-x3+r(x2-x1))/(x4-x3)
根据r和t的值,有以下情况:
(1)0<r<1,0<t<1,则线段AB与线段CD相交。
(2)0<r<1,t≥1,则线段AB与线段CD不相交,且线段CD在线段AB的一侧。
(3)r≥1或r≤0,0<t<1,则线段AB与线段CD不相交,且线段AB在线段CD的一侧。
(4)r≥1或r≤0,t≥1或t≤0,则线段AB与线段CD不相交。
根据上述原理得到以下程序:
- #include <iostream.h>
- #include <iomanip.h>
- class Line
- { double x1,x2,y1,y2;
- public:
- Line() { }
- Line(double a,double b,double c,double d)
- { x1=a;y1=b;x2=c;y2=d;
- cout << "线段端点:(" << x1 << "," << y1 << ")-(" << x2 << ","
- << y2 << ")" << endl;
- };
- friend twoline(Line l1,Line l2) //友元函数
- { double r1=l2.y1*(l2.x2-l1.x1)-l1.y1*(l2.x2-l2.x1)+
- (l1.x1-l2.x1)*(l2.y2-l2.y1);
- double r2=(l1.y2-l1.y1)*(l2.x2-l2.x1)-
- (l1.x2-l1.x1)*(l2.y2-l2.y1);
- double r=r1/r2;
- double t=((l1.x1-l2.x1)+r*(l1.x2-l1.x1))/(l2.x2-l2.x1);
- if (r>0 && r<1 && t>0 && t<1)
- cout << "两线段相交." << endl;
- else if (r>0 && r<1 && t>=1)
- cout << "两线段不相交,一条在另一条的一侧." << endl;
- else if ((r>=1 || r<=0) && t>0 && t<1)
- cout << "两线段不相交,一条在另一条的一侧." << endl;
- else
- cout << "两线段不相交." << endl;
- }
- };
- void main()
- { Line A(2,2,18,18),B(1,12,19,5);
- twoline(A,B);
- }
本程序的执行结果如下:
- 线段端点:(2,2)-(18,18)
- 线段端点:(1,12)-(19,5)
- 两线段相交.
【例4.14】编写一个程序,设计一个类Trig,给定三角形的三条边长x、y、z,包含一个友元函数,计算两个三角形面积之和。
解:设计Trig类的一个私有成员函数area(),用于求三角形的面积,在友元函数twoarea()中调用area()成员函数,求两个三角形面积之和。程序如下:
- #include <iostream.h>
- #include <math.h>
- class Trig
- { double x,y,z;
- double area() //求三角形面积
- { double d=(x+y+z)/2;
- return sqrt(d*(d-x)*(d-y)*(d-z));
- }
- public:
- Trig(int i,int j,int k) { x=i;y=j;z=k; }
- int istrig() //判断是否构成三角形
- { if (x+y>z && x+z>y && y+z>x)
- return 1;
- else
- return 0;
- }
- friend double twoarea(Trig,Trig); //友元函数声明
- };
- double twoarea(Trig t1,Trig t2) //友元函数实现
- { return t1.area()+t2.area(); }
- void main()
- { Trig t1(6,5,8),t2(9,6,12);
- if (t1.istrig() && t2.istrig())
- cout << "两三角形面积之和:" << twoarea(t1,t2) << endl;
- else
- cout << "不能构成三角形" << endl;
- }
【例4.15】定义类X、Y、Z,使之满足如下4个条件:
(1)类X有私有成员i;
(2)类Y的成员函数g(X *)是类X的友元函数,实现对类X的成员i加1;
(3)类Z是类X的友元类,其成员函数f(X *)实现对类X的成员i加5;
(4)函数h(X *)是类X的友元函数,实现对类X的成员i加10。