Advertisement
TwITe

Untitled

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