C++期末模拟

id:124 A. 一、会员积分(期末模拟)

题目描述

某电商网站的会员分为:普通、贵宾两个级别

普通会员类Member,包含编号、姓名、积分三个属性,编号和积分是整数,姓名是字符串
操作包括构造、打印、积分累加、积分兑换,操作定义如下:

  1. 积分累加add,是根据消费金额累加积分,无返回值,参数是消费金额(整数),积分根据消费金额按1比1的比例累加。
  2. 积分兑换exchange,是按照每100积分换1元的比例,把积分兑换成现金。参数是要兑换的积分数量,返回值是兑换的现金数量。
    注意:兑换积分数量不足100的部分是不能兑换的,例如会员原有500积分,要兑换积分数量为450,则450/100=4,最终用400积分兑换4元,会员余100积分。
  3. 打印是输出会员信息,格式参考输出样例

贵宾会员类VIP,继承了普通会员的属性与操作,新增两个属性:累加比例(整数)、兑换比例(整数)。并且重定义了所有操作:

  1. 积分累加中,积分按累加比例进行累加。例如累加比例是2,消费金额100元,则累加积分=100*2=200
  2. 积分兑换中,按照兑换比例的数值把积分抵扣消费金额。例如兑换比例是90,会员原有500积分,要兑换积分数量为420,则420/90=4,最终用360积分兑换4元,会员余140积分。
  3. 打印是输出会员信息,格式参考输出样例

程序要求

  1. 采用继承机制实现上述会员关系
  2. 打印、积分累加和积分兑换都采用虚函数方式,来实现运行多态性
  3. 派生的构造函数必须考虑基类属性的构造。
  4. 必须采用以下代码框架,在提示的地方增加代码,其他地方不能修改。

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

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

// 普通会员类
class Member 
{  
	// ....代码自行编写
};

// 贵宾会员类
class VIP .... 
{  
	// ....代码自行编写
};

int main()
{
	// 创建一个基类对象指针
	Member* pm;
	// ....其他变量自行编写

	// 输入数据,创建普通会员对象mm
	// 使用指针pm执行以下操作:
	// 1、pm指向普通会员对象mm
	// 2、输入数据,通过pm执行积分累加和积分兑换
	// 3、通过pm调用打印方法输出

	// 输入数据,创建贵宾会员对象vv
	// 使用指针pm执行以下操作:
	// 1、pm指向贵宾会员对象vv
	// 2、输入数据,通过pm执行积分累加和积分兑换
	// 3、通过pm调用打印方法输出

	return 0;
}

输入

第一行输入普通会员的三个信息:编号、姓名、积分
第二行输入两个操作信息:消费金额、积分兑换数量,表示普通会员执行一次积分累加,一次积分兑换
第三行输入贵宾会员的五个信息:编号、姓名、积分、累加比例、兑换比例
第四行输入两个操作信息:消费金额、积分兑换数量,表示贵宾会员执行一次积分累加,一次积分兑换

输出

第一行输出普通会员执行两个操作后的信息,要求调用打印方法
第二行输出贵宾会员执行两个操作后的信息,要求调用打印方法

输入样例

1001 John 500
244 300
8001 Jane 300 2 90
100 420

输出样例

普通会员1001–John–444
贵宾会员8001–Jane–140

题解

  • 本题使用到的知识点有继承,虚函数与多态
  • 首先看Member类的实现,此类里面实现了构造,打印,积分累加和积分兑换,最后三个都是虚函数,因为其的子类也需要实现这三个函数
  • VIP继承了Member类,实现的功能有构造,打印,积分累加和积分兑换
  • 虚函数的主要目的是,在主函数中定义一个父类的指针,两个类的类型的变量,通过父类的指针指向不同类类型的变量从而调用不同类的类函数,如果不使用虚函数的话,不管主函数中的父类指针指向哪个变量,最终都会调用父类的函数,因为这是静态联编的作用,虚函数的目的是实现动态联编

代码实现

#include <iostream>
using namespace std;

class Member
{
protected:
    int b_num, j_num;
    string name;
public:
    Member(int b, string n, int j);
    virtual void print();
    virtual void add(int m);
    virtual int exchange(int n);
};

Member::Member(int b, string n, int j)
    : b_num(b), j_num(j), name(n)
{
}

