01-4-2 练习2-点和圆的关系
设计一个圆类(Circle),设计一个点类(Point)。计算点和圆的关系
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
class Circle
{
private:
double c_m_x;
double c_m_y;
double c_m_r;
public:
double getcx()
{
return c_m_x;
}
double getcy()
{
return c_m_y;
}
double getcr()
{
return c_m_r;
}
void setcx(double x)
{
c_m_x = x;
}
void setcy(double y)
{
c_m_y = y;
}
void setcr(double r)
{
c_m_r = r;
}
};
class Point
{
private:
double p_m_x;
double p_m_y;
public:
double getpx()
{
return p_m_x;
}
double getpy()
{
return p_m_y;
}
void setpx(double x)
{
p_m_x = x;
}
void setpy(double y)
{
p_m_y = y;
}
};
int dis(class Circle& c, class Point& p)
{
double dis = sqrt((c.getcx() - p.getpx()) * (c.getcx() - p.getpx()) + (c.getcy() - p.getpy()));
if (dis < c.getcr())
{
return 0;
}
else if (dis == c.getcr())
{
return 1;
}
return 2;
}
void main()
{
class Circle c1;
class Point p1;
c1.setcx(1.0);
c1.setcy(1.0);
c1.setcr(1.0);
p1.setpx(1.0);
p1.setpy(1.0);
int ret = dis(c1, p1);
switch (ret)
{
case 0:
cout << "点在圆内" << endl;
break;
case 1:
cout << "点在圆上" << endl;
break;
case 2:
cout << "点在圆外" << endl;
break;
}
return;
}
但是,在大型文件里面不允许这样的写法:因为所有的函数、类都在一个文件里面。所以我们要拆开,封装成一个一个小模块。
这里需要函数的分文件编写的知识。复习一下:
函数分文件的编写一般有 4 个步骤:
- 创建后缀名为
.h
的头文件 - 创建后缀名为
.cpp
的源文件 - 在头文件里面写函数的声明
- 在源文件里面写函数的定义
在这个点和圆的里面,就应该是这样的:
头文件
- circle.h
- dis.h
- point.h
源文件
- circle.cpp
- dis.cpp
- main.cpp
- point.cpp
-
头文件:
circle.h
:#pragma once #include
using namespace std; class Circle { private: double c_m_x; double c_m_y; double c_m_r; public: double getcx(); double getcy(); double getcr(); void setcx(double x); void setcy(double y); void setcr(double r); }; -
头文件:
dis.h
:#pragma once #include
using namespace std; int dis(class Circle& c, class Point& p); -
头文件:
point.h
:#pragma once #include
using namespace std; class Point { private: double p_m_x; double p_m_y; public: double getpx(); double getpy(); void setpx(double x); void setpy(double y); }; -
源文件:
circle.cpp
:#include "circle.h" #include
using namespace std; double Circle::getcx() { return c_m_x; } double Circle::getcy() { return c_m_y; } double Circle::getcr() { return c_m_r; } void Circle::setcx(double x) { c_m_x = x; } void Circle::setcy(double y) { c_m_y = y; } void Circle::setcr(double r) { c_m_r = r; } -
源文件:
dis.cpp
:#include "circle.h" #include "point.h" #include "dis.h" #include
#include using namespace std; int dis(class Circle& c, class Point& p) { double dis = sqrt((c.getcx() - p.getpx()) * (c.getcx() - p.getpx()) + (c.getcy() - p.getpy())); if (dis < c.getcr()) { return 0; } else if (dis == c.getcr()) { return 1; } return 2; } -
源文件:
main.cpp
:#include "circle.h" #include "point.h" #include "dis.h" #include
#include #include using namespace std; void main() { class Circle c1; class Point p1; c1.setcx(1.0); c1.setcy(1.0); c1.setcr(1.0); p1.setpx(1.0); p1.setpy(1.0); int ret = dis(c1, p1); switch (ret) { case 0: cout << "点在圆内" << endl; break; case 1: cout << "点在圆上" << endl; break; case 2: cout << "点在圆外" << endl; break; } return; } -
源文件:
point.cpp
:#include "point.h" #include
using namespace std; double Point::getpx() { return p_m_x; } double Point::getpy() { return p_m_y; } void Point::setpx(double x) { p_m_x = x; } void Point::setpy(double y) { p_m_y = y; }
这样我们就成功把文件拆开了!!!
头文件中的#pragma once
是为了防止出现重复的头文件。
在头文件中,只要函数的声明。定义全部在源文件。
在源文件要包含头文件。然后需要注意作用域,比如:double Point::getpy()
(文件:point.cpp
)。这里的Point::
就是作用域。如果不写,则表示这个函数在全局函数。加上了作用域就变成了成员函数。
:-)