Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cctype>
  5. #include "exceptions/NumberException.hpp"
  6.  
  7. using namespace std;
  8.  
  9. constexpr auto max(size_t A, size_t B) {
  10.     return A > B? A: B;
  11. }
  12.  
  13. class NumberBase
  14. {
  15.   private:
  16.     int B;
  17.     int N;
  18.  
  19.   public:
  20.     // Constructor
  21.     NumberBase(int base, int number)
  22.     {
  23.         if(base <= 1 && number <= 1)
  24.             throw InvalidBaseException();
  25.         B = base;
  26.         N = number;
  27.     }
  28.  
  29.     virtual ~NumberBase() = 0;
  30.  
  31.     virtual bool isNegative() const = 0;
  32.  
  33.     size_t getBase() const{
  34.         return B;
  35.     }
  36.  
  37.     void setBase(size_t base){
  38.         B = base;
  39.     }
  40.  
  41.     const size_t getN() const{
  42.         return N;
  43.     }
  44.  
  45.     void setN(size_t number) {
  46.         N = number;
  47.     }
  48.   protected:
  49.     //Método conversor de base
  50.     virtual void to_base(int myNumber) = 0;
  51.  
  52.     virtual ostream &write(ostream &os) const = 0;
  53.  
  54.     // virtual NumberBase* duplicate() const = 0;
  55. };
  56.  
  57.  
  58. template <size_t N2, size_t B2, class T>
  59. class Number : public NumberBase
  60. {
  61. private:
  62.     T* digits = nullptr;
  63.     static const char *mapchar;
  64.    
  65. public:
  66.     Number(int myNumber = 0){
  67.         NumberBase(B2, N2);
  68.         digits = new T[getN()];
  69.         for(int i = 0; i < getN(); i++){
  70.             digits[i] = 0;
  71.         }
  72.         to_base(myNumber);
  73.     }
  74.  
  75.     ~Number(){
  76.         if (digits);
  77.             delete[] digits;
  78.     }
  79.  
  80.     bool isNegative() const{
  81.         return false;
  82.     }
  83.  
  84.     const int digits4Base(int number)
  85.     {
  86.         if(number < 0){
  87.             number *= -1;
  88.         }
  89.         else if(number == 0){
  90.             return 1;
  91.         }
  92.         return floor((log(number) / log(getBase())) + 1);
  93.     }
  94.  
  95.     //Método conversor de base
  96.     void to_base(int myNumber)
  97.     {
  98.       int actualIndex = 0;
  99.         int remainder = 0;
  100.         if(myNumber < 0)
  101.             myNumber *= -1;
  102.         if(myNumber == 0){
  103.             digits[0] = mapchar[0];
  104.           actualIndex++;
  105.         }
  106.         else if (((unsigned int)digits4Base(myNumber) <= (unsigned int)getN()) && (ceil(log10(myNumber)) + 1 <= getN()))
  107.         {
  108.             while (myNumber != 0)
  109.             {
  110.                 remainder = myNumber % getBase();
  111.                 digits[actualIndex] = mapchar[remainder];
  112.               actualIndex++;
  113.                 myNumber /= getBase();
  114.             }
  115.         }
  116.         else{
  117.             throw OverflowDigitsException();
  118.         }
  119.     }
  120.  
  121.     ostream &write(ostream &os) const
  122.     {
  123.         if(digits != NULL){
  124.           for(int i = getN() - 1; i >= 0; i--){
  125.             os << (char)digits[i];
  126.           }
  127.         }
  128.         else
  129.             os << "Número máximo de dígitos excedido";
  130.         os << endl;
  131.         return os;
  132.     }
  133. };
  134.  
  135. template <size_t N, size_t B, class T>
  136. char const *Number<N, B, T>::mapchar = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  137.  
  138.  
  139. class DecimalNumber : public Number<8, 10, char>
  140. {
  141.  
  142.     public:
  143.         DecimalNumber(int myNumber = 0){
  144.             Number(myNumber);
  145.         }
  146. };
  147.  
  148. int main(int argc, char const *argv[])
  149. {
  150.     auto numberD = DecimalNumber(15);
  151.     return 0;
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement