C++_第五周做题总结_构造与析构

博客围绕C++类与构造展开,包含Point、Date、分数类、Point_Array、Stack等类的题目。详细描述了各题的输入输出要求,给出题解思路,分析类和主函数功能,还提及部分反思和疑问,最后给出代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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类型的变量,因为需要年月日的成员,在定义这个变量是,程序自
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值