Facebook
From Small Baboon, 6 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 234
  1. #include <iostream>
  2. #include <string>
  3.  
  4. //TODO:
  5. //include
  6. //funkcjonalnosc
  7. //zarzadzanie pamiecia
  8.  
  9. void mvec(int &length, int &amount, int &arrays_size, double &standard_value, int *offsets, int *values);
  10. void def(int index, int value, int length, int &amount, int &arrays_size, int **offsets, int **values);
  11. void len(int new_length, int &length, int &amount, int &arrays_size, int **offsets, int **values);
  12. void print(int length, int amount, double standard_value, int *offsets, int *values);
  13. void del(double &standard_value, int &length, int &amount, int &arrays_size, int *offsets, int *values);
  14.  
  15. int find(int value, int size, int *arr);
  16. int read_value(int index, int end, double standard_value, int *offsets, int *values);
  17. int *change_size(int *source, int new_size, int amount);
  18. std::string to_string(int length, double standard_value, int amount, int *offsets, int *values);
  19.  
  20. int main() {
  21.     int length = 0;                  //dlugosc wektora
  22.     int amount = 0;                  //ilosc elementow roznych od podst. wartosci wektora
  23.     int arrays_size = 0;             //wielkosc tablic przechowujacych wartosci wektora
  24.     double standard_value = 0/0.0;   //podstawowa wartosc vectora
  25.     int *offsets = nullptr;          //indexy poszczegolnych wartosci
  26.     int *values = nullptr;           //poszczegolne wartosci
  27.    
  28.    
  29.    
  30.     std::string command;           //obsluga menu
  31.     while (true) {
  32.         std::cin >> command;
  33.        
  34.         if (command == "mvec") {
  35.             mvec(length, amount, arrays_size, standard_value, offsets, values);
  36.            
  37.         } else if (command == "def") {
  38.             int index;
  39.             int value;
  40.             int **ptr_offsets = &offsets;
  41.             int **ptr_values = &values;
  42.             std::cin >> index;
  43.             std::cin >> value;
  44.            
  45.             def(index, value, length, amount, arrays_size, ptr_offsets, ptr_values);
  46.            
  47.         } else if (command == "len") {
  48.             int new_length;
  49.             int **ptr_offsets = &offsets;
  50.             int **ptr_values = &values;
  51.             std::cin >> new_length;
  52.            
  53.             len(new_length, length, amount, arrays_size, ptr_offsets, ptr_values);
  54.            
  55.         } else if (command == "print") {
  56.             print(length, amount, standard_value, offsets, values);
  57.            
  58.         } else if (command == "del") {
  59.             del(standard_value, length, amount, arrays_size, offsets, values);
  60.            
  61.         } else {
  62.             std::cout << "Errorn";
  63.         }
  64.     }
  65. }
  66.  
  67.  
  68.  
  69. void mvec(int &length, int &amount, int &arrays_size, double &standard_value, int *offsets, int *values) {
  70.     std::cin >> length;
  71.     std::cin >> standard_value;
  72.     amount = 0;
  73.     arrays_size = 0;
  74.    
  75.     delete[] offsets;
  76.     delete[] values;
  77.    
  78.     offsets = nullptr;
  79.     values = nullptr;
  80. }
  81.  
  82. void def(int index, int value, int length, int &amount, int &arrays_size, int **offsets, int **values) {
  83.     if (index >= 0 && index < length) {
  84.         if (offsets != nullptr && values != nullptr) {
  85.             if (arrays_size == amount) {
  86.                 *offsets = change_size(*offsets, arrays_size * 2, amount);
  87.                 *values = change_size(*values, arrays_size * 2, amount);
  88.                 arrays_size *= 2;
  89.             }
  90.            
  91.             if (find(index, amount, *offsets) != -1) {
  92.                 (*values)[find(index, amount, *offsets)] = value;
  93.             } else {
  94.                 (*offsets)[amount] = index;
  95.                 (*values)[amount] = value;
  96.                 amount++;
  97.             }
  98.            
  99.         } else {
  100.             *offsets = new int[1];
  101.             *values = new int[1];
  102.            
  103.             (*offsets)[0] = index;
  104.             (*values)[0] = value;
  105.             amount = 1;
  106.             arrays_size = 1;
  107.         }
  108.     } else {
  109.         std::cout << "Errorn";
  110.     }
  111. }
  112.  
  113. void len(int new_length, int &length, int &amount, int &arrays_size, int **offsets, int **values) {
  114.     if (new_length < length && (offsets != nullptr || offsets != nullptr)) {
  115.         int new_amount = 0;
  116.         while ((*offsets)[new_amount] < new_length) {
  117.             new_amount++;
  118.         }
  119.        
  120.         *offsets = change_size(*offsets, new_amount, new_amount);
  121.         *values = change_size(*values, new_amount, new_amount);
  122.        
  123.         arrays_size = new_amount;
  124.         amount = new_amount;
  125.     }
  126.     length = new_length;
  127. }
  128.  
  129.  
  130. void print(int length, int amount, double standard_value, int *offsets, int *values) {
  131.     std::cout << to_string(length, standard_value, amount, offsets, values) << 'n';
  132. }
  133.  
  134. void del(double &standard_value, int &length, int &amount, int &arrays_size, int *offsets, int *values) {
  135.     standard_value = 0/0.0;
  136.     length = 0;
  137.     amount = 0;
  138.     arrays_size = 0;
  139.    
  140.     delete[] offsets;
  141.     delete[] values;
  142.    
  143.     offsets = nullptr;
  144.     values = nullptr;
  145. }
  146.  
  147. /*******************************************
  148.  * ZWRACA POZYCJE SZUKANEGO ELEMNTU LUB -1 *
  149.  *******************************************/
  150. int find(int value, int size, int *arr) {
  151.     int i = 0;
  152.     while (i < size && arr[i] != value) {
  153.         i++;
  154.     }
  155.    
  156.     return i < size ? i : -1;
  157. }
  158.  
  159.  
  160. /***************************************
  161.  * ODCZYTUJE WARTOSC Z DANEGO ELEMENTU *
  162.  ***************************************/
  163. int read_value(int index, int end, double standard_value, int *offsets, int *values) {
  164.     int i = 0;
  165.     while (i < end && offsets[i] != index) {
  166.         i++;
  167.     }
  168.    
  169.     return i < end ? values[i] : standard_value;
  170. }
  171.  
  172. /***************************************************************
  173.  * TWORZY NOWA TABLICE I KOPIUJE DO NIEJ ZAWARTOSC POPRZEDNIEJ *
  174.  ***************************************************************/
  175. int *change_size(int *source, int new_size, int old_size) {
  176.     int *arr = new int[new_size];
  177.    
  178.     for (int i = 0; (i < old_size) && (i < new_size); i++) {
  179.         arr[i] = source[i];
  180.     }
  181.    
  182.     delete[] source;
  183.     return arr;
  184. }
  185.  
  186. /***************************************
  187.  * ZWRACA STRING REPREZENTUJACY WEKTOR *
  188.  ***************************************/
  189. std::string to_string(int length, double standard_value, int amount, int *offsets, int *values) {
  190.     std::string result = "len: " + std::to_string(length) + " values: ";
  191.    
  192.     if (offsets == nullptr || values == nullptr) {
  193.         for (int i = 0; i < length; i++) {
  194.             result += std::to_string(standard_value) + ',';
  195.         }
  196.     } else {
  197.         for (int i = 0; i < length; i++) {
  198.             result += std::to_string(read_value(i, amount, standard_value, offsets, values)) + ',';
  199.         }
  200.     }
  201.    
  202.     result.pop_back();
  203.     return result;
  204. }
  205.