void Member::print()
{
    cout << "普通会员" << b_num << "--" << name << "--" << j_num << endl;
}

void Member::add(int m)
{
    j_num += m;
}

int Member::exchange(int n)
{
    j_num -= (n / 100) * 100;
    return n / 100;
}

class VIP : public Member
{
private:
    int l_pro, d_pro;
public:
    VIP(int b, string n, int j, int l, int d);
    void print();
    void add(int m);
    int exchange(int n);
};

VIP::VIP(int b, string n, int j, int l, int d)
    : Member(b, n, j), l_pro(l), d_pro(d)
{
}

void VIP::print()
{
    cout << "贵宾会员" << b_num << "--" << name << "--" << j_num << endl;
}

void VIP::add(int m)
{
    j_num += l_pro * m;
}

int VIP::exchange(int n)
{
    j_num -= (n / d_pro) * d_pro;
    return n / d_pro;
}

int main()
{
    int bn, jn, money, num, lpro, dpro;
    string name;
    // 创建一个基类对象指针
    Member * pm;

    // 输入数据,创建普通会员对象mm
    cin >> bn >> name >> jn;
    Member mm(bn, name, jn);

    // 使用指针pm执行以下操作:
    // 1、pm指向普通会员对象mm
    pm = &mm;
    // 2、输入数据,通过pm执行积分累加和积分兑换
    cin >> money >> num;
    pm->add(money);
    pm->exchange(num);
    // 3、通过pm调用打印方法输出
    pm->print();

    // 输入数据,创建贵宾会员对象vv
    cin >> bn >> name >> jn >> lpro >> dpro;;
    VIP vv(bn, name, jn, lpro, dpro);
    // 使用指针pm执行以下操作:
    // 1、pm指向贵宾会员对象vv
    pm = &vv;
    // 2、输入数据,通过pm执行积分累加和积分兑换
    cin >> money >> num;
    pm->add(money);
    pm->exchange(num);
    // 3、通过pm调用打印方法输出
    pm->print();

    return 0;
}

id:125 B. 二、金属加工(期末模拟)

题目描述

在金属加工中,金属具有硬度、重量、体积的属性(都是整数),包括四种操作:

  1. 合并,每两块金属可以合并成一块新的金属。新金属的重量等于原两块金属的重量之和,体积和硬度也类似计算。
  2. 巨化,金属通过熔炼风吹的方法会巨化,体积变大n倍,重量和硬度不变
  3. 硬化,在金属中加入高分子材料可以硬化金属,每提升硬度一级,重量和体积都增加10%。
  4. 软化,在金属中加入特殊化学溶液可以降低金属硬度,每降低硬度一级,重量和体积都减少10%

用类来描述金属,用运算符重载方式实现金属的四种操作,并定义打印函数,具体要求如下

  1. 用加法运算符、友元的方式实现合并
  2. 用乘法运算符、友元的方式实现巨化,含两个参数:金属对象、巨化倍数
  3. 用++运算符、成员函数、前增量的方式实现硬化
  4. 用–运算符、成员函数、后增量的方式实现软化
  5. 打印函数用来输出金属的信息,输出格式看参考样本

操作中所有属性的运算结果都只保留整数部分。

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

输入

第一行输入第一块金属的信息,包括硬度、重量、体积

第二行输入第二块金属的信息,包括硬度、重量、体积

第三行输入一个参数n,表示巨化n倍

输出

第一行输出两块金属合并后的信息

第二行输出第一块金属巨化n倍的信息

第三行输出第一块金属提升硬度一级后的信息

第四行输出第二块金属降低硬度一级后的信息

输入样例

3 3000 300
5 5000 500
2

输出样例

硬度8–重量8000–体积800
硬度3–重量3000–体积600
硬度4–重量3300–体积330
硬度4–重量4500–体积450

题解

  • 此题运用到的知识点为类,友元和运算符重载
  • 首先看CMetal类的实现,实现的功能有有参和无参的构造,运用友元实现运算符+*的重载,用成员函数实现++--=的重载,还有打印函数
  • 需要注意的是CMetal& operator++();这个形式表示的是前增量,CMetal operator--(int);是后增量,CMetal& operator=(const CMetal& m1);,返回一个引用的形式的话不能返回一个临时变量,一般是返回他自己,即*this

