有符号数

题目描述

有符号数可以视为无符号数和符号位的组合。请据此给出 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;
}