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