计重转换(期末模拟)

【id:374】【10分】E. 五、计重转换(期末模拟)
时间限制
1s
内存限制
128MB
题目描述

目前国际计重最基本的单位是克。在古代各个国家的计重单位是不同的。

中国使用斤、两、钱来表示重量,其中1斤=10两,1两=10钱

中国计重单位与克的关系为:1斤=500克,1两=50克,1钱=5克

英国使用磅、盎司、打兰来表示重量,其中1磅=16盎司,1盎司=16打兰

英国计重单位与克的关系为:1磅=512克,1盎司=32克,1打兰=2克

以下参考代码包含了抽象类Weight,中国计重和英国计重都继承了抽象类。

中国计重类新增了斤、两、钱三个属性,并新增了一个操作:计重转换Convert。

Convert能够把输入的克数转成中国计重,例如1234克转成2斤4两6钱4克,并且把数值放入斤、两、钱、克四个属性中

英国计重类新增了磅、盎司、打兰三个属性,并新增了两个操作:

1、计重转换Convert,功能与上述类似,例如2345克转成4磅9盎司4打兰1克,并且把数值放入对应的四个属性中

2、计重等价,重载类型转换运算符,实现将英国计重类的对象转换成中国计重类的对象,例如英国计重类对象en(2磅2盎司11打兰1克)等价于(转换成)中国计重类对象cn(2斤2两2钱1克)。

程序要求如下

1、参考代码框架不能做任何修改,在要求的地方添加代码

2、主函数不能有任何修改

以上数据纯粹为题目设计,方便计算,实际换算数据是不同的。

上述所有类属性都不是public,用面向对象思想和C++语言实现上述要求

----参考代码----

class CN; //提前声明

class EN; //提前声明

class Weight{ //抽象类

protected:

char kind[20]; //计重类型

int gram; //克

public:

Weight (char tk[]="no name", int tg=0)

{ strcpy(kind, tk);

gram = tg;

}

virtual void Print(ostream & out) = 0; //输出不同类型的计重信息

};

class CN: public Weight { //中国计重

//....类定义自行编写

};

class EN: public Weight { //英国计重

//....类定义自行编写

}

//以全局函数方式重载输出运算符,代码3-5行....自行编写

//重载函数包含两个参数:ostream流对象、Weight类对象,参数可以是对象或对象引用

//重载函数必须调用参数Weight对象的Print方法

int main()//主函数

{int tw;

//创建一个中国计重类对象cn

//构造参数对应斤、两、钱、克、类型,其中克和类型是对应基类属性gram和kind

CN cn(0,0,0,0, "中国计重");

cin>>tw;

cn.Convert(tw); //把输入的克数转成中国计重

cout<<cn;

//创建英国计重类对象en

//构造参数对应磅、盎司、打兰、克、类型,其中克和类型是对应基类属性gram和kind

EN en(0,0,0,0,"英国计重");

cin>>tw;

en.Convert(tw); //把输入的克数转成英国计重

cout<<en;

cn=en; //把英国计重转成中国计重

cout<<cn;

return 0;

}


输入

第一行输入一个克数,调用中国计重转换,把克数转成中国计重

第二行输入一个克数,调用英国计重转换,把克数转成英国计重,并调用计重等价把英国计重转成中国计重


输出

根据主函数运行输出


样例查看模式 
正常显示
查看格式
输入样例1 <-复制
1234
2345

输出样例1
中国计重:2斤4两6钱4克
英国计重:4磅9盎司4打兰1克
中国计重:4斤6两9钱0克

Weight为抽象类,需要实现其所有的方法,否则会报错

在进行en到cn时,无法使用cn的构造函数的形式来实现,需要使用下面的代码来进行实现,没有见过

operator CN() {

int g = bang * 512 + gusi * 32 + dalan * 2 + gram;

CN temp(g / 500, g % 500 / 50, g % 50 / 5, g % 5, "中国计重");

return temp;

}

在重载输出运算符时,格式是固定的,否则会报错

friend ostream &operator<<(ostream &out, CN cn) {

cn.Print(out);

return out;

}

#include <cstring>
#include "iostream"
#include "string"

using namespace std;

//中国使用斤、两、钱来表示重量,其中1斤=10两,1两=10钱
//
// 中国计重单位与克的关系为:1斤=500克,1两=50克,1钱=5克
//
// 英国使用磅、盎司、打兰来表示重量,其中1磅=16盎司,1盎司=16打兰
//
// 英国计重单位与克的关系为:1磅=512克,1盎司=32克,1打兰=2克
class CN; //提前声明

