1
This commit is contained in:
		
							parent
							
								
									cef3425769
								
							
						
					
					
						commit
						5b78da9114
					
				
							
								
								
									
										17
									
								
								cv6/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								cv6/Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| CC = gcc | ||||
| CFLAGS = -Wall -Werror -std=c99 | ||||
| 
 | ||||
| all: main | ||||
| 
 | ||||
| main: main.o a_station.o | ||||
|     $(CC) $(CFLAGS) -o main main.o a_station.o | ||||
| 
 | ||||
| main.o: main.c a_station.h | ||||
|     $(CC) $(CFLAGS) -c main.c | ||||
| 
 | ||||
| a_station.o: a_station.c a_station.h | ||||
|     $(CC) $(CFLAGS) -c a_station.c | ||||
| 
 | ||||
| clean: | ||||
|     rm -f *.o main | ||||
| 
 | ||||
							
								
								
									
										90
									
								
								cv6/a_station.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								cv6/a_station.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,90 @@ | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "a_station.h" | ||||
| 
 | ||||
| struct station* create_station() { | ||||
|     struct station* new_station = malloc(sizeof(struct station)); | ||||
|     if (!new_station) return NULL; | ||||
| 
 | ||||
|     new_station->tracks = calloc(STATION_SIZE, sizeof(struct car*)); | ||||
|     new_station->track_count = STATION_SIZE; | ||||
|     return new_station; | ||||
| } | ||||
| 
 | ||||
| void destroy_station(struct station* station) { | ||||
|     for (int i = 0; i < station->track_count; i++) { | ||||
|         struct car* current = station->tracks[i]; | ||||
|         while (current) { | ||||
|             struct car* temp = current; | ||||
|             current = current->next; | ||||
|             free(temp); | ||||
|         } | ||||
|     } | ||||
|     free(station->tracks); | ||||
|     free(station); | ||||
| } | ||||
| 
 | ||||
| int select_track(struct station* station, const char* target) { | ||||
|     int hash = 0; | ||||
|     for (int i = 0; target[i] != '\0'; i++) { | ||||
|         hash = (hash * 31 + target[i]) % station->track_count; | ||||
|     } | ||||
|     return hash; | ||||
| } | ||||
| 
 | ||||
| void add_target_capacity(struct station* station, const char* target, int capacity) { | ||||
|     int index = select_track(station, target); | ||||
|     struct car* current = station->tracks[index]; | ||||
| 
 | ||||
|     while (current) { | ||||
|         if (strcmp(current->value, target) == 0) { | ||||
|             current->capacity += capacity; | ||||
|             return; | ||||
|         } | ||||
|         current = current->next; | ||||
|     } | ||||
| 
 | ||||
|     struct car* new_car = malloc(sizeof(struct car)); | ||||
|     strncpy(new_car->value, target, TARGET_SIZE); | ||||
|     new_car->capacity = capacity; | ||||
|     new_car->next = station->tracks[index]; | ||||
|     station->tracks[index] = new_car; | ||||
| } | ||||
| 
 | ||||
| int get_target_capacity(struct station* station, const char* target) { | ||||
|     int index = select_track(station, target); | ||||
|     struct car* current = station->tracks[index]; | ||||
| 
 | ||||
|     while (current) { | ||||
|         if (strcmp(current->value, target) == 0) { | ||||
|             return current->capacity; | ||||
|         } | ||||
|         current = current->next; | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| int count_targets(struct station* station) { | ||||
|     int count = 0; | ||||
|     for (int i = 0; i < station->track_count; i++) { | ||||
|         struct car* current = station->tracks[i]; | ||||
|         while (current) { | ||||
|             count++; | ||||
|             current = current->next; | ||||
|         } | ||||
|     } | ||||
|     return count; | ||||
| } | ||||
| 
 | ||||
| int count_capacity(struct station* station) { | ||||
|     int total_capacity = 0; | ||||
|     for (int i = 0; i < station->track_count; i++) { | ||||
|         struct car* current = station->tracks[i]; | ||||
|         while (current) { | ||||
|             total_capacity += current->capacity; | ||||
|             current = current->next; | ||||
|         } | ||||
|     } | ||||
|     return total_capacity; | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										91
									
								
								cv6/a_station.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								cv6/a_station.h
									
									
									
									
									
										Normal file
									
								
							| @ -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 | ||||
							
								
								
									
										18
									
								
								cv6/main.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								cv6/main.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | ||||
| #include <stdio.h> | ||||
| #include "a_station.h" | ||||
| 
 | ||||
| int main() { | ||||
|     struct station* station = create_station(); | ||||
| 
 | ||||
|     add_target_capacity(station, "Bratislava", 100); | ||||
|     add_target_capacity(station, "Kosice", 150); | ||||
|     add_target_capacity(station, "Bratislava", 50); | ||||
| 
 | ||||
|     printf("Capacity to Bratislava: %d\n", get_target_capacity(station, "Bratislava")); | ||||
|     printf("Total number of targets: %d\n", count_targets(station)); | ||||
|     printf("Total capacity: %d\n", count_capacity(station)); | ||||
| 
 | ||||
|     destroy_station(station); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user