设为首页 加入收藏

TOP

4.2.5 编程题(1)
2013-10-07 16:21:39 来源: 作者: 【 】 浏览:65
Tags:4.2.5 编程

4.2.5  编程(www.cppentry.com)题(1)

【例4.13】编写一个程序,判断两个线段相交的情况。

解:设线段AB的端点为A(x1,y1)、B(x2,y2),线段CD的端点为C(x3,y3)、D(x4,y4),则有:
 

  1. r1=y3(x4-x3)-y1(x4-x3)+(x1-x3)(y4-y3)  
  2. r2=(y2-y1)(x4-x3)-(x2-x1)(y4-y3)  
  3. r=r1/r2  
  4. 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不相交。

根据上述原理得到以下程序:

  1. #include <iostream.h> 
  2. #include <iomanip.h> 
  3. class Line  
  4. {   double x1,x2,y1,y2;  
  5. public:  
  6.     Line() { }  
  7.     Line(double a,double b,double c,double d)  
  8.     {   x1=a;y1=b;x2=c;y2=d;  
  9.         cout << "线段端点:(" << x1 << "," << y1 << ")-(" << x2 << ","    
  10.             << y2 << ")" << endl;  
  11.     };  
  12.     friend twoline(Line l1,Line l2)     //友元函数  
  13.     {   double r1=l2.y1*(l2.x2-l1.x1)-l1.y1*(l2.x2-l2.x1)+   
  14.             (l1.x1-l2.x1)*(l2.y2-l2.y1);  
  15.         double r2=(l1.y2-l1.y1)*(l2.x2-l2.x1)-  
  16.             (l1.x2-l1.x1)*(l2.y2-l2.y1);  
  17.         double r=r1/r2;  
  18.         double t=((l1.x1-l2.x1)+r*(l1.x2-l1.x1))/(l2.x2-l2.x1);  
  19.         if (r>0 && r<1 && t>0 && t<1)  
  20.             cout << "两线段相交." << endl;  
  21.         else if  (r>0 && r<1 && t>=1)  
  22.             cout << "两线段不相交,一条在另一条的一侧." << endl;  
  23.         else if ((r>=1 || r<=0) && t>0 && t<1)  
  24.             cout << "两线段不相交,一条在另一条的一侧." << endl;  
  25.         else   
  26.             cout << "两线段不相交." << endl;  
  27.     }  
  28. };  
  29. void main()  
  30. {   Line A(2,2,18,18),B(1,12,19,5);  
  31.     twoline(A,B);  
  32. }  

本程序的执行结果如下:

  1. 线段端点:(2,2)-(18,18)  
  2. 线段端点:(1,12)-(19,5)  
  3. 两线段相交.  

【例4.14】编写一个程序,设计一个类Trig,给定三角形的三条边长x、y、z,包含一个友元函数,计算两个三角形面积之和。

解:设计Trig类的一个私有成员函数area(),用于求三角形的面积,在友元函数twoarea()中调用area()成员函数,求两个三角形面积之和。程序如下:
 

  1. #include <iostream.h> 
  2. #include <math.h> 
  3. class Trig  
  4. {   double x,y,z;  
  5.     double area()                           //求三角形面积  
  6.     {   double d=(x+y+z)/2;  
  7.         return sqrt(d*(d-x)*(d-y)*(d-z));  
  8.     }  
  9. public:  
  10.     Trig(int i,int j,int k) { x=i;y=j;z=k; }  
  11.     int istrig()                            //判断是否构成三角形  
  12.     {   if (x+y>z && x+z>y && y+z>x)  
  13.             return 1;  
  14.         else  
  15.             return 0;  
  16.     }  
  17.     friend double twoarea(Trig,Trig);   //友元函数声明  
  18. };  
  19. double twoarea(Trig t1,Trig t2)         //友元函数实现  
  20. {   return t1.area()+t2.area();  }  
  21. void main()  
  22. {   Trig t1(6,5,8),t2(9,6,12);  
  23.     if (t1.istrig() && t2.istrig())  
  24.         cout << "两三角形面积之和:" << twoarea(t1,t2) << endl;  
  25.     else  
  26.         cout << "不能构成三角形" << endl;  
  27. }  

【例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。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.2.4 简答题 下一篇4.2.5 编程题(2)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·用 Python 进行数据 (2025-12-25 15:49:09)
·如何学习Python数据 (2025-12-25 15:49:07)
·利用Python进行数据 (2025-12-25 15:49:04)
·Java 学习线路图是怎 (2025-12-25 15:19:15)
·关于 Java 学习,有 (2025-12-25 15:19:12)