代码实现

#include <iostream>
using namespace std;

class CMetal
{
private:
    int hard, w, v;
public:
    CMetal();
    CMetal(int h1, int w1, int v1);
    friend CMetal operator+(const CMetal& m1, const CMetal& m2);
    friend CMetal operator*(const CMetal& m1, int n);
    CMetal& operator++(); // 前增量
    CMetal operator--(int); // 后增量
    CMetal& operator=(const CMetal& m1);
    void print();
};

CMetal::CMetal()
    : hard(0), w(0), v(0)
{
}

CMetal::CMetal(int h1, int w1, int v1)
    : hard(h1), w(w1), v(v1)
{
}

CMetal operator+(const CMetal& m1, const CMetal& m2)
{
    CMetal mm;
    mm.hard = m1.hard + m2.hard;
    mm.w = m1.w + m2.w;
    mm.v = m1.v + m2.v;
    return mm;
}

CMetal operator*(const CMetal& m1, int n)
{
    CMetal mm;
    mm.hard = m1.hard;
    mm.w = m1.w;
    mm.v = m1.v * n;
    return mm;
}

CMetal& CMetal::operator++()
{
    hard++;
    w += w * 0.1;
    v += v * 0.1;
    return *this;
}

CMetal CMetal::operator--(int)
{
    CMetal temp(*this); // 把自己拷贝
    hard--;
    w -= w * 0.1;
    v -= v * 0.1;
    return temp;
}

CMetal& CMetal::operator=(const CMetal& m1)
{
    hard = m1.hard;
    w = m1.w;
    v = m1.v;
    return *this;
}

void CMetal::print()
{
    cout << "硬度" << hard << "--重量" << w << "--体积" << v << endl;
}

int main()
{
    int h1, w1, v1, h2, w2, v2, n;
    cin >> h1 >> w1 >> v1 >> h2 >> w2 >> v2 >> n;

    CMetal m1(h1, w1, v1);
    CMetal m2(h2, w2, v2);
    CMetal m3;

    m3 = m1 + m2; // 合并
    m3.print();

    m3 = m1 * n; // 巨化
    m3.print();

    ++m1; // 提升硬度一级
    m1.print();

    m2--; // 降低硬度一级
    m2.print();

    return 0;
}

id:126 C. 三、加密模板(期末模拟)

题目描述

加密机制包括明文、密文、密钥。用密钥对明文进行加密后就得到密文。
在古典加密机制中,偏离值是一种常见的方法,加密过程为

  1. 在已知数据中找出最大值
  2. 用最大值减去各个数值,得到相应的偏离值
  3. 偏离值加上密钥就得到密文
    例如明文为1 2 3 4 5,密钥是10,加密过程为:
  4. 找出明文的最大值是5
    2、用5减去明文的各个数值,得到偏离值4 3 2 1 0
  5. 用偏离值加上密钥,得到密文14 13 12 11 10

定义一个函数模板,名为max,参数包括数组和数组长度,返回值是数组中的最大值,要求支持整数、浮点数和字符三种类型。

用类模板定义一个加密类,包含四个属性:明文、密文、密钥、长度,前三个属性都是同一种类型,长度是整数。长度是指明文的长度。
类模板包含操作构造、加密、打印,说明如下:

  1. 加密是调用函数模板max得到数组最大值,按照前面的方法使用最大值和密钥进行加密,得到密文
  2. 打印是输出密文
    要求类模板支持整数、浮点数和字符三种类型。

参考代码给出了加密类界面(只支持整数类型)、主函数(支持三种数据类型),程序要求

  1. 根据要求编写函数模板max
  2. 使用类模板方法改造加密类界面,不能增加任何属性和操作,必须在类外实现构造函数和加密方法
  3. 主函数不能有任何修改

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

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

//只支持整数类型的加密类界面
class Cryption
{
private:
	int ptxt[100]; //明文
	int ctxt[100]; //密文
	int key; //密钥
	int len; //长度
public:
	Cryption(int tk, int tt[], int n); //参数依次对应密钥、明文、长度
	void encrypt(); //加密
	void print() //打印,无需改造
	{
		int i;
		for (i = 0; i < len - 1; i++)
		{
			cout << ctxt[i] << " ";
		}
		cout << ctxt[i] << endl;
	}
};

