有符号数
题目描述
有符号数可以视为无符号数和符号位的组合。请据此给出 SignedVal
类的定义,使得程序符合下文规定的输入输出行为。
关于输入
共一行,为两个个整数 x、y。
x 在 ±105 范围内,y 是小于 105 的非负数。
关于输出
共两行。
第一行为 x、|x|,用空格分隔;
第二行为 y、sgn(x) * y,用空格分隔。sgn 是符号函数,若 x 负数取值为 -1,否则取 1。
思路解析
一个“有符号数”由它的“数值部分”和“符号部分”构成,因此可推出 SignedVal
应当包含两部分,其中数值部分是 UnsignedVal
对象,而符号部分可以是一个布尔标志变量,或者一个 1
-1
的整数。
同时,abs
方法返回到 UnsignedVal
对象的引用,从而对 u
修改就相当于对 s
的“数值部分”修改,从而最后一个输出的结果是 x
的“符号部分”加上 y
的数值部分。
如果使用继承,建议使用私有继承:因为这里的继承并不指代 is-a “是”的关系;UnsignedVal
是作为 SignedVal
的一个部分而存在的。
参考答案
#include <iostream>
class UnsignedVal {
unsigned int val;
public:
UnsignedVal(unsigned int val) : val(val) {}
unsigned int getVal() const {
return val;
}
void setVal(unsigned int val) {
this->val = val;
}
};
class SignedVal {
bool sign;
UnsignedVal num;
public:
SignedVal(int val) : num(val < 0 ? -val : val), sign(val < 0) {}
int getVal() const {
return sign ? -num.getVal() : num.getVal();
}
UnsignedVal& abs() {
return num;
}
const UnsignedVal& abs() const {
return num;
}
};
int main() {
int x;
unsigned int y;
std::cin >> x >> y;
SignedVal s(x);
std::cout << s.getVal() << ' ' << s.abs().getVal() << std::endl;
UnsignedVal& u = s.abs();
u.setVal(y);
std::cout << u.getVal() << ' ' << s.getVal() << std::endl;
}
#include <iostream>
class UnsignedVal {
unsigned int val;
public:
UnsignedVal(unsigned int val) : val(val) {}
unsigned int getVal() const {
return val;
}
void setVal(unsigned int val) {
this->val = val;
}
};
class SignedVal : private UnsignedVal {
bool sign;
public:
SignedVal(int val) : UnsignedVal(val < 0 ? -val : val), sign(val < 0) {}
int getVal() const {
return sign ? -UnsignedVal::getVal() : UnsignedVal::getVal();
}
UnsignedVal& abs() {
return *this;
}
};
int main() {
int x;
unsigned int y;
std::cin >> x >> y;
SignedVal s(x);
std::cout << s.getVal() << ' ' << s.abs().getVal() << std::endl;
UnsignedVal& u = s.abs();
u.setVal(y);
std::cout << u.getVal() << ' ' << s.getVal() << std::endl;
}