142 lines
3.3 KiB
C
142 lines
3.3 KiB
C
|
#include "types.h"
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
#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;
|
||
|
}
|