IZP/Cviko7_3/main.c

210 lines
5.2 KiB
C
Raw Normal View History

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