//支持三种类型的主函数
int main()
{
	int i;
	int length; //长度
	int ik, itxt[100];
	double dk, dtxt[100];
	char ck, ctxt[100];
	//整数加密
	cin >> ik >> length;
	for (i = 0; i < length; i++)
	{
		cin >> itxt[i];
	}
	Cryption<int> ic(ik, itxt, length);
	ic.encrypt();
	ic.print();
	//浮点数加密
	cin >> dk >> length;
	for (i = 0; i < length; i++)
	{
		cin >> dtxt[i];
	}
	Cryption<double> dc(dk, dtxt, length);
	dc.encrypt();
	dc.print();
	//字符加密
	cin >> ck >> length;
	for (i = 0; i < length; i++)
	{
		cin >> ctxt[i];
	}
	Cryption<char> cc(ck, ctxt, length);
	cc.encrypt();
	cc.print();

	return 0;
}

输入

第一行输入整数类型的信息,包括密钥、长度、明文
第二行输入浮点数类型的信息,包括密钥、长度、明文
第三行输入字符类型的信息,包括密钥、长度、明文

输出

三行分别输出三种类型的密文

输入样例

10 5 1 2 3 4 5
11.11 4 1.1 2.2 3.3 4.4
O 3 a b c

输出样例

14 13 12 11 10
14.41 13.31 12.21 11.11
Q P O

题解

  • 本体用到的知识点是类的模板和函数模板
  • 在主函数中定义类的一个变量时,需要用<>,在尖括号里面写出这个变量的类型,例如Cryption<int> ic(ik, itxt, length);

代码实现

#include <iostream>
using namespace std;

template <typename T1>
T1 Max(int n, T1* a)
{
	int i;
	T1 max = a[0];

	for (i = 0; i < n; i++)
	{
		if (a[i] > max)
		{
			max = a[i];
		}
	}
	return max;
}

template <typename T1>
class Cryption
{
private:
	int len; // 长度是指明文的长度
	T1 ptxt[100], ctxt[100], key; // 明文,密文,密钥
public:
	Cryption(T1 tk, T1 tt[], int n); //参数依次对应密钥、明文、长度
	void encrypt(); //加密
	void print(); //打印
};

template <typename T1>
Cryption<T1>::Cryption(T1 tk, T1 tt[], int n)
	: len(n), key(tk)
{
	int i;
	for (i = 0; i < len; i++)
	{
		ptxt[i] = tt[i];
		ctxt[i] = 0;
	}
}

template <typename T1>
void Cryption<T1>::encrypt() // 加密
{
	int i;
	T1 max = Max(len, ptxt);

	for (i = 0; i < len; i++)
	{
		ctxt[i] = (max - ptxt[i]) + key;
	}
}

template <typename T1>
void Cryption<T1>::print()
{
	int i;
	for (i = 0; i < len - 1; i++)
	{
		cout << ctxt[i] << " ";
	}
	cout << ctxt[i] << endl;
}

int main()
{
	int i;
	int length; //长度
	int ik, itxt[100];
	double dk, dtxt[100];
	char ck, ctxt[100];

	//整数加密
	cin >> ik >> length;
	for (i = 0; i < length; i++)
	{
		cin >> itxt[i];
	}
	Cryption<int> ic(ik, itxt, length);
	ic.encrypt();
	ic.print();

	//浮点数加密
	cin >> dk >> length;
	for (i = 0; i < length; i++)
	{
		cin >> dtxt[i];
	}
	Cryption<double> dc(dk, dtxt, length);
	dc.encrypt();
	dc.print();

	//字符加密
	cin >> ck >> length;
	for (i = 0; i < length; i++)
	{
		cin >> ctxt[i];
	}
	Cryption<char> cc(ck, ctxt, length);
	cc.encrypt();
	cc.print();

	return 0;
}

id:127 D. 四、加湿风扇(期末模拟)

题目描述

已知家电有编号、功率的属性,属性都是整数,操作包括构造和打印等

电风扇继承家电的特点,新增两个属性(整数):风向和风力,其中风向为0表示定向吹风,状态为1表示旋转吹风。
风扇包含两个新操作:风向控制和风力控制

  1. 风向控制含一个整数参数,无返回,把风向设置为参数值,参数为0表示定向吹风,为1表示旋转吹风。
  2. 风力控制含一个整数参数,无返回,把风力设置为参数值,参数表示风力级别,例如1级、2级、3级等。

