#include "types.h" #include #include #ifndef TEST_BUILD int main(int argc, char *argv[]) { Vector *v = vector_ctor(); // TODO: 1. V nekonečném cyklu čtete nenulové celočíselné hodnoty a jednotlivě // je přidávejte do vektoru. // Nulová hodnota ukončuje čtecí cyklus. while (true) { printf("Zadejte číslo, které se přidá do vektoru: "); int cislo = 0; scanf("%d", &cislo); if (cislo == 0) { break; } vector_expand(v, cislo); } // TODO: 2. Vypište uživateli obsah vektoru a jeho celkovou velikost voláním // `vector_print`. vector_print(v); // TODO: 3. Uvolněte alokovanou paměť. vector_dtor(&v); return 0; } #endif /** * Na haldě dynamicky alokuje a inicializuje nový vektor o nulovém rozměru. * * hint: malloc, sizeof * * @returns ukazatel na alokovanou paměť v případě úspěšné alokace, NULL jinak */ Vector *vector_ctor(void) { Vector *newVec = malloc(sizeof(Vector)); if (newVec == NULL) { return NULL; } newVec->size = 0; newVec->items = NULL; return newVec; // return NULL; } /** * Provede zrušení (uvolnění alokované paměti) daného vektoru. * A to včetně pole jeho komponent. * Po uvolnění ukazatel na původní vektor vynulujte. * * hint: free * * @param v ukazatel na ukazatel na existující vektor */ void vector_dtor(Vector **v) { free((*v)->items); free(*v); *v = NULL; } /** * Vytiskne vektor (rozměr a všechny jeho prvky) na standardní výstup. * * @param v ukazatel na vektor */ void vector_print(Vector *v) { if (v == NULL) { return; } if (v->size == 0) { printf("Vector(0) = (null)\n"); return; } printf("Vector(%d) = [", v->size); for (int i = 0; i < v->size; i++) { printf((i == v->size - 1) ? "%d]" : "%d, ", v->items[i]); } printf("\n"); } /** * Změní rozměr vektoru na nove definovaný rozměr. * Odpovídajícím způsobem aktualizuje pole komponent a rozměr vektoru. * * hint: realloc, sizeof * * @param v ukazatel na existující vektor * @param new_size nový rozměr vektoru (počet složek/komponent) * * @returns hodnotu true v případě úspěšné změny, false jinak */ bool vector_resize(Vector *v, int new_size) { // Reallocate to a helper var, so we can verify success int *resizedItems = realloc(v->items, sizeof(int) * new_size); if (resizedItems == NULL) { // in case of failure, free old memory and return false free(v->items); return false; } // otherwise set new address and return true v->size = new_size; v->items = resizedItems; return true; } /** * Rozšíří rozměr vektoru o jedna a přidá do něj jednu novou složku * (komponenetu). Odpovídajícím způsobem aktualizuje pole komponent a rozměr * vektoru. * * hint: vector_resize * * @param v ukazatel na existující vektor * @param value složka, která má být přidána do vektoru * * @returns hodnotu true v případě úspěšného přidání složky do vektoru, false * jinak */ bool vector_expand(Vector *v, int value) { bool resize = vector_resize(v, v->size + 1); if (!resize) { return false; } v->items[v->size - 1] = value; return true; }