// "New" means new compared to previous level
#include <iostream>
using namespace std;
class InchSize {
public:
InchSize(int wholeInches = 0, int sixteenths = 0);
void Print() const;
InchSize operator+(InchSize rhs);
InchSize operator-(InchSize rhs);
private:
int inches;
int sixteenths;
};
InchSize InchSize::operator+(InchSize rhs) {
InchSize totalSize;
totalSize.inches = inches + rhs.inches;
totalSize.sixteenths = sixteenths + rhs.sixteenths;
// If sixteenths is greater than an inch, carry 1 to inches.
if (totalSize.sixteenths >= 16) {
totalSize.inches += 1;
totalSize.sixteenths -= 16;
}
return totalSize;
}
// New: Overloaded - operator.
InchSize InchSize::operator-(InchSize rhs) {
InchSize totalSize;
totalSize.inches = inches - rhs.inches;
totalSize.sixteenths = sixteenths - rhs.sixteenths;
// If sixteenths is negative, and we have at least 1 inch, carry 1 from inches.
if (totalSize.sixteenths < 0 && totalSize.inches > 0) {
totalSize.inches -= 1;
totalSize.sixteenths += 16;
}
return totalSize;
}
InchSize::InchSize(int wholeInches, int sixteenthsOfInch) {
inches = wholeInches;
sixteenths = sixteenthsOfInch;
}
void InchSize::Print() const {
cout << inches << " " << sixteenths << "/16 inches" << endl;
}
int main() {
InchSize size1(1, 12);
InchSize size2(4, 11);
InchSize spaceAvailable(8, 6);
InchSize sumSize;
InchSize remainingSpace;
sumSize = size1 + size2;
remainingSpace = spaceAvailable - sumSize;
remainingSpace.Print();
return 0;
}
Ly8gIk5ldyIgbWVhbnMgbmV3IGNvbXBhcmVkIHRvIHByZXZpb3VzIGxldmVsCiNpbmNsdWRlIDxpb3N0cmVhbT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEluY2hTaXplIHsKICAgcHVibGljOgogICAgICBJbmNoU2l6ZShpbnQgd2hvbGVJbmNoZXMgPSAwLCBpbnQgc2l4dGVlbnRocyA9IDApOwogICAgICB2b2lkIFByaW50KCkgY29uc3Q7CiAgICAgIEluY2hTaXplIG9wZXJhdG9yKyhJbmNoU2l6ZSByaHMpOwogICAgICBJbmNoU2l6ZSBvcGVyYXRvci0oSW5jaFNpemUgcmhzKTsKICAgcHJpdmF0ZToKICAgICAgaW50IGluY2hlczsKICAgICAgaW50IHNpeHRlZW50aHM7Cn07CgpJbmNoU2l6ZSBJbmNoU2l6ZTo6b3BlcmF0b3IrKEluY2hTaXplIHJocykgewogICBJbmNoU2l6ZSB0b3RhbFNpemU7CgogICB0b3RhbFNpemUuaW5jaGVzID0gaW5jaGVzICsgcmhzLmluY2hlczsKICAgdG90YWxTaXplLnNpeHRlZW50aHMgPSBzaXh0ZWVudGhzICsgcmhzLnNpeHRlZW50aHM7CgogICAvLyBJZiBzaXh0ZWVudGhzIGlzIGdyZWF0ZXIgdGhhbiBhbiBpbmNoLCBjYXJyeSAxIHRvIGluY2hlcy4KICAgaWYgKHRvdGFsU2l6ZS5zaXh0ZWVudGhzID49IDE2KSB7CiAgICAgIHRvdGFsU2l6ZS5pbmNoZXMgKz0gMTsKICAgICAgdG90YWxTaXplLnNpeHRlZW50aHMgLT0gMTY7CiAgIH0KCiAgIHJldHVybiB0b3RhbFNpemU7Cn0KCi8vIE5ldzogT3ZlcmxvYWRlZCAtIG9wZXJhdG9yLgpJbmNoU2l6ZSBJbmNoU2l6ZTo6b3BlcmF0b3ItKEluY2hTaXplIHJocykgewogICBJbmNoU2l6ZSB0b3RhbFNpemU7CgogICB0b3RhbFNpemUuaW5jaGVzID0gaW5jaGVzIC0gcmhzLmluY2hlczsKICAgdG90YWxTaXplLnNpeHRlZW50aHMgPSBzaXh0ZWVudGhzIC0gcmhzLnNpeHRlZW50aHM7CgogICAvLyBJZiBzaXh0ZWVudGhzIGlzIG5lZ2F0aXZlLCBhbmQgd2UgaGF2ZSBhdCBsZWFzdCAxIGluY2gsIGNhcnJ5IDEgZnJvbSBpbmNoZXMuCiAgIGlmICh0b3RhbFNpemUuc2l4dGVlbnRocyA8IDAgJiYgdG90YWxTaXplLmluY2hlcyA+IDApIHsKICAgICAgdG90YWxTaXplLmluY2hlcyAtPSAxOwogICAgICB0b3RhbFNpemUuc2l4dGVlbnRocyArPSAxNjsKICAgfQoKICAgcmV0dXJuIHRvdGFsU2l6ZTsKfQoKSW5jaFNpemU6OkluY2hTaXplKGludCB3aG9sZUluY2hlcywgaW50IHNpeHRlZW50aHNPZkluY2gpIHsKICAgaW5jaGVzID0gd2hvbGVJbmNoZXM7CiAgIHNpeHRlZW50aHMgPSBzaXh0ZWVudGhzT2ZJbmNoOwp9Cgp2b2lkIEluY2hTaXplOjpQcmludCgpIGNvbnN0IHsKICAgY291dCA8PCBpbmNoZXMgPDwgIiAiIDw8IHNpeHRlZW50aHMgPDwgIi8xNiBpbmNoZXMiIDw8IGVuZGw7Cn0KCmludCBtYWluKCkgewogICBJbmNoU2l6ZSBzaXplMSgxLCAxMik7CiAgIEluY2hTaXplIHNpemUyKDQsIDExKTsKICAgSW5jaFNpemUgc3BhY2VBdmFpbGFibGUoOCwgNik7CiAgIEluY2hTaXplIHN1bVNpemU7CiAgIEluY2hTaXplIHJlbWFpbmluZ1NwYWNlOwoKICAgc3VtU2l6ZSA9IHNpemUxICsgc2l6ZTI7CiAgIHJlbWFpbmluZ1NwYWNlID0gc3BhY2VBdmFpbGFibGUgLSBzdW1TaXplOwoKICAgcmVtYWluaW5nU3BhY2UuUHJpbnQoKTsKCiAgIHJldHVybiAwOwp9