加湿器继承家电的特点,新增两个属性(浮点数):实际水容量和最大水容量
新增操作是预警,无参数,返回值为整数,当实际水容量不小于最大水容量的50%,则返回1;小于50%且不小于10%则返回2,小于10%则返回3

加湿风扇继承了风扇和加湿器的特点,新增属性档位(整数)
新增操作调整档位,含一个参数,无返回值,先设置档位为参数值,再调用风向控制和风力控制来设置相关属性,包括:

  1. 参数为0,不做其他属性修改
  2. 参数为1,设置定向吹风且风力1级
  3. 参数为2,设置旋转吹风且风力2级
  4. 参数为3,设置旋转吹风且风力3级
    档位只可能是0、1、2、3四个数值,其他数值忽略。
    加湿风扇重载打印操作,输出格式参考样本。输出要求如下:
  5. 如果风向为0,则输出定向吹风,风向为1则输出旋转吹风。
  6. 调用预警操作,并根据返回结果1、2、3输出不同信息,分别是:水量正常、水量偏低、水量不足

程序要求

  1. 采用虚拟继承机制实现上述电器的关系,明确谁是虚基类、基类、派生类
  2. 基类和派生类的构造要考虑虚基类、基类的属性构造
    上述所有类属性都不是public,用面向对象思想和C++语言实现上述要求

输入

第一行输入t,表示有t个实例
第二行输入一个加湿风扇的信息,依次包括编号、功率、风向、风力、实际水容量、最大水容量 档位
第三行输入一个参数,表示调档操作的档位,然后执行调档操作。
以此类推,输入t个实例

输出

对于每个实例,调用打印操作输出加湿风扇的最终状态

输入样例

3
1001 1000 1 2 3 4 0
1
2002 2000 0 1 1 12 0
3
3003 3000 0 3 2 10 0
0

输出样例

加湿风扇–档位1
编号1001–功率1000W
定向吹风–风力1级
实际水容量3升–水量正常
加湿风扇–档位3
编号2002–功率2000W
旋转吹风–风力3级
实际水容量1升–水量不足
加湿风扇–档位0
编号3003–功率3000W
定向吹风–风力3级
实际水容量2升–水量偏低

题解

  • 本题运用到的知识点有菱形继承,虚继承,虚函数
  • 虚继承适用于菱形继承的情况

代码实现

#include <iostream>
using namespace std;

class CHome
{
private:
    int num, p;
public:
    CHome(int n, int p1);
    virtual void print();
};

CHome::CHome(int n, int p1)
    : num(n), p(p1)
{
}

void CHome::print()
{
    cout << "编号" << num << "--功率" << p << "W" << endl;
}

class CFan : virtual public CHome
{
protected:
    int dir, fo;
public:
    CFan(int n, int p, int d, int f);
    void setD(int x); // 风向控制
    void setF(int x); // 风力控制
};

CFan::CFan(int n, int p, int d, int f)
    : CHome(n, p), dir(d), fo(f)
{
}

void CFan::setD(int x)
{
    dir = x; // 参数为0表示定向吹风,为1表示旋转吹风
}

void CFan::setF(int x)
{
    fo = x;
}

class CAdd : virtual public CHome
{
protected:
    double v, maxv;
public:
    CAdd(int n, int p, double v1, double m);
    int warn();
};

CAdd::CAdd(int n, int p, double v1, double m)
    : CHome(n, p), v(v1), maxv(m)
{
}

int CAdd::warn()
{
    if (v >= maxv * 0.5) // 实际水容量不小于最大水容量的50%
    {
        return 1;
    }
    else if (v < maxv * 0.5 && v >= maxv * 0.1)
    {
        return 2;
    }
    else if (v < maxv * 0.1)
    {
        return 3;
    }
}

class Caddfan : public CFan, public CAdd
{
private:
    int dnum;
public:
    Caddfan(int n, int p, int dir, int f, double v, double m, int d);
    void adjust(int n);
    void print();
};

Caddfan::Caddfan(int n, int p, int dir, int f, double v, double m, int d)
    : CHome(n, p), CFan(n, p, dir, f), CAdd(n, p, v, m), dnum(d)
{
}

void Caddfan::adjust(int n)
{
    dnum = n;
    if (dnum == 1) // 设置定向吹风且风力1级
    {
        setD(0);
        setF(1);
    }
    else if (dnum == 2) // 设置旋转吹风且风力2级
    {
        setD(1);
        setF(2);
    }
    else if (dnum == 3) // 设置旋转吹风且风力3级
    {
        setD(1);
        setF(3);
    }
}

void Caddfan::print()
{
    cout << "加湿风扇--档位" << dnum << endl;
    CHome::print();

    if (dir == 0)
    {
        cout << "定向吹风--风力";
    }
    else if (dir == 1)
    {
        cout << "旋转吹风--风力";
    }
    cout << fo << "级" << endl;
    cout << "实际水容量" << v << "升--";

    if (warn() == 1)
    {
        cout << "水量正常" << endl;
    }
    else if (warn() == 2)
    {
        cout << "水量偏低" << endl;
    }
    else
    {
        cout << "水量不足" << endl;
    }
}

int main()
{
    int t, i, num, p, dir, fo, d, dd;
    double  v, maxv;
    CHome* hm;
    cin >> t;

    for (i = 0; i < t; i++)
    {
        cin >> num >> p >> dir >> fo >> v >> maxv >> d >> dd;
        Caddfan af1(num, p, dir, fo, v, maxv, d);
        af1.adjust(dd);
        hm = &af1;
        hm->print();
    }

    return 0;
}

id:128 E. 五、计重转换(期末模拟)

题目描述

目前国际计重最基本的单位是克。在古代各个国家的计重单位是不同的。
中国使用斤、两、钱来表示重量,其中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(const 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;
}

输入

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

输出

根据主函数运行输出

输入样例

1234
2345

输出样例

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

题解

  • 主要用到的知识点是继承,虚函数,输出运算符重载
  • 注意一下计算即可

代码实现

#include <iostream>
#include <cstring>
using namespace std;

class CN; // 提前声明
class EN; // 提前声明

// 抽象类
class Weight
{
protected:
	char kind[20]; // 计重类型
	int gram; // 克
public:
	Weight(const char tk[] = "no name", int tg = 0);
	virtual void print(ostream& out) = 0; // 输出不同类型的计重信息
};

Weight::Weight(const char tk[], int tg)
{
	strcpy(kind, tk);
	gram = tg;
}

class EN : public Weight
{
private:
	int pound, ounce, dram;
public:
	EN(int p, int o, int d, int g, const  char* k);
	void Convert(int g);
	void print(ostream& out);
	friend ostream& operator<<(ostream&, const Weight&);
	friend class CN;
};

EN::EN(int p, int o, int d, int g, const  char* k)
	: Weight(k, g), pound(p), ounce(o), dram(d)
{
}

void EN::Convert(int g)
{
	pound = g / 512;
	g -= pound * 512;
	ounce = g / 32;
	g -= ounce * 32;
	dram = g / 2;
	g -= dram * 2;
	gram = g;
}

void EN::print(ostream& out)
{
	out << kind  << ":" << pound << "磅" << ounce << "盎司" << dram << "打兰" << gram << "克" << endl;
}

class CN : public Weight
{
private:
	int jin, liang, money;
public:
	CN(int j, int l, int m, int g, const  char* k);
	void Convert(int g);
	void print(ostream& out);
	CN& operator=(const EN& e1);
	friend ostream& operator<<(ostream&, const Weight&);
};

CN::CN(int j, int l, int m, int g, const  char* k)
	: Weight(k, g), jin(j), liang(l), money(m)
{
}

void CN::Convert(int g)
{
	jin = g / 500;
	g -= jin * 500;
	liang = g / 50;
	g -= liang * 50;
	money = g / 5;
	g -= money * 5;
	gram = g;
}

void CN::print(ostream& out)
{
	out << kind << ":" << jin << "斤" << liang << "两" << money << "钱" << gram << "克" << endl;
}

CN& CN::operator=(const EN& e1)
{
	gram = e1.pound * 512 + e1.ounce * 32 + e1.dram * 2 + e1.gram;
	jin = gram / 500;
	gram -= jin * 500;
	liang = gram / 50;
	gram -= liang * 50;
	money = gram / 5;
	gram -= money * 5;
	return *this;
}

