uva478

题意概述:

    有n(n<=10)组图形(长方形、圆形、三角形),再有有限多个点,我们需要判断点在不在各个图形中。图形和点都需要输入。图形的输入以r\c\t开始分别表示长方形、圆形、三角形。长方形的输入包括r和左上与右下两个点坐标,圆形包括c和圆心坐标与半径,三角形的输入包括t和三个点的坐标。点的输入以点(9999.9,9999.9)的输入结束。

  所以这道题非常适合作为类的一个练习题。对于点可以构建一个类,包含横纵坐标,由于类的数据私有性,同时也要有相应的取值(横纵坐标)函数,由于判断点与圆的位置关系时要计算点与点的距离,故还要有一个相应的函数,最好放在点类里。对于图形,可构造一个基类,拥有一个名字(r\c\t),和一个点。再根据各类图形各自的特点加入其他数据,而对图形类保持虚继承。因为最终用来测试时,我们需要一个类(测试类),我们并不提前知道要输入什么图形。只有让测试把三者图形都继承了,输入了名字后,按照基类继承的函数接口去访问正确的函数。

样例:2011061309465597.png

ContractedBlock.gif ExpandedBlockStart.gif View Code
 
   
1 #include < iostream >
2 #include < cmath >
3   using namespace std;
4   class point{
5 private :
6 double x;
7 double y;
8 public :
9 friend istream & operator >> (istream & input,point & t)
10 {
11 input >> t.x >> t.y;
12 return input;
13 }
14 point( double a = 0.0 , double b = 0.0 ){
15 x = a;
16 y = b;
17 }
18 double getx(){
19 return x;
20 }
21 double gety(){
22 return y;
23 }
24 double distance(point & t)
25 {
26 return sqrt((x - t.x) * (x - t.x) + (y - t.y) * (y - t.y));
27 }
28 int input(){
29 cin >> x >> y;
30 if (x == 9999.9 && y == 9999.9 )
31 return 0 ;
32 return 1 ;
33 }
34 };
35 class figure{
36 private :
37 char name;
38 point position;
39 public :
40 figure( char c = ' * ' , double x = 0.0 , double y = 0.0 )
41 :position(x,y)
42 {
43 name = c;
44 }
45 int input(){
46 cin >> name;
47 if (name == ' c ' || name == ' r ' || name == ' t ' )
48 { cin >> position;
49 return 1 ; }
50 return 0 ;
51 }
52 char getname(){
53 return name;
54 }
55 point & getposition()
56 {
57 return position;
58 }
59 };
60 class rectangle: virtual public figure
61 {
62 private :
63 point right;
64 public :
65 void input(){
66 cin >> right;
67 }
68 int judge(point & t)
69 {
70 if (figure::getposition().getx() < t.getx() && t.getx() < right.getx()
71 && figure::getposition().gety() > t.gety() && t.gety() > right.gety())
72 return 1 ;
73 return 0 ;
74 }
75 };
76 class circle: virtual public figure
77 {
78 private :
79 double radius;
80 public :
81 void input()
82 {
83 cin >> radius;
84 }
85 int judge(point & t)
86 {
87 if (figure::getposition().distance(t) < radius)
88 return 1 ;
89 return 0 ;
90 }
91 };
92 class triangle: virtual public figure
93 {
94 private :
95 point two;
96 point three;
97 int location;
98 public :
99 triangle(){
100 location = 0 ;
101 }
102 void input()
103 {
104 cin >> two >> three;
105 }
106 int judge_aid(point & a,point & b,point & c,point & d) const
107 {
108 double i = (c.getx() - a.getx()) * (b.gety() - a.gety()) - (c.gety() - a.gety()) * (b.getx() - a.getx());
109 double j = (d.getx() - a.getx()) * (b.gety() - a.gety()) - (d.gety() - a.gety()) * (b.getx() - a.getx());
110 if ( i * j > 0 )
111 return 1 ;
112 return 0 ;
113 }
114 int judge(point & t)
115 {
116 point temp = figure::getposition();
117 if (judge_aid(temp,two,three,t) == 1
118 && judge_aid(two,three,temp,t) == 1
119 && judge_aid(three,temp,two,t) == 1 )
120 return 1 ;
121 return 0 ;
122 }
123 };
124 class uva477: public rectangle, public circle, public triangle
125 {
126 private :
127 int num;
128 public :
129 uva477()
130 {
131 num = 1 ;
132 }
133 int input(){
134 int k = figure::input();
135 if (k == 0 )
136 return k;
137 char c = figure::getname();
138 if (c == ' c ' )
139 circle::input();
140 else if (c == ' r ' )
141 { rectangle::input();
142 num = 2 ; }
143 else
144 {
145 triangle::input();
146 num = 3 ;
147 }
148 return 1 ;
149 }
150 int judge(point & t)
151 {
152 if (num == 1 )
153 return circle::judge(t);
154 else if (num == 2 )
155 return rectangle::judge(t);
156 else
157 return triangle::judge(t);
158 }
159 };
160 int main()
161 {
162 uva477 test[ 11 ];
163 point trial;
164 int i = 0 ,count = 0 ,sum = 0 ,j = 0 ;
165 for (i = 0 ;i < 11 ;i ++ )
166 if (test[i].input() == 0 )
167 break ;
168 count = i;
169 while (trial.input() != 0 )
170 {
171 sum ++ ;
172 int flag = 0 ;
173 for (j = 0 ;j < count;j ++ )
174 if (test[j].judge(trial) == 1 )
175 {
176 flag = 1 ;
177 cout << " Point " << sum << " is contained in figure " << j + 1 << endl;
178 }
179 if (flag == 0 )
180 cout << " Point " << sum << " is not contained in any figure " << endl;
181 }
182 return 0 ;
183 }

转载于:https://www.cnblogs.com/zhwyprime/archive/2011/06/13/2079419.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值