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