// 以全局函数方式重载输出运算符,代码3-5行....自行编写
// 重载函数包含两个参数:ostream流对象、Weight类对象,参数可以是对象或对象引用
// 重载函数必须调用参数Weight对象的print方法

ostream& operator<<(ostream& o, Weight& w)
{
	w.print(o);
	return o;
}

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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/774928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TC3xx NvM小细节解读

目录 1.FlsLoader Driver和FlsDmu Driver 2. FlsLoader小细节 3.小结 大家好&#xff0c;我是快乐的肌肉&#xff0c;今天聊聊TC3xx NvM相关硬件细节以及MCAL针对NvM的驱动。 1.FlsLoader Driver和FlsDmu Driver 在最开始做标定的时候&#xff0c;认为标定数据既然是数据&…

力扣双指针算法题目:复写零

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.解题思路 本题要求就是对于一个数组顺序表&#xff0c;将表中的所有“0”元素都向后再写一遍&#xff0c;且我们还要保证此元素之后的元素不受到影响&#xff0c;且复写零之后此数组顺序表的总长度不可以改变&#xff0c;…

C#(asp.net)房屋租赁管理系统-计算机毕业设计源码64421

目 录 摘要 1 绪论 1.1 研究背景与意义 1.2开发现状 1.3论文结构与章节安排 2 房屋租赁管理系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 …

如何利用好用便签提高工作效率?

在忙碌的工作中&#xff0c;我们经常需要记住许多琐碎的任务。如果这些任务被遗忘&#xff0c;可能会对我们的工作产生影响。这时&#xff0c;便签就成为了我们的得力助手。通过合理的使用和管理&#xff0c;便签不仅能帮助我们记住重要的事项&#xff0c;还能提高我们的工作效…

中科蓝讯AB5607E蓝牙5.4 低成本带插卡带U盘音箱方案

方案概述 中科蓝讯AB5607E蓝牙5.4 低成本带插卡带U盘音箱方案&#xff0c;我们已有成熟的方案&#xff0c;用户可以免开发&#xff08;零代码&#xff09;快速完成带插卡带U盘蓝牙音箱&#xff0c;提供原理图&#xff0c;PCB Layout指导。 方案优势 低成本&#xff0c;IC成本低…

【Linux进程】进程优先级 Linux 2.6内核进程的调度

前言 进程是资源分配的基本单位, 在OS中存在这很多的进程, 那么就必然存在着资源竞争的问题, 操作系统是如何进行资源分配的? 对于多个进程同时运行, 操作系统又是如何调度达到并发呢? 本文将以Linux kernel 2.6为例 , 向大家介绍进程在操作系统中 (OS) 的调度原理; 1. 进程优…

【开发工具-前端必备神器】WebStrom2024版-安装和使用(小白学习)

一、官方下载地址 Other Versions - WebStorm 选择适合自己电脑的下载 二、安装步骤 1、双击下载的exe安装 2、选择安装目录【建议不要安装在C盘下】 3、安装选项&#xff0c;可以全选 4一直点击下一步就行了 5.双击运行 安装遇到问题&#xff1a; 我是下错版本了&#xff0…

Motion Guidance: 扩散模型实现图像精确编辑的创新方法

在深度学习领域&#xff0c;扩散模型&#xff08;diffusion models&#xff09;因其能够根据文本描述生成高质量图像而备受关注。然而&#xff0c;这些模型在精确编辑图像中对象的布局、位置、姿态和形状方面仍存在挑战。本文提出了一种名为“运动引导”&#xff08;motion gui…

【LLM】一、利用ollama本地部署大模型

目录 前言 一、Ollama 简介 1、什么是Ollama 2、特点&#xff1a; 二、Windows部署 1.下载 2.安装 3.测试安装 4.模型部署&#xff1a; 5.注意 三、 Docker部署 1.docker安装 2.ollama镜像拉取 3.ollama运行容器 4.模型部署&#xff1a; 5.注意&#xff1a; 总结 前言…

【C++】哈希表 ---开散列版本的实现

