Advertisement
TwITe

Untitled

Jul 16th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.92 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. //Указатель, который используется для хранения адреса памяти под массив.
  8. int* buffer;
  9.  
  10. //Текущее колличество элементво в массиве.
  11. unsigned array_size;
  12.  
  13. //Максимальное количество элементов в массиве.
  14. unsigned capacity;
  15. int newSize = 0;
  16.  
  17. //Инициализация массива.
  18. //Выполняется один раз перед тем, как будет использоваться массив.
  19. void init_array() {
  20.     capacity = 0;
  21.     buffer = new int[capacity];
  22. }
  23.  
  24. //Освобождение ресурсов массива.
  25. //Выполняется один раз перед тем, как массив прекратит использоваться.
  26. void destroy_array() {
  27.     delete[] buffer;
  28.     buffer = nullptr;
  29.     capacity = 0;
  30.     array_size = 0;
  31.     newSize = 0;
  32. }
  33.  
  34.  
  35. void mem() {
  36.     int* newBuffer = new int[capacity * 2 + 2];
  37.     memcpy(newBuffer, buffer, sizeof(buffer)*capacity);
  38.     delete[] buffer;
  39.     buffer = newBuffer;
  40.     newSize = capacity * 2 + 2;
  41. }
  42. //Добавление нового элемента в массив.
  43. void add_element(const int& element) {
  44.     if (capacity == newSize) {
  45.         mem();
  46.         }
  47.     buffer[capacity] = element;
  48.     capacity = capacity + 1;
  49. }
  50.  
  51. //Удаление элемента из массива.
  52. //Функция возвращает true, если элемент был удален корректно, иначе - false.
  53. bool delete_element(const int& element)
  54. {
  55.     bool found = false;
  56.     for (unsigned i = 0; i < capacity; i++)
  57.     {
  58.         if (buffer[i] == element) {
  59.             found = true;
  60.             int* newBuffer = new int[capacity - 1];
  61.             memcpy(newBuffer, buffer, sizeof(int)*i);
  62.             memcpy(newBuffer + i, buffer + (i + 1), sizeof(int)*(capacity - (i + 1)));
  63.             delete[] buffer;
  64.             buffer = newBuffer;
  65.             capacity = capacity - 1;
  66.         }
  67.     }
  68.     return found;
  69. }
  70.  
  71. //Удаление элемента по индексу из массива.
  72. //Функция возвращает true, если элемент был удален корректно, иначе - false.
  73. bool delete_element_by_index(const unsigned& index)
  74. {
  75.     bool found = false;
  76.     for (unsigned i = 0; i < capacity; i++)
  77.     {
  78.         if (i == index) {
  79.             found = true;
  80.             int* newBuffer = new int[capacity - 1];
  81.             memcpy(newBuffer, buffer, sizeof(int)*i);
  82.             memcpy(newBuffer + i, buffer + (i + 1), sizeof(int)*(capacity - (i + 1)));
  83.             delete[] buffer;
  84.             buffer = newBuffer;
  85.             capacity = capacity - 1;
  86.         }
  87.     }
  88.     return found;
  89. }
  90.  
  91. //Поиск элемента в массиве.
  92. //Функция возвращает true, если элемент был найден в массиве, иначе - false.
  93. bool find_element(const int& element) {
  94.  
  95.     for (unsigned i = 0; i < capacity; i++) {
  96.         if (buffer[i] == element) {
  97.             return true;
  98.         }
  99.     }
  100.     return false;
  101. }
  102.  
  103. //Получить значение элемента по его индексу.
  104. //Если индекс некорректный (меньше 0, или слишком большой) - нужно кинуть исключение
  105. // (я показываю в примере ниже, как это делать).
  106. const int& get_element(const unsigned& index) {
  107.     if (index >= capacity) {
  108.         throw std::runtime_error("index is invalid");
  109.     }
  110.     else {
  111.         return buffer[index];
  112.     }
  113. }
  114.  
  115. //Получить текущее количество элементов в массиве.
  116. unsigned get_array_size() {
  117.     array_size = capacity;
  118.     return array_size;
  119. }
  120.  
  121. //Следующие тесты должны выполняться (программа должна успешно запускаться).
  122. //Менять тесты нельзя.
  123. //Менять мои заглушки на функции нельзя.
  124.  
  125. void check_preconditions() {
  126.     assert(array_size == 0);
  127.     assert(capacity == 0);
  128.     assert(buffer == nullptr);
  129. }
  130.  
  131. void can_init_and_destroy_new_array_test() {
  132.     init_array();
  133.     destroy_array();
  134.     check_preconditions();
  135. }
  136.  
  137. void can_add_elements_to_array_test() {
  138.     init_array();
  139.  
  140.     for (int i = 0; i < 2000; ++i) {
  141.         add_element(i);
  142.     }
  143.  
  144.     for (int i = 0; i < 2000; ++i) {
  145.         int current_element = get_element(i);
  146.         assert(current_element == i);
  147.     }
  148.  
  149.     destroy_array();
  150.     check_preconditions();
  151. }
  152.  
  153. void cannot_delete_not_existed_element_test() {
  154.     init_array();
  155.  
  156.     for (int i = 0; i < 2000; ++i) {
  157.         add_element(i);
  158.     }
  159.  
  160.     assert(delete_element(3000) == false);
  161.  
  162.     for (int i = 0; i < 2000; ++i) {
  163.         int current_element = get_element(i);
  164.         assert(current_element == i);
  165.     }
  166.  
  167.     destroy_array();
  168.     check_preconditions();
  169. }
  170.  
  171. void cannot_delete_not_existed_element_test2() {
  172.     init_array();
  173.  
  174.     for (int i = 0; i < 2000; ++i) {
  175.         add_element(i);
  176.     }
  177.  
  178.     assert(delete_element_by_index(3000) == false);
  179.  
  180.     for (int i = 0; i < 2000; ++i) {
  181.         int current_element = get_element(i);
  182.         assert(current_element == i);
  183.     }
  184.  
  185.     destroy_array();
  186.     check_preconditions();
  187. }
  188.  
  189. void can_delete_existed_element_test() {
  190.     init_array();
  191.  
  192.     for (int i = 0; i < 5; ++i) {
  193.         add_element(i + 2);
  194.     }
  195.  
  196.     int size_before_removing_element = get_array_size();
  197.  
  198.     assert(delete_element(3) == true);
  199.  
  200.     int size_after_removing_element = get_array_size();
  201.  
  202.     assert(size_after_removing_element + 1 == size_before_removing_element);
  203.     assert(size_after_removing_element == 4);
  204.  
  205.     assert(get_element(0) == 2);
  206.     assert(get_element(1) == 4);
  207.     assert(get_element(2) == 5);
  208.     assert(get_element(3) == 6);
  209.  
  210.     destroy_array();
  211.     check_preconditions();
  212. }
  213.  
  214. void can_delete_existed_element_test2() {
  215.     init_array();
  216.  
  217.     for (int i = 0; i < 5; ++i) {
  218.         add_element(i + 2);
  219.     }
  220.  
  221.     int size_before_removing_element = get_array_size();
  222.  
  223.     assert(delete_element_by_index(3) == true);
  224.  
  225.     int size_after_removing_element = get_array_size();
  226.  
  227.     assert(size_after_removing_element + 1 == size_before_removing_element);
  228.     assert(size_after_removing_element == 4);
  229.  
  230.     assert(get_element(0) == 2);
  231.     assert(get_element(1) == 3);
  232.     assert(get_element(2) == 4);
  233.     assert(get_element(3) == 6);
  234.  
  235.     assert(find_element(2) == true);
  236.     assert(find_element(3) == true);
  237.     assert(find_element(4) == true);
  238.     assert(find_element(5) == false);
  239.     assert(find_element(6) == true);
  240.  
  241.     destroy_array();
  242.     check_preconditions();
  243. }
  244.  
  245. void exception_occurred_when_getiing_element_with_invalid_index_test() {
  246.     init_array();
  247.  
  248.     for (int i = 0; i < 5; ++i) {
  249.         add_element(i + 2);
  250.     }
  251.  
  252.     assert(get_element(0) == 2);
  253.  
  254.     bool has_exception = false;
  255.  
  256.     try {
  257.         get_element(5);
  258.     }
  259.     catch (...)
  260.     {
  261.         has_exception = true;
  262.     }
  263.  
  264.     assert(has_exception == true);
  265.  
  266.     destroy_array();
  267.     check_preconditions();
  268. }
  269.  
  270. void exception_occurred_when_getiing_element_with_invalid_index_test2() {
  271.     init_array();
  272.  
  273.     for (int i = 0; i < 5; ++i) {
  274.         add_element(i + 2);
  275.     }
  276.  
  277.     assert(get_element(0) == 2);
  278.  
  279.     bool has_exception = false;
  280.  
  281.     try {
  282.         get_element(-1);
  283.     }
  284.     catch (...)
  285.     {
  286.         has_exception = true;
  287.     }
  288.  
  289.     assert(has_exception == true);
  290.  
  291.     destroy_array();
  292.     check_preconditions();
  293. }
  294.  
  295. void capacity_has_to_decrease_while_elements_were_deleted_test() {
  296.     init_array();
  297.  
  298.     for (int i = 0; i < 2000; ++i) {
  299.         add_element(i);
  300.     }
  301.  
  302.     for (int i = 0; i < 2000; ++i) {
  303.         delete_element_by_index(0);
  304.     }
  305.  
  306.     assert(get_array_size() == 0);
  307.     assert(capacity < 100);
  308.  
  309.     destroy_array();
  310.     check_preconditions();
  311. }
  312.  
  313. int main()
  314. {
  315.     can_init_and_destroy_new_array_test();
  316.     can_add_elements_to_array_test();
  317.     cannot_delete_not_existed_element_test();
  318.     cannot_delete_not_existed_element_test2();
  319.     can_delete_existed_element_test();
  320.     can_delete_existed_element_test2();
  321.     exception_occurred_when_getiing_element_with_invalid_index_test();
  322.     exception_occurred_when_getiing_element_with_invalid_index_test2();
  323.     capacity_has_to_decrease_while_elements_were_deleted_test();
  324.     can_init_and_destroy_new_array_test();
  325.  
  326.     system("PAUSE");
  327.     return 0;
  328. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement