forked from 131/lab5_ivec
добавил тесты, обновил ридмиху
This commit is contained in:
@@ -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` остаются без изменений
|
||||||
1
macro.h
1
macro.h
@@ -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++)
|
||||||
|
|
||||||
|
|||||||
2
util.h
2
util.h
@@ -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, ...);
|
||||||
22
vector.h
22
vector.h
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user