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.
|
||||
Вектор -- это динамический массив данных, который может менять свой размер
|
||||
в процессе работы.
|
||||
|
||||
Описание структуры данных ivector в файле vector.h
|
||||
Описание структуры данных ivector в файле `vector.h`
|
||||
|
||||
Вам необходимо реализовать некоторые функции в файле ./vector.c
|
||||
и пройти тесты (описанные в ./vector_test.c).
|
||||
Вам необходимо реализовать некоторые функции в файле `./vector.c`
|
||||
и пройти тесты (описанные в `./vector_test.c`).
|
||||
|
||||
Команда для сборки проекта -- make
|
||||
Команда для запуска тестов -- make test
|
||||
Команда для сборки проекта -- **make**
|
||||
Команда для запуска тестов -- **make test**
|
||||
|
||||
|
||||
* Необходимо реализовать следующие функции(короткое описание функций можно
|
||||
подсмотреть в vector.h):
|
||||
|
||||
подсмотреть в `vector.h`):
|
||||
```
|
||||
vector_len
|
||||
vector_data
|
||||
vector_resize
|
||||
@@ -30,15 +29,17 @@
|
||||
vector_push
|
||||
vector_pop
|
||||
|
||||
(Опционально, но очень желательно)
|
||||
vector_insert
|
||||
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) \
|
||||
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 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);
|
||||
|
||||
/* Вставить новое значение *val* по индексу *idx*
|
||||
* idx может быть в диапазоне [0; v->n]
|
||||
/* Добавить новое значение *val* по индексу *idx*.
|
||||
* 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);
|
||||
/* Удалить элемент под индексом 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_clear(ivector *v);
|
||||
|
||||
|
||||
|
||||
@@ -6,25 +6,62 @@
|
||||
#include "munit/munit.h"
|
||||
|
||||
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;
|
||||
vector_init(&v);
|
||||
|
||||
munit_assert_size(vector_len(&v), ==, 0);
|
||||
munit_assert_not_null(vector_data(&v));
|
||||
|
||||
// Lame method, that checks vector_len getter
|
||||
v.n = 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);
|
||||
|
||||
return MUNIT_OK;
|
||||
}
|
||||
|
||||
static MunitResult
|
||||
test_vector_init_reserve(const MunitParameter params[], void * data)
|
||||
test_vector_resize(const MunitParameter params[], void * data)
|
||||
{
|
||||
int i;
|
||||
int arr[] = {
|
||||
@@ -35,14 +72,6 @@ test_vector_init_reserve(const MunitParameter params[], void * data)
|
||||
ivector v;
|
||||
|
||||
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);
|
||||
munit_assert_size(vector_len(&v), ==, 16);
|
||||
|
||||
@@ -56,7 +85,33 @@ test_vector_init_reserve(const MunitParameter params[], void * data)
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
|
||||
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_pvector_init),
|
||||
|
||||
@@ -134,4 +192,3 @@ main(int argc, const char *argv[])
|
||||
munit_suite_main(&test_suite, (void *) "vector_test", argc, (char * const*) argv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user