class EN; //提前声明

class Weight { //抽象类
protected:
    char kind[20]; //计重类型
    int gram; //克
public:
    Weight(char tk[] = "no name", int tg = 0) {
        strcpy(kind, tk);
        gram = tg;
    }

    virtual void Print(ostream &out) = 0; //输出不同类型的计重信息
};

class CN : public Weight { //中国计重
//....类定义自行编写
//中国计重类新增了斤、两、钱三个属性,并新增了一个操作:计重转换 Convert。
//
// Convert能够把输入的克数转成中国计重,例如1234克转成2斤4两6钱4克,并且把数值放入斤、两、钱、克四个属性中
protected:
    int jin;
    int liang;
    int qian;
public:

    CN(int jin, int liang, int qian, int tg, char *kind) : jin(jin), liang(liang), qian(qian) {
        strcpy(this->kind, kind);
        gram = tg;
    }

    void Convert(int g) {
        jin = g / 500;
        liang = g % 500 / 50;
        qian = g % 50 / 5;
        gram = g % 5;
    }

    friend ostream &operator<<(ostream &out, CN cn) {
        cn.Print(out);
        return out;
    }

    void Print(ostream &out) {
        out << "中国计重:" << jin << "斤" << liang << "两" << qian << "钱" << gram << "克" << endl;
    }
};

class EN : public Weight { //英国计重
//....类定义自行编写
//英国计重类新增了磅、盎司、打兰三个属性,并新增了两个操作:
//
// 1、计重转换 Convert,功能与上述类似,例如2345克转成4磅9盎司4打兰1克,并且把数值放入对应的四个属性中
//
// 2、计重等价,重载类型转换运算符,实现将英国计重类的对象转换成中国计重类的对象,例如英国计重类对象en(2磅2盎司11打兰1克)等价于(转换成)中国计重类对象cn(2斤2两2钱1克)。
protected:
    int bang;
    int gusi;
    int dalan;
public:
    EN(int bang, int gusi, int dalan, int tg, char *kind) : bang(bang), gusi(gusi), dalan(dalan) {
        strcpy(this->kind, kind);
        gram = tg;
    }

    operator CN() {
        int g = bang * 512 + gusi * 32 + dalan * 2 + gram;
        CN temp(g / 500, g % 500 / 50, g % 50 / 5, g % 5, "中国计重");
        return temp;
    }

    void Convert(int g) {// 英国使用磅、盎司、打兰来表示重量,其中1磅=16盎司,1盎司=16打兰
// 英国计重单位与克的关系为:1磅=512 克,1盎司= 32 克,1打兰=2克
        bang = g / 512;
        gusi = g % 512 / 32;
        dalan = g % 32 / 2;
        gram = g % 2;

    }

// 2、计重等价,重载类型转换运算符,实现将英国计重类的对象转换成中国计重类的对象,
// 例如英国计重类对象en(2磅2盎司11打兰1克)等价于(转换成)中国计重类对象cn(2斤2两2钱1克)。
    friend ostream &operator<<(ostream &out, EN &en) {
        en.Print(out);
        return out;
    }

    void Print(ostream &out) {
        out << "英国计重:" << bang << "磅" << gusi << "盎司" << dalan << "打兰" << gram << "克" << endl;
    }
};

//以全局函数方式重载输出运算符,代码3-5行....自行编写

//重载函数包含两个参数:ostream流对象、Weight类对象,参数可以是对象或对象引用

//重载函数必须调用参数Weight对象的Print方法
//主函数
int main() {
    int tw;
//创建一个中国计重类对象cn
//构造参数对应斤、两、钱、克、类型,其中克和类型是对应基类属性gram和kind
    CN cn(0, 0, 0, 0, "中国计重");
    cin >> tw;
    cn.Convert(tw); //把输入的克数转成中国计重
    cout << cn;
//创建英国计重类对象en
//构造参数对应磅、盎司、打兰、克、类型,其中克和类型是对应基类属性gram和kind
    EN en(0, 0, 0, 0, "英国计重");
    cin >> tw;
    en.Convert(tw); //把输入的克数转成英国计重
    cout << en;
    cn = en; //把英国计重转成中国计重
    cout << cn;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值