1
0
forked from 131/lab5_ivec

добавил тесты, обновил ридмиху

This commit is contained in:
dzruyk
2023-04-14 17:18:19 +03:00
parent aa70890469
commit 32e562cb10
6 changed files with 107 additions and 37 deletions

View File

@@ -1,25 +1,24 @@
Базовые структуры данных. Вектор # Базовые структуры данных. Вектор
--------------------------------
* Склонировать репозиторий https://timp.pw/121/lab4_ivec.git * Склонировать репозиторий `https://timp.pw/121/lab4_ivec.git`
(если репозиторий уже склонирован -- пропустить этот шаг ^_^) (если репозиторий уже склонирован -- пропустить этот шаг ^_^)
В этом задании мы должны реализовать вектор для типа int. В этом задании мы должны реализовать вектор для типа int.
Вектор -- это динамический массив данных, который может менять свой размер Вектор -- это динамический массив данных, который может менять свой размер
в процессе работы. в процессе работы.
Описание структуры данных ivector в файле vector.h Описание структуры данных ivector в файле `vector.h`
Вам необходимо реализовать некоторые функции в файле ./vector.c Вам необходимо реализовать некоторые функции в файле `./vector.c`
и пройти тесты (описанные в ./vector_test.c). и пройти тесты (описанные в `./vector_test.c`).
Команда для сборки проекта -- make Команда для сборки проекта -- **make**
Команда для запуска тестов -- make test Команда для запуска тестов -- **make test**
* Необходимо реализовать следующие функции(короткое описание функций можно * Необходимо реализовать следующие функции(короткое описание функций можно
подсмотреть в vector.h): подсмотреть в `vector.h`):
```
vector_len vector_len
vector_data vector_data
vector_resize vector_resize
@@ -30,15 +29,17 @@
vector_push vector_push
vector_pop vector_pop
(Опционально, но очень желательно)
vector_insert vector_insert
vector_del vector_del
```
Для функций `vector_insert`, `vector_del` написать тесты в `vector_test.c`
Для работы вам могут понадобится следующие библиотечные функции: Для работы вам могут понадобится следующие библиотечные функции:
* malloc(size_t size) -- функция, динамически выделяющая size байт и возвращающая * `malloc(size_t size)` -- функция, динамически выделяющая **size** байт и возвращающая
указатель на выделенный кусок указатель на выделенный кусок
* realloc(void *ptr, size_t size) -- функция изменяющая размер выделенного куска памяти * `realloc(void *ptr, size_t size)` -- функция, изменяющая размер выделенного куска памяти
на вход принимает указатель на предыдущий выделенный кусок. на вход принимает указатель на предыдущий выделенный кусок.
возвращает укзаатель на заново выделенную память. Функция возвращает указатель на заново выделенную память.
Все предыдущие данные в ptr остаются без изменений Все предыдущие данные в `ptr` остаются без изменений

View File

@@ -12,4 +12,3 @@
#define ARR_FOREACH(arr, item) \ #define ARR_FOREACH(arr, item) \
for (item = arr; item != arr + ARRSZ(arr) * sizeof(*item); item++) for (item = arr; item != arr + ARRSZ(arr) * sizeof(*item); item++)

1
util.c
View File

@@ -45,4 +45,3 @@ xerror(int rc, char *fmt, ...)
exit(rc); exit(rc);
} }

2
util.h
View File

@@ -6,4 +6,4 @@ void* xrealloc(void *ptr, size_t size);
void xfree(void *ptr); void xfree(void *ptr);
void xerror(int rc, char *fmt, ...); void xerror(int rc, char *fmt, ...);

View File

@@ -37,14 +37,28 @@ void vector_push(ivector *v, int val);
/* Удалить последний элемент из вектора */ /* Удалить последний элемент из вектора */
void vector_pop(ivector *v); void vector_pop(ivector *v);
/* Вставить новое значение *val* по индексу *idx* /* Добавить новое значение *val* по индексу *idx*.
* idx может быть в диапазоне [0; v->n] * idx может быть в диапазоне [0; v->n].
*
* Элемент по индексу *idx* и все последующие двигаются "вправо", например
* Вектор, содержащий элементы {0, 1, 2, 3, 4}
* после выполнения
* vector_insert(&vec, 2, 42)
* Будет выглядить так {0, 1, 42, 2, 3, 4}
*/ */
void vector_insert(ivector *v, size_t idx, int val); void vector_insert(ivector *v, size_t idx, int val);
/* Удалить элемент под индексом idx из вектора */
/* Удалить элемент под индексом idx из вектора
* idx может быть в диапазоне [0; v->n - 1]
*
* Все последующие после *idx* элементы двигаются "влево", например
* Вектор, содержащий элементы {0, 1, 42, 2, 3, 4}
* после выполнения
* vector_del(&vec, 2)
* Будет выглядить так {0, 1, 2, 3, 4}
*/
void vector_del(ivector *v, size_t idx); void vector_del(ivector *v, size_t idx);
/* очистить все элементы из вектора */ /* очистить все элементы из вектора */
void vector_clear(ivector *v); void vector_clear(ivector *v);

