IZP/Cviko8_1/main.c

142 lines
3.3 KiB
C
Raw Normal View History

2024-11-21 17:14:54 +01:00
#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á 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;
}