Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.59 KB | None | 0 0
  1. #include <assert.h>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cmath>
  5. #include <vector>
  6. #include <string>
  7.  
  8. class Range {
  9. private:
  10.     int* data_;
  11.     int size_;
  12.  
  13. public:
  14.     class Iterator {
  15.     private:
  16.         int* data_begin_;
  17.         size_t size_;
  18.  
  19.     public:
  20.         Iterator(int* data_begin, size_t size)
  21.         : data_begin_(data_begin), size_(size)
  22.         {}
  23.  
  24.         // copy constructor
  25.         Iterator(const Iterator& other) {
  26.             size_ = other.size_;
  27.             data_begin_ = new int[size_];
  28.         }
  29.  
  30.         // assignment operator
  31.         Iterator& operator =(const Iterator& other) {
  32.             assert(size_ > 0);
  33.  
  34.             if (this == &other) {
  35.                 return *this;
  36.             }
  37.  
  38.             size_ = other.size_;
  39.             data_begin_ = new int[size_];
  40.             return *this;
  41.         }
  42.  
  43.         bool operator ==(const Iterator& other) {
  44.             return data_begin_ == other.data_begin_ && size_ == other.size_;
  45.         }
  46.  
  47.         bool operator !=(const Iterator& other) {
  48.             return !(*this == other);
  49.         }
  50.  
  51.         Iterator& operator ++() {
  52.             assert(size_ > 0);
  53.  
  54.             data_begin_++;
  55.             size_ -= 1;
  56.  
  57.             return *this;
  58.         }
  59.  
  60.         int& operator *() {
  61.             return *data_begin_;
  62.         }
  63.     };
  64.  
  65.     Iterator begin() {
  66.         return Iterator(data_, size_);
  67.     }
  68.     Iterator end() {
  69.         return Iterator(data_ + size_, 0);
  70.     }
  71.  
  72.     // constructors
  73.     Range() {}
  74.  
  75.     explicit Range(const int& s_end) {
  76.         assert(s_end > 0);
  77.  
  78.         int index = 0;
  79.         size_ = s_end;
  80.         // std::cout << size_ << "size_" << std::endl;
  81.         data_ = new int[size_];
  82.  
  83.         for (int it = 0; it < size_; ++it) {
  84.             data_[it] = index;
  85.             // std::cout << data_[it];
  86.             index++;
  87.         }
  88.     }
  89.  
  90.     Range(const int& s_begin, const int& s_end) {
  91.         assert(s_end - s_begin > 0);
  92.  
  93.         int index = s_begin;
  94.         size_ = s_end - s_begin;
  95.         data_ = new int[size_];
  96.  
  97.         for (int it = 0; it < size_; ++it) {
  98.             data_[it] = index;
  99.             // std::cout << data_[it];
  100.             index++;
  101.         }
  102.     }
  103.  
  104.     Range(const int& s_begin, const int& s_end, const int gap) {
  105.         assert((s_end - s_begin > 0 && gap > 0)
  106.                || (s_end - s_begin < 0 && gap < 0));
  107.  
  108.         int index = s_begin;
  109.         size_ = std::abs((std::abs(s_end - s_begin) - 1) / gap) + 1;
  110.         data_ = new int[size_];
  111.         for (int it = 0; it < size_; ++it) {
  112.             data_[it] = index;
  113.             index += gap;
  114.         }
  115.     }
  116.  
  117.     // destructor
  118.     ~Range() {
  119.         delete [] data_;
  120.         data_ = nullptr;
  121.     }
  122.  
  123.     // copy constructor
  124.     Range(const Range& other) {
  125.         size_ = other.size_;
  126.         data_ = new int[size_];
  127.     }
  128.  
  129.     // assignment operator
  130.     Range& operator = (const Range& other) {
  131.         if (this == &other) {
  132.             return *this;
  133.         }
  134.  
  135.         delete [] data_;
  136.         data_ = nullptr;
  137.  
  138.         size_ = other.size_;
  139.         data_ = new int[size_];
  140.  
  141.         for (int i = 0; i < size_; ++i) {
  142.             data_[i] = other.data_[i];
  143.         }
  144.         return *this;
  145.     }
  146.  
  147.     Range readFromInput() {
  148.         std::vector<int> num_of_args;
  149.         std::string str;
  150.         std::ifstream fin("input.txt");
  151.         int count = 0;
  152.         fin >> str;
  153.         Range range_rez;
  154.         while (!fin.eof()) {
  155.             num_of_args.push_back(std::stoi(str));
  156.             // std::cout << num_of_args[count] << std::endl;
  157.             count++;
  158.             fin >> str;
  159.         }
  160.         fin.close();
  161.         // std::cout << count;
  162.         if (count == 1) {
  163.             Range range(num_of_args[0]);
  164.             range_rez = range;
  165.             return range;
  166.         } else if (count == 2) {
  167.             Range range(num_of_args[0], num_of_args[1]);
  168.             range_rez = range;
  169.             return range;
  170.         } else {
  171.             Range range(num_of_args[0], num_of_args[1], num_of_args[2]);
  172.             range_rez = range;
  173.             return range;
  174.         }
  175.         for (int it = 0; it < range_rez.size_; ++it) {
  176.             std::cout << range_rez.data_[it] << std::endl;
  177.         }
  178.         return *this;
  179.     }
  180.  
  181.     void out() {
  182.         for (Iterator it = begin(); it != end(); it.operator++()) {
  183.             std::cout << *it << std::endl;
  184.         }
  185.     }
  186.    
  187.     size_t size() const {
  188.         return size_;
  189.     }
  190. };
  191.  
  192. int main() {
  193.     Range result;
  194.     result.readFromInput();
  195.     result.out();
  196.     return 0;
  197. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement