Advertisement
TwITe

Untitled

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