#include "types.h" #include #ifndef TEST_BUILD int main(int argc, char *argv[]) { // TODO: volejte vámi implementované funkce // Vector *v = malloc(sizeof(Vector)); // Vector *ouJe = malloc(sizeof(Vector)); // Vector *spatny = malloc(sizeof(Vector)); Vector v = {NULL,2}; Vector ouJe = {NULL,2}; Vector spatny = {NULL,3}; if (!vector_ctor(&v, 3) || !vector_ctor(&ouJe, 3) || !vector_ctor(&v, 2)) { fprintf(stderr, "Upsík dupsík, nepodařilo se dynamicky vytvořit vektor"); return 1; } vector_init(&v); vector_print(&v); vector_scalar_multiply(&v, 3); vector_print(&v); printf("---\n"); if (!vector_add(&v, &ouJe)) { fprintf(stderr, "Nepodařilo se sečíst vektory"); } vector_print(&v); if (!vector_add(&v, &spatny)) { fprintf(stderr, "Nepodařilo se sečíst vektory"); } vector_print(&v); printf("---\n"); if (!vector_sub(&v, &ouJe)) { fprintf(stderr, "Nepodařilo se odečíst vektory\n"); } vector_print(&v); if (!vector_sub(&v, &spatny)) { fprintf(stderr, "Nepodařilo se odečíst vektory\n"); } vector_print(&v); printf("---\n"); vector_dtor(&v); vector_dtor(&ouJe); vector_dtor(&spatny); // if (v != NULL || ouJe != NULL || spatny != NULL) { // fprintf(stderr, "Špatné promazání paměti!"); // return 1; // } return 0; } #endif /** * Vytiskne vektor (velikost a jeho prvky) na standardní výstup. * * @param v ukazatel na vektor */ void vector_print(Vector *v) { if (v == NULL) return; // TODO: implementujte funkci dle zadání 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"); } /** * Vytvoří (dynamicky alokuje) vektor o specifikovaném rozměru. * Nově alokovaná paměť a korespondující počet prvků * je do struktury uložen prostřednictvím ukazatele v. * * @param v ukazatel na strukturu vektoru * @param size počet prvků vektoru (rozměr) * * @returns hodnotu true v případě úspěšné alokace, false jinak */ bool vector_ctor(Vector *v, unsigned int size) { if (v == NULL) return false; // TODO: implementujte funkci dle zadání // v = malloc(sizeof(Vector)); v->items = (size == 0) ? NULL : malloc(size * sizeof(int)); if(v->items == NULL) return false; v->size = size; return true; } /** * Inicializuje prvky vektoru na číselnou posloupnost * od 0 do velikosti vektoru - 1. * * Příklad: * Vector3 [0, 1, 2] * Vector5 [0, 1, 2, 3, 4] * * @param v ukazatel na existující vektor */ void vector_init(Vector *v) { if (v == NULL || v->items == NULL) return; // TODO: implementujte funkci dle zadání for (int i = 0; i < v->size; i++) { v->items[i] = i; } } /** * Provede zrušení (uvolnění alokované paměti) daného vektoru. * Ukazatel na prvky zrušeného vektoru je NULL. * Rozměr zrušeného vektoru je 0. * * @param v ukazatel na existující vektor */ void vector_dtor(Vector *v) { // TODO: implementujte funkci dle zadání if (v == NULL || v->items == NULL) return; v->size = 0; free(v->items); v->items = NULL; } /** * Provede výpočet skalárního součinu vektoru s daným číslem. * Výpočet se provádí nad hodnotami poskytnutého vektoru v, * změny probíhají tzv. in-place, bez alokace nového vektoru. * * @param v ukazatel na existující vektor * @param scalar skalární hodnota */ void vector_scalar_multiply(Vector *v, int scalar) { if (v == NULL || v->items == NULL) return; // TODO: implementujte funkci dle zadání for (int i = 0; i < v->size; i++) { v->items[i] *= scalar; } } /** * Provede součet dvou vektorů v1 + v2. * Výpočet se provádí nad hodnotami poskytnutého vektoru v1, * změny probíhají tzv. in-place, bez alokace nového vektoru. * * Vzájemně kontrolujte rozměry obou vektorů! * Operaci nelze provádět nad vektory různých rozměrů. * * @param v1 ukazatel na první vektor * @param v2 ukazatel na druhý vektor * * @returns hodnotu true při úspěšném sečtení, false jinak */ bool vector_add(Vector *v1, Vector *v2) { if (v1 == NULL || v2 == NULL || v1->items == NULL || v2->items == NULL || v1->size != v2->size) return false; // TODO: implementujte funkci dle zadání for (int i = 0; i < v1->size; i++) { v1->items[i] += v2->items[i]; } return true; } /** * Provede odečtení dvou vektorů v1 + v2. * Výpočet se provádí nad hodnotami poskytnutého vektoru v1, * změny probíhají tzv. in-place, bez alokace nového vektoru. * * Vzájemně kontrolujte rozměry obou vektorů! * Operaci nelze provádět nad vektory různých rozměrů. * * @param v1 ukazatel na první vektor * @param v2 ukazatel na druhý vektor * * @returns hodnotu true při úspěšném odečtení, false jinak */ bool vector_sub(Vector *v1, Vector *v2) { if (v1 == NULL || v2 == NULL || v1->items == NULL || v2->items == NULL) return false; // TODO: implementujte funkci dle zadání if (v1->size != v2->size) { return false; } for (int i = 0; i < v1->size; i++) { v1->items[i] -= v2->items[i]; } return -1; }