View File

@@ -6,25 +6,62 @@
#include "munit/munit.h" #include "munit/munit.h"
static MunitResult static MunitResult
test_vector_getters(const MunitParameter params[], void * data) test_vector_len(const MunitParameter params[], void * data)
{ {
// (Really stupid) tests for vector_len and vector_data
ivector v; ivector v;
vector_init(&v); vector_init(&v);
munit_assert_size(vector_len(&v), ==, 0); munit_assert_size(vector_len(&v), ==, 0);
munit_assert_not_null(vector_data(&v));
// Lame method, that checks vector_len getter // Lame method, that checks vector_len getter
v.n = 1337; v.n = 1337;
munit_assert_size(vector_len(&v), ==, 1337); munit_assert_size(vector_len(&v), ==, 1337);
vector_free(&v);
munit_assert_size(vector_len(&v), ==, 0);
return MUNIT_OK;
}
static MunitResult
test_vector_data(const MunitParameter params[], void * data)
{
// (Really stupid) test for vector_data
ivector v;
vector_init(&v);
munit_assert_not_null(vector_data(&v));
vector_free(&v);
munit_assert_null(vector_data(&v));
return MUNIT_OK;
}
static MunitResult
test_vector_initdata(const MunitParameter params[], void * data)
{
int *p;
int i;
ivector v;
int arr[] = {
1, 2, 3, 4, 5
};
vector_initdata(&v, arr, ARRSZ(arr));
p = vector_data(&v);
munit_assert_not_null(p);
munit_assert_size(vector_len(&v), ==, ARRSZ(arr));
for (i = 0; i < ARRSZ(arr); i++) {
munit_assert_int(arr[i], ==, p[i]);
}
vector_free(&v); vector_free(&v);
return MUNIT_OK; return MUNIT_OK;
} }
static MunitResult static MunitResult
test_vector_init_reserve(const MunitParameter params[], void * data) test_vector_resize(const MunitParameter params[], void * data)
{ {
int i; int i;
int arr[] = { int arr[] = {
@@ -35,14 +72,6 @@ test_vector_init_reserve(const MunitParameter params[], void * data)
ivector v; ivector v;
vector_initdata(&v, arr, ARRSZ(arr)); vector_initdata(&v, arr, ARRSZ(arr));
p = vector_data(&v);
munit_assert_not_null(p);
munit_assert_size(vector_len(&v), ==, ARRSZ(arr));
for (i = 0; i < ARRSZ(arr); i++) {
munit_assert_int(arr[i], ==, p[i]);
}
vector_resize(&v, 16); vector_resize(&v, 16);
munit_assert_size(vector_len(&v), ==, 16); munit_assert_size(vector_len(&v), ==, 16);
@@ -56,7 +85,33 @@ test_vector_init_reserve(const MunitParameter params[], void * data)
} }
vector_free(&v); vector_free(&v);
return MUNIT_OK;
}
static MunitResult
test_vector_set_get(const MunitParameter params[], void * data)
{
int arr[] = {
1, 2, 3, 4, 5
};
ivector v;
int *p;
int i;
vector_initdata(&v, arr, ARRSZ(arr));
for (i = 0; i < vector_len(&v); i++) {
vector_set(&v, i, i);
}
p = vector_data(&v);
for (i = 0; i < vector_len(&v); i++) {
int item = vector_get(&v, i);
munit_assert_int(item, ==, i);
//double check with raw pointer
munit_assert_int(p[i], ==, i);
}
vector_free(&v);
return MUNIT_OK; return MUNIT_OK;
} }
@@ -110,9 +165,12 @@ test_vector_push_pop(const MunitParameter params[], void * data)
#define TEST_ITEM(func) {#func, func, NULL, NULL, MUNIT_TEST_OPTION_NONE } #define TEST_ITEM(func) {#func, func, NULL, NULL, MUNIT_TEST_OPTION_NONE }
static MunitTest test_suite_tests[] = { static MunitTest test_suite_tests[] = {
TEST_ITEM(test_vector_getters), TEST_ITEM(test_vector_len),
TEST_ITEM(test_vector_data),
TEST_ITEM(test_vector_initdata),
TEST_ITEM(test_vector_init_reserve), TEST_ITEM(test_vector_resize),
TEST_ITEM(test_vector_set_get),
TEST_ITEM(test_vector_push_pop), TEST_ITEM(test_vector_push_pop),
//TEST_ITEM(test_pvector_init), //TEST_ITEM(test_pvector_init),
@@ -134,4 +192,3 @@ main(int argc, const char *argv[])
munit_suite_main(&test_suite, (void *) "vector_test", argc, (char * const*) argv); munit_suite_main(&test_suite, (void *) "vector_test", argc, (char * const*) argv);
return 0; return 0;
} }