id:31 A.Point(类与构造)
题目描述
下面是一个平面上的点的类定义,请在类外实现它的所有方法,并生成点测试它。
class Point
{
double x, y;
public:
Point(); // 缺省构造函数,给x,y分别赋值为0
Point(double x_value, double y_value); // 有参构造函数
double getX(); // 返回x的值
double getY();
void setX(double x_value); // 设置x的值
void setY(double y_value);
double dis(Point p); // 计算当前点到参数点的距离
};
输入
测试数据的组数 t
第一组测试数据点p1的x坐标 第一组测试数据点p1的y坐标 第一组测试数据点p2的x坐标 第一组测试数据点p2的y坐标
…
输出
输出p1到p2的距离,保留两位小数。详情参考输出样例。
在C++中,输出指定精度的参考代码如下:
#include <iostream>
#include <iomanip> //必须包含这个头文件
using namespace std;
void main( )
{
double a =3.14;
cout<<fixed<<setprecision(3)<<a<<endl; //输出小数点后3位
}
输入样例
2
1 2 3 4
-1 0.5 -2 5
输出样例
Distance of Point(1.00,2.00) to Point(3.00,4.00) is 2.83
Distance of Point(-1.00,0.50) to Point(-2.00,5.00) is 4.61
题解
- 首先分析
class
类,Point(); // 缺省构造函数,给x,y分别赋值为0
,这行代码的意思是,当使用Point类型定义一个变量且后面不跟任何参数时,会默认的执行这个函数,即为x, y分别赋值为0;Point(double x_value, double y_value); // 有参构造函数
,若用Point类型定义一个变量,且这个变量后面带参数,即会给这个变量的成员x和y赋括号里参数的值;double getX(); // 返回x的值
,当调用这个函数时,我们的目的是得到Point类型的变量的成员x的值;同理double getY();
这个代码的功能也是一样的;void setX(double x_value); // 设置x的值
,当调用这个函数时,会将调用这个函数的变量的x的值改变为参数的值;同理void setY(double y_value);
;double dis(Point p); // 计算当前点到参数点的距离
,在这个函数中,我们还要额外定义三个变量,一个用来存储两个点之间横坐标距离之差,一个用来存储纵坐标距离之差,还有一个用来存储计算得到的距离并返回,注意,在计算两个点之间的距离时,我们需要使用到两个点的横纵坐标的值,故会引起怎么引用的问题,我们需要用一个参数来调用这个计算两个点之间的距离的函数,故完成了一个点的调用,然后这个函数是带有参数的,把另一个点当作参数调用,则完成了两个点的调用,在这个函数中,x和y是调用这个函数的变量的成员,而怎么调用另一个变量的横纵坐标呢,则需要使用get函数,这个另一个点调用这个函数,然后会返回这个变量的横纵坐标,则实现了两个点的横纵坐标的调用 - 然后来看主函数的功能,在主函数中,我们需要定义测试组数和遍历变量,一个用于接收返回距离两点间答案的变量,然后定义一个Point类型的变量,这个变量会执行一次缺省构造函数,还要定义四个变量用于接收输入进来的两个点的横纵坐标的值
- 一个for循环,遍历完全组的两点,输入两个点的横纵坐标,然后定义一个Point类型的变量,带两个参数,将这两个参数的值赋到这个变量的横纵坐标变量,再调用类里边的set函数,将另外两个横纵坐标赋值到这个调用的变量的横纵坐标变量上,为什么要怎么麻烦,我也不懂,因为题目要求用上所有的类里边的函数,只能这样
- 最后就是按着输出样例的格式输出距离
代码实现
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
class Point
{
double x, y;
public:
Point(); // 缺省构造函数,给x,y分别赋值为0
Point(double x_value, double y_value); // 有参构造函数
double getX(); // 返回x的值
double getY();
void setX(double x_value); // 设置x的值
void setY(double y_value);
double dis(Point p); // 计算当前点到参数点的距离
};
Point::Point()
{
x = 0;
y = 0;
}
Point::Point(double x_value, double y_value)
{
x = x_value;
y = y_value;
}
double Point::getX()
{
return x;
}
double Point::getY()
{
return y;
}
void Point::setX(double x_value)
{
x = x_value;
}
void Point::setY(double y_value)
{
y = y_value;
}
double Point::dis(Point p)
{
double result, dx, dy;
dx = x - p.getX();
dy = y - p.getY();
result = sqrt(dx * dx + dy * dy);
return result;
}
int main()
{
int t, i;
double ans, p1x, p1y, p2x, p2y;
Point p2;
cin >> t;
for (i = 0; i < t; i++)
{
cin >> p1x >> p1y >> p2x >> p2y;
Point p1(p1x, p1y);
p2.setX(p2x);
p2.setY(p2y);
ans = p1.dis(p2);
cout << "Distance of Point(" << fixed << setprecision(2) << p1.getX() << "," << fixed << setprecision(2) << p1.getY() << ") to Point(" << fixed << setprecision(2) << p2.getX() << "," << fixed << setprecision(2)<< p2.getY() << ") is ";
cout << fixed << setprecision(2) << ans << endl;
}
return 0;
}
id:32 B.Date(类与构造)
题目描述
下面是一个日期类的定义,请在类外实现其所有的方法,并在主函数中生成对象测试之。
class Date
{
int year, month, day;
public:
Date(); // 缺省构造函数
Date(int y, int m, int d); // 带参构造函数
int getYear(); // 返回当前日期的年份
int getMonth();
int getDay();
void setDate(int y, int m, int d); // 按参数重设日期的值
void print(); // 按格式输出当前日期的年、月、日
void addOneDay(); // 在当前日期上加一天
};
注意,在判断明天日期时,要加入跨月、跨年、闰年的判断
例如9.月30日的明天是10月1日,12月31日的明天是第二年的1月1日
2月28日的明天要区分是否闰年,闰年则是2月29日,非闰年则是3月1日
输入
测试数据的组数t
第一组测试数据的年 月 日
…
要求第一个日期的年月日初始化采用构造函数,第二个日期的年月日初始化采用setDate方法,第三个日期又采用构造函数,第四个日期又采用setDate方法,以此类推。
输出
输出今天的日期
输出明天的日期
输入样例1
4
2012 1 3
2012 2 28
2012 3 31
2012 4 30
输出样例1
Today is 2012/01/03
Tomorrow is 2012/01/04
Today is 2012/02/28
Tomorrow is 2012/02/29
Today is 2012/03/31
Tomorrow is 2012/04/01
Today is 2012/04/30
Tomorrow is 2012/05/01
输入样例2
4
2014 1 3
2014 2 28
2014 3 31
2014 4 30
输入样例3
3
2000 2 29
2014 3 31
2014 12 31
提示
C++中设置填充字符的代码参考如下:
cout << setfill('0') << setw(2) << month; //设置宽度为2,前面补'0'
需要头文件#include <iomanip>
题解
- 首先来分析日期类,
Date(); // 缺省构造函数
,用来初始化类里面的年月日;Date(int y, int m, int d); // 带参构造函数
,用来给年月日赋参数的值,int getYear(); // 返回当前日期的年份
,通过调用这个函数,我们可以得到调用这个函数的变量的年份的值;同理int getMonth();
int getDay();
这两行的代码功能相同;void setDate(int y, int m, int d); // 按参数重设日期的值
将日期的值设为参数的值,这个函数可以用在初始化一个Date类型的变量中;void print(); // 按格式输出当前日期的年、月、日
,这个函数只用于输出当天日期的值,即,当输入一个日期时,便马上调用这个函数输出这个日期的值;void addOneDay(); // 在当前日期上加一天
,这个函数用来计算输入的日期的下一天的日期 void addOneDay(); // 在当前日期上加一天
,在这个函数中,我们先用日作为if语句判断的条件,然后再判断月份,最后判断年份;具体来数,我们把判断的条件划分为,是否是28号,29号,30号和31号这几个特殊的日期,如果是28号的话,再判断其是否是2月份,再判断其是否是闰年,如果是29号的话,判断其是否是二月份,但是不用再判断是否是闰年,如果是30号的话,要分大小月;31号特殊的地方在于要判断他的月份是否是12月,如果是的话要年份加一- 然后来看看主函数的功能,需要定义用于存储输入进来的年月日的变量,然后还要定义Date类型的变量,因为需要年月日的成员,在定义这个变量是,程序自