你很自由 充满了无限可能 这是很棒的事 我衷心祈祷你可以相信自己 无悔地燃烧自己的人生 -- 东野圭吾 《解忧杂货店》 开散列版本的实现 1 前言2 开散列版本的实现2.1 节点设计2.2 框架搭建2.3 插入函数2.4 删除函数2.5 查找操作2.6 测试 Thanks♪(&#xff65;ω&#x…

OpenCV 灰度直方图及熵的计算

目录 一、概述 1.1灰度直方图 1.1.1灰度直方图的原理 1.1.2灰度直方图的应用 1.1.3直方图的评判标准 1.2熵 二、代码实现 三、实现效果 3.1直方图显示 3.2 熵的计算 一、概述 OpenCV中的灰度直方图是一个关键的工具&#xff0c;用于分析和理解图像的灰度分布情况。直…

Excel多表格合并

我这里一共有25张表格: 所有表的表头和格式都一样,但是内容不一样: 现在我要做的是把所有表格的内容合并到一起,研究了一下发现WPS的这项功能要开会员的,本来想用代码撸出来的,但是后来想想还是找其他办法,后来找到"易用宝"这个插件,这个插件可以从如下地址下载:ht…

图像处理中的二维傅里叶变换

图像处理中的二维傅里叶变换 问题来源是对彩色图像进行压缩时得出的傅里叶系数的图像如何解释&#xff0c;导入图片&#xff0c;转化为灰度图片&#xff1a; #彩色图片一般是由RGB组成&#xff0c;其实就是3个二维数组叠加而成&#xff0c;当RGB时&#xff0c;彩色图片就会变成…

【线性代数的本质】矩阵与线性变换

线性变化要满足两点性质&#xff1a; 直线&#xff08;连续的点&#xff09;在变换后还是直线。原点不变。 假设有坐标轴&#xff08;基底&#xff09; i ^ \widehat{i} i 和 j ^ \widehat{j} j ​&#xff1a; i ^ [ 1 0 ] , j ^ [ 0 1 ] \widehat{i}\begin{bmatrix} 1 \…

【leetcode】双指针算法题

文章目录 1.算法思想2.移动零3.复写零方法一方法二 4.快乐数5.盛水最多的容器方法一&#xff08;暴力求解&#xff09;方法二&#xff08;左右指针&#xff09; 6.有效三角形的个数方法一&#xff08;暴力求解&#xff09;方法二&#xff08;左右指针&#xff09; 7.两数之和8.…

ONLYOFFICE 8.1版本震撼来袭,让办公更高效、更智能

官网链接&#xff1a; 在线PDF查看器和转换器 | ONLYOFFICE 在线办公套件 | ONLYOFFICE 随着科技的不断发展&#xff0c;办公软件已经成为现代企业提高工作效率、实现信息共享的重要工具。在我国&#xff0c;一款名为ONLYOFFICE的在线办公套件受到了越来越多企业的青睐。今天…

Prompt-Free Diffusion: Taking “Text” out of Text-to-Image Diffusion Models

CVPR2024 SHI Labshttps://arxiv.org/pdf/2305.16223https://github.com/SHI-Labs/Prompt-Free-Diffusion 问题引入 在SD模型的基础之上&#xff0c;去掉text prompt&#xff0c;使用reference image作为生成图片语义的指导&#xff0c;optional structure image作为生成图片…

深入理解【 String类】

目录 1、String类的重要性 2、常用方法 2、1 字符串构造 2、2 String对象的比较 2、3 字符串查找 2、4字符转换 数值和字符串转换&#xff1a; 大小写转化&#xff1a; 字符串转数组&#xff1a; 格式转化&#xff1a; 2、5 字符串替换 2、6字符串拆分 2、7 字符串…

知名品牌因商标痛失市场:114家直营店山寨店7000多家!

奶茶知名品牌“鹿角巷”当年红遍大江南北&#xff0c;是最早的新茶饮品牌&#xff0c;但是当年商标注册存在问题&#xff0c;被同行奶茶品牌抢占了先机&#xff0c;发声明“对大陆商标注册细则不详&#xff0c;在商标注册过程中让假店钻了法律空档”&#xff0c;最夸张的时候全…

python如何不保留小数

1、int() 向下取整&#xff08;内置函数&#xff09; n 3.75 print(int(n)) >>> 3 n 3.25 print(int(n)) >>> 3 2、round() 四舍五入&#xff08;内置函数&#xff09; n 3.75 print(round(n)) >>> 4 n 3.25 print(round(n)) >>> 3 …