Advertisement
TwITe

Untitled

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