From 2b517975e98364d0b84cb69c32991ec4911b1fdc Mon Sep 17 00:00:00 2001 From: Matej Hajduk Date: Wed, 12 Nov 2025 09:33:03 +0100 Subject: [PATCH] lalaa --- du5/Makefile | 13 +++++ du5/a_station.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++ du5/a_station.h | 91 ++++++++++++++++++++++++++++++ du5/a_station.o | Bin 0 -> 8896 bytes du5/main.c | 41 ++++++++++++++ du5/main.o | Bin 0 -> 8608 bytes du5/station | Bin 0 -> 21720 bytes 7 files changed, 291 insertions(+) create mode 100644 du5/Makefile create mode 100644 du5/a_station.c create mode 100644 du5/a_station.h create mode 100644 du5/a_station.o create mode 100644 du5/main.c create mode 100644 du5/main.o create mode 100755 du5/station diff --git a/du5/Makefile b/du5/Makefile new file mode 100644 index 0000000..8cec7f4 --- /dev/null +++ b/du5/Makefile @@ -0,0 +1,13 @@ +CFLAGS= -std=c99 -g -Wall -Werror + +all: station + +%.o: %.c + gcc -c -o $@ $< $(CFLAGS) + +station: main.o a_station.o + gcc $(CFLAGS) main.o a_station.o -o station + +clean: + rm *.o station + diff --git a/du5/a_station.c b/du5/a_station.c new file mode 100644 index 0000000..b5e68cf --- /dev/null +++ b/du5/a_station.c @@ -0,0 +1,146 @@ +#include "a_station.h" +#include +#include +#include + +/** + * Vytvori prazdnu stanicu. + * Alokuje pole smernikov tracks a inicializuje ich na NULL. + */ +struct station* create_station() { + struct station* s = malloc(sizeof(struct station)); + if (!s) return NULL; + + s->track_count = STATION_SIZE; + s->tracks = calloc(s->track_count, sizeof(struct car*)); // všetky položky na NULL + if (!s->tracks) { + free(s); + return NULL; + } + + return s; +} + +/** + * Uvolni pamat celej databazy (vratane vsetkych spojkovych zoznamov). + */ +void destroy_station(struct station* s) { + if (!s) return; + + for (int i = 0; i < s->track_count; i++) { + struct car* current = s->tracks[i]; + while (current) { + struct car* next = current->next; + free(current); + current = next; + } + } + + free(s->tracks); + free(s); +} + +/** + * Jednoducha hash funkcia pre rozdelenie zaznamov do trati. + * Pouziva variant DJB2 hash algoritmu. + */ +int select_track(struct station* s, const char* target) { + if (!s || !target) return 0; + + unsigned long hash = 5381; + int c; + while ((c = *target++)) + hash = ((hash << 5) + hash) + c; // hash * 33 + c + + return (int)(hash % s->track_count); +} + +/** + * Prida alebo aktualizuje zaznam pre danu cielovu stanicu. + */ +void add_target_capacity(struct station* s, const char* target, int capacity) { + if (!s || !target || capacity <= 0) return; + + int index = select_track(s, target); + struct car* current = s->tracks[index]; + struct car* prev = NULL; + + // Skontroluj, ci uz existuje + while (current) { + if (strcmp(current->value, target) == 0) { + current->capacity += capacity; + return; + } + prev = current; + current = current->next; + } + + // Ak neexistuje, vytvor novy zaznam + struct car* new_car = malloc(sizeof(struct car)); + if (!new_car) return; + + strncpy(new_car->value, target, TARGET_SIZE - 1); + new_car->value[TARGET_SIZE - 1] = '\0'; + new_car->capacity = capacity; + new_car->next = NULL; + + if (prev) + prev->next = new_car; + else + s->tracks[index] = new_car; +} + +/** + * Ziska kapacitu pre danu stanicu. + */ +int get_target_capacity(struct station* s, const char* target) { + if (!s || !target) return 0; + + int index = select_track(s, target); + struct car* current = s->tracks[index]; + + while (current) { + if (strcmp(current->value, target) == 0) + return current->capacity; + current = current->next; + } + + return 0; +} + +/** + * Spocita pocet cielovych stanic (vsetky uzly vo vsetkych tratiach). + */ +int count_targets(struct station* s) { + if (!s) return 0; + + int count = 0; + for (int i = 0; i < s->track_count; i++) { + struct car* current = s->tracks[i]; + while (current) { + count++; + current = current->next; + } + } + + return count; +} + +/** + * Spocita celkovu kapacitu vsetkych zaznamov. + */ +int count_capacity(struct station* s) { + if (!s) return 0; + + int sum = 0; + for (int i = 0; i < s->track_count; i++) { + struct car* current = s->tracks[i]; + while (current) { + sum += current->capacity; + current = current->next; + } + } + + return sum; +} + diff --git a/du5/a_station.h b/du5/a_station.h new file mode 100644 index 0000000..ce8c733 --- /dev/null +++ b/du5/a_station.h @@ -0,0 +1,91 @@ +#ifndef STATION_H +#define STATION_H +// Pocet trati k dispozicii +#define STATION_SIZE 10 +// Maximalny pocet znakov pre ulozenie nazvu cielovej stanice +#define TARGET_SIZE 36 + +/** + * Jeden zaznam o kapacite do cielovej stanice + */ +struct car { + // Cielova stanica / nazov + char value[TARGET_SIZE]; + // Pocet cestujuchich + int capacity; + // Smernik na dalsi zaznam + struct car* next; +}; + +/** + * Cela databaza zaznamov + */ +struct station { + // Dynamicke pole smernikov na zaznamy + // jeden zaznam ma typ struct car* + struct car** tracks; + // Velkost pola tracks + int track_count; +}; + + +/** + * Vytvori prazdnu stanicu. + * Alokuje pole smernikov tracks na pociatocnu kapacitu STATION_SIZE + * nastavi velkost capacity na STATION_SIZE + * @return smernik na prazdnu stanicu + */ +struct station* create_station(); + +/** + * Uvolni pamat + * @param smernik na databazu + */ +void destroy_station(struct station* station); + +/** + * Vyberie poziciu v poli station->tracks pre ulozenie zaznamu target + * + * Proces vyberu by mal splnat kriteria pre hash funkciu: + * - rovnaky retazec by mal vzdy mat rovnaky vysledok + * - pre rozne retazce by mali byt vysledky co najviac rozne + * + * @param smernik na databazu + * @param nazov cielovej stanice + * @return cislo v intervale 0 az N-1, kde N je station->track_count + */ +int select_track(struct station* station, const char* target); + +/** + * Zvysi zaznam o pocte cestujucich do danej cielovej stanice. + * + * Najprv sa vyberie cielova trat pomocou select_track(). Ak zaznam neexistuje, + * vytvori sa novy. Ak zaznam na danej trati (spojkovom zozname) existuje, cislo sa pripocita. + * V databaze nesmu byt dva zaznamy s rovnakou cielovou stanicou. + * + * @param smernik na databazu + * @param nazov cielovej stanice + */ +void add_target_capacity(struct station* station,const char* target, int capacity); + +/** + * Ziska zaznam o cielovej stanici. + * @param smernik na databazu + * @param nazov cielovej stanice + * + * @return kapacitu do cielovej stanice. Ak sa zaznam nenachedza, vrati nula. + */ +int get_target_capacity(struct station* station,const char* target); + +/** + * Spocita pocet cielovych stanic + * @param smernik na databazu + */ +int count_targets(struct station* station); + +/** + * Spocita kapacitu vo vsetkych zaznamoch + * @param smernik na databazu + */ +int count_capacity(struct station* station); +#endif diff --git a/du5/a_station.o b/du5/a_station.o new file mode 100644 index 0000000000000000000000000000000000000000..df846065c446ffcbab442d174411052463deeb16 GIT binary patch literal 8896 zcmbtZ4Qw366`tMmIP08!KHG5|#{r-7hm+zvJD3nd9IjXgmjp;?Mv0JVqGC}h`rhoD z^?H1vQajS^y!qb$o1dMv?~dJkqpoR8HjQmzb0di|7QM_v3o^=RF8y`J9%j`wZkHlY|^2N2& zaj=<>&72DXZzet#Z4^-=ou?3le;AJ*o?-TTqp|ZEnt@o`V&@M%<(LE;uJjp6pVP)Y zA>|KG$Mg0Sn3-nQBIu^vI_!;~jLq_DsL17DZWbcr@w}6`_R3i7A_NP8V)e#iQ}J)@ z)Z+Qhsq$x8`HLs=v5TXJFEaZiu%@wo$yd?DG0Zpq$;a{h>92XK5*1a++o$uLr$lke zk5t3N0(qL1A6X3K=;2eW{6U=U_*f@Y2MU&dM`o0dofQa{@T^k8X-Hy5l(_?A5!!Q_ zFm1~a9^1KkEOtu6fu{an%b{P`O_ zAA;gtat4Y4JcCy!ei0Z=dfOoC#^`aZ{85A zU0GDPpyZCao#x>}oT?wT*~9~_O%;8Iq6d^j4rh%m0Ew%El(zlMT&))1D!>v6B* zvHc4?E=6yUnkMF2@%uN$?{mWM&LYM*)9_4S0eqC=!`rrjgly%>M3yz{exnk#y)4!hyjIv<=%CLjPk8+SQAM>{3H_GSPLf7hUHls~e&-&?nJ;#K!~wfahhf zBYjBt1SK}OaTkn*%w#F1wi#sv8y~C&eyr$Adf5)d-@uWmUcHWV8bLH89u8-P;M^rS z3=d{@1Wn6!fCz2!6OiILc4RdY`o!+yoISwq6BW=Wy4^{+jTDO0?EU~+(kD_bvrSsV zK3|Px(iE;XUj1o&^+}Hfig^dv+ChhZq>M7kIxJVQAoec!Bq;9G>%L+wbwd z3>jKC_qzVJ6rOz3aoxR+T$doHdlQyipV%n^Nm3vwF-nQGhKZG-XgfZzwF@q0bF)um z)4tv@85bto+Z>ZoXB5L|d=oF+EwrNKVV4+vnLO+kqZ??{Ek-+B@1mX&Z&H%hCLePm zh^+J`6>0G%wV_HZ<%z!HB)du`=%iF9@`1<0L}-(ZxN&o=ZY`zc&iP&vfhoD1rev?n z?2!7{*VB~DEvAr{-B3HXURW)1w8a(ZO}4qUTAXA4Y9|m_U0N&i1+Hz-uJgC~w^r#e z+xlwe_iyq0;DqsUwzUejjbE$KDq)v$&V0r^;bKsqk1Q$^26e~aCfJciIrBFdXs87A z=Q~>*)~>IWSOdSJc54;7iY_}?tAT=FvVCX{xtj%ED)FN0cw0kYj!`BVm{3FU6}67F zLqaQ1p{)s2`F-_u^#}*yOen9?e1_kDtsm{9$DpQdtwN%r0dkK(_?2r#5vr&xaQZF* zrGQtddMV~5Y+#y8Az@Igp;-J7BgF1RzRU$FA#Z@SUZ$+XA)L-D;Rjm{nmGLhg%9t6 z?}9*d;=Tmg8-dm|?O%a1>~KB64~TkL;&V;c>h*GQ$j@Pd5(`K?biR_6I1vEHSEBLS z=cW6(ww1@ha$Yu;?>7^ zxy@@MyzDryKF))8^Yvgy&+_GHZX2%=R=M9-vKy2}d7008hiksF5N~TmTcs#%@p|Zd z7OxuS{v*65!Y_N0ud#SwH(!?H72sksFYV#W)4b*fTzjAIfG~_+NB2qLqUcFp@hD$m z?BS~|P_ViGUS0=5ZR4e9dHr@?W<+@4tGr^Am--GK<8{8pmdF`0*~Zrx?Yw4`SN)J1 zFYqNcUwnpFT73C2zRs5#=T*MS%@DCa#G~l8T?x5jc+M^N56^k6+s-Q{c6rL9ac`x%4U*7Bg{%< zdrgbw`UbOB2(JV=D`BMvGi)Hy-#?gS!-;;|Wa&)GJis#M{w}@*%`CF*UXsNbP|S%Y_hNYz^08&8(Tw7y`iR@m1<9dd{a*%H7S&4o9W)7GTM)J<4q3oaq5e{ZS4Fo}*7|DJ}Ub0~VfRXI+j9JP=jS)8; zQQmpUJ0%6FBRVv)YV0W&ht*V49WcqC%y5{V60M^g6HEFtZO zlb03(g={39N%q?*lZiopdS9eBnT$YLx;C~p^`|rTfu`P!9cgKC1-+&V(=ho~Hl67W zBas4|4v{i@fM7RubX*&1?A!;7$)?F^YO%$z<*p4I!p*JW4eN*jXB)nMgYd%(C`>6H zyC)EnC#Jae!dN?a8`BO1wYt(p#yFgjD*(eEHu1KN1%ltyJIadnL6C5Gn;o`uHE{Vy zUB0{zjG~;&Kj`ugk-oSsNxrXDLjm+XNqliZlYIRFSN{d#i@T%CPrLj-6TeXW#9Gkd z>!FB!{P_X~06ynFxq#&p)m;FCy!aMa!04`_)h_G%r z-)dV0Kp}knCGZH~XkXfWm<(P|xL>?S;g1T0<8>V6A0%AffV%-N(62T&MX_<=^(;xVEJI z0L=r+mwWIX9^4y$)`R1`OFKTAAGG7Of3*kq+LsqYtO4rCCcd*^fH>aq>L_kmPsDN8 ziLVCem%) z>D+lt()d#a@1(Je7w5%$w_inhOZ-nXmgkSecak0FD}HYM%o2WwVyA&{=bL;^zMt^> zNgg{~Kl1$fm4aWO_5F^5e@6HRgv&VPJMG^JUPj|$TC6xkQl5wF2$y!`e!fPL{|5Qp zrQk;iHx)ZFo?!)-`{5gk9eHm5Sdo|e`Dq2mKfPf)q2SW*9~AuWREM_-mvxZuolg{b z>6cS}vOaR3E>Un9&q@WC@iZ&=Un!m~3f}6Z#comXcL~3pa2daRpN=T3jPqq^MQgtLins=U)G_R4rLktFG;?Ja9L-0?yXbsvn1cD*df^6 z<7kIM5G;9@kbb57N+M7m&;K3v^doR5**EsFflX#5rG)qF#Q<8r4ZFOaB$%X#lsaJk;@QE<7B9#wF;uTLnrJb$JX zT%Lz4oEsT{uRrLmtkd^NDr@#9!WMprg;NPD!NU7;ITjXZ%G_u7cBL~tgTNDXV&6Xe zmh-X`*+iz-oUa1kT&7e3KaxZkzUg3`92^+H&*pFjK0(9qNd%vu_?hgC;bScfAE!fR z7QW^kUuIudPc|`NQiA_y7Xp2pOYb`jO-AtnP5l!X%6c3AJr=i2)C&TAKm4T*TZj~J zh@?C}mLU@w?gzxZdkXQRv=5Q?Hr4-?z(kw>tNupNRc)d_>3^3Jhbr3wvW4=0VhLJ- zMuo-v@&2afe*<8uO@P>6NbqrmsSFw3M^p^;@5KWETC>x+PgNH0AqC^73#rt{_%S3k z{xo2!O@P=lI#* zRY<>#E{4Bw%(zdfC;RbB=${~c`Tmv$q@L`*L;8|0`;X+sR07mXJqhFe8qaN|%xs4A zLsF1>Sw9KC3 literal 0 HcmV?d00001 diff --git a/du5/main.c b/du5/main.c new file mode 100644 index 0000000..a909625 --- /dev/null +++ b/du5/main.c @@ -0,0 +1,41 @@ +#include "a_station.h" +#include +#include +#include + +void print_station(struct station* station){ + // Vypise celu stanicu + printf("station>>>\n"); + // Prechadza vsetky trate + for (int i = 0 ; i< station->track_count; i++){ + struct car* start = station->tracks[i]; + struct car* this = start; + // Prechadza vsetky vozne + while(this != NULL){ + printf("%s %d -> ",this->value,this->capacity); + this=this->next; + } + printf("NULL\n"); + } + printf("<<H`!};@20zV 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 Ufu@wd4>v|A;(h5zSI*!60H*W3-~a#s literal 0 HcmV?d00001 diff --git a/du5/station b/du5/station new file mode 100755 index 0000000000000000000000000000000000000000..5cce452893b02790a4e893231a1b40ce5f42e5f7 GIT binary patch literal 21720 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 literal 0 HcmV?d00001