Init
This commit is contained in:
commit
b3f3cd0526
92
a1/program.c
Normal file
92
a1/program.c
Normal file
@ -0,0 +1,92 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_LEN 101
|
||||
|
||||
typedef struct {
|
||||
char bracket;
|
||||
int position;
|
||||
} StackItem;
|
||||
|
||||
int is_opening(char ch) {
|
||||
return ch == '(' || ch == '{' || ch == '[' || ch == '<';
|
||||
}
|
||||
|
||||
int is_closing(char ch) {
|
||||
return ch == ')' || ch == '}' || ch == ']' || ch == '>';
|
||||
}
|
||||
|
||||
char matching_bracket(char ch) {
|
||||
switch (ch) {
|
||||
case ')': return '(';
|
||||
case '}': return '{';
|
||||
case ']': return '[';
|
||||
case '>': return '<';
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
char expected_closing(char ch) {
|
||||
switch (ch) {
|
||||
case '(': return ')';
|
||||
case '{': return '}';
|
||||
case '[': return ']';
|
||||
case '<': return '>';
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
void check_brackets(const char *line) {
|
||||
StackItem stack[MAX_LEN];
|
||||
int stack_top = -1;
|
||||
|
||||
printf("Read: %s\n", line);
|
||||
|
||||
for (int i = 0; line[i] != '\0'; i++) {
|
||||
char ch = line[i];
|
||||
|
||||
if (is_opening(ch)) {
|
||||
if (stack_top < MAX_LEN - 1) {
|
||||
stack[++stack_top].bracket = ch;
|
||||
stack[stack_top].position = i;
|
||||
} else {
|
||||
printf("Error: Stack overflow\n");
|
||||
return;
|
||||
}
|
||||
} else if (is_closing(ch)) {
|
||||
if (stack_top == -1) {
|
||||
printf("Unexpected closing bracket %c in %d\n", ch, i);
|
||||
return;
|
||||
} else if (stack[stack_top].bracket == matching_bracket(ch)) {
|
||||
stack_top--;
|
||||
} else {
|
||||
printf("Crossed bracket %c in %d, expected %c \n", ch, i,
|
||||
expected_closing(stack[stack_top].bracket));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (stack_top >= 0) {
|
||||
printf("Missing closing brackets:");
|
||||
printf(" ");
|
||||
while (stack_top >= 0) {
|
||||
printf("%c", expected_closing(stack[stack_top].bracket));
|
||||
stack_top--;
|
||||
}
|
||||
printf("\n");
|
||||
} else {
|
||||
printf("All brackets OK\n");
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
char line[MAX_LEN];
|
||||
if (fgets(line, sizeof(line), stdin)) {
|
||||
line[strcspn(line, "\n")] = '\0';
|
||||
check_brackets(line);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
34
a4/program.c
Normal file
34
a4/program.c
Normal file
@ -0,0 +1,34 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int is_heap(int* arr, int size ){
|
||||
for(int i = 0; i < size; i++){
|
||||
int l = i * 2 + 1;
|
||||
int r = i * 2 + 2;
|
||||
}
|
||||
|
||||
if (l < size && arr[i] < arr[l]){
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (r < size && arr[i] < arr[r]){
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int arr[] = 100;
|
||||
int size = 0;
|
||||
|
||||
while (scanf("%d", &num) != EOF){
|
||||
arr[size++] = num;
|
||||
}
|
||||
|
||||
if (!is_heap(arr, size)){
|
||||
printf("Nie je kopa.");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
92
cv1/program.c
Normal file
92
cv1/program.c
Normal file
@ -0,0 +1,92 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
|
||||
#define LINESIZE 100
|
||||
#define MENU_SIZE 100
|
||||
|
||||
struct pizza {
|
||||
char name[LINESIZE];
|
||||
float price;
|
||||
};
|
||||
|
||||
char hacker_script(char l) {
|
||||
switch (l) {
|
||||
case '0': return 'o';
|
||||
case '1': return 'i';
|
||||
case '2': return 'z';
|
||||
case '3': return 'e';
|
||||
case '4': return 'a';
|
||||
case '5': return 's';
|
||||
case '6': return 'b';
|
||||
case '7': return 't';
|
||||
case '8': return 'b';
|
||||
case '9': return 'q';
|
||||
default: return l;
|
||||
}
|
||||
}
|
||||
|
||||
void transform_to_hacker_script(const char *src, char *dest) {
|
||||
while (*src) {
|
||||
*dest++ = hacker_script(*src++);
|
||||
}
|
||||
*dest = '\0';
|
||||
}
|
||||
|
||||
int contains_normalized(const char *name, const char *search) {
|
||||
char transformed_name[LINESIZE], transformed_search[LINESIZE];
|
||||
transform_to_hacker_script(name, transformed_name);
|
||||
transform_to_hacker_script(search, transformed_search);
|
||||
|
||||
for (int i = 0; transformed_name[i]; i++) {
|
||||
transformed_name[i] = tolower(transformed_name[i]);
|
||||
}
|
||||
for (int i = 0; transformed_search[i]; i++) {
|
||||
transformed_search[i] = tolower(transformed_search[i]);
|
||||
}
|
||||
|
||||
return strstr(transformed_name, transformed_search) != NULL;
|
||||
}
|
||||
|
||||
int read_pizza(struct pizza *item) {
|
||||
char line[LINESIZE];
|
||||
if (!fgets(item->name, LINESIZE, stdin)) {
|
||||
return 0;
|
||||
}
|
||||
item->name[strcspn(item->name, "\n")] = '\0';
|
||||
if (!fgets(line, LINESIZE, stdin)) {
|
||||
return 0;
|
||||
}
|
||||
item->price = strtof(line, NULL);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main() {
|
||||
struct pizza menu[MENU_SIZE];
|
||||
char search[LINESIZE];
|
||||
int count = 0;
|
||||
|
||||
printf("Zadaj hladanu surovinu:\n");
|
||||
if (!fgets(search, LINESIZE, stdin)) {
|
||||
return 1;
|
||||
}
|
||||
search[strcspn(search, "\n")] = '\0';
|
||||
|
||||
printf("Zadaj jedalny listok:\n");
|
||||
while (count < MENU_SIZE && read_pizza(&menu[count])) {
|
||||
count++;
|
||||
}
|
||||
|
||||
int found_count = 0;
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (contains_normalized(menu[i].name, search)) {
|
||||
printf("%s\n%.2f\n", menu[i].name, menu[i].price);
|
||||
found_count++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
printf("Nacitanych %d poloziek.\n", count);
|
||||
return 0;
|
||||
}
|
61
cv2/program.c
Normal file
61
cv2/program.c
Normal file
@ -0,0 +1,61 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_NAME_LENGTH 100
|
||||
#define MAX_ITEMS 100
|
||||
|
||||
typedef struct {
|
||||
char name[MAX_NAME_LENGTH];
|
||||
float price;
|
||||
} Pizza;
|
||||
|
||||
int compare(const void *a, const void *b) {
|
||||
Pizza *pizzaA = (Pizza *)a;
|
||||
Pizza *pizzaB = (Pizza *)b;
|
||||
|
||||
if (pizzaA->price != pizzaB->price) {
|
||||
return (pizzaA->price > pizzaB->price) - (pizzaA->price < pizzaB->price);
|
||||
}
|
||||
return strcasecmp(pizzaA->name, pizzaB->name);
|
||||
}
|
||||
|
||||
int read_pizza_list(Pizza *menu) {
|
||||
int count = 0;
|
||||
char input[MAX_NAME_LENGTH];
|
||||
|
||||
// Nacitame pizza
|
||||
while (count < MAX_ITEMS && fgets(input, sizeof(input), stdin)) {
|
||||
input[strcspn(input, "\n")] = 0; // Odstran znak noveho riadku
|
||||
|
||||
// Nacitame cenu pizze
|
||||
char price_str[10];
|
||||
if (fgets(price_str, sizeof(price_str), stdin) == NULL) {
|
||||
break;
|
||||
}
|
||||
|
||||
float price = atof(price_str);
|
||||
if (price <= 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
strncpy(menu[count].name, input, MAX_NAME_LENGTH - 1);
|
||||
menu[count].price = price;
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
int main() {
|
||||
Pizza menu[MAX_ITEMS];
|
||||
|
||||
int item_count = read_pizza_list(menu);
|
||||
|
||||
qsort(menu, item_count, sizeof(Pizza), compare);
|
||||
|
||||
for (int i = 0; i < item_count; i++) {
|
||||
printf("%s\n%.6f\n", menu[i].name, menu[i].price);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
BIN
cv3/program
Executable file
BIN
cv3/program
Executable file
Binary file not shown.
105
cv3/program.c
Normal file
105
cv3/program.c
Normal file
@ -0,0 +1,105 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#define STACK_SIZE 10
|
||||
|
||||
struct stack {
|
||||
float values[STACK_SIZE];
|
||||
int size;
|
||||
};
|
||||
|
||||
void print_stack(struct stack* s) {
|
||||
for (int i = 0; i < s->size; i++) {
|
||||
printf("%.2f", s->values[i]);
|
||||
if (i < s->size - 1) {
|
||||
printf(" ");
|
||||
} else {
|
||||
printf(" ");
|
||||
}
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
void push_stack(struct stack* s, float value) {
|
||||
if (s->size >= STACK_SIZE) {
|
||||
printf("full stack\n");
|
||||
exit(0);
|
||||
}
|
||||
s->values[s->size++] = value;
|
||||
}
|
||||
|
||||
float pop_stack(struct stack* s) {
|
||||
if (s->size == 0) {
|
||||
printf("empty stack\n");
|
||||
exit(0);
|
||||
}
|
||||
return s->values[--s->size];
|
||||
}
|
||||
|
||||
int is_operator(char* input) {
|
||||
return (strcmp(input, "+") == 0 || strcmp(input, "-") == 0 ||
|
||||
strcmp(input, "*") == 0 || strcmp(input, "/") == 0);
|
||||
}
|
||||
|
||||
int is_valid_float(char* input) {
|
||||
char* endptr;
|
||||
strtod(input, &endptr);
|
||||
return *endptr == '\0';
|
||||
}
|
||||
|
||||
void perform_operation(struct stack* s, char* operator) {
|
||||
if (s->size < 2) {
|
||||
printf("not enough operands\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
float b = pop_stack(s);
|
||||
float a = pop_stack(s);
|
||||
float result;
|
||||
|
||||
if (strcmp(operator, "+") == 0) {
|
||||
result = a + b;
|
||||
} else if (strcmp(operator, "-") == 0) {
|
||||
result = a - b;
|
||||
} else if (strcmp(operator, "*") == 0) {
|
||||
result = a * b;
|
||||
} else if (strcmp(operator, "/") == 0) {
|
||||
if (b == 0) {
|
||||
printf("division by zero\n");
|
||||
exit(0);
|
||||
}
|
||||
result = a / b;
|
||||
} else {
|
||||
printf("Chyba: neplatna operacia\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
push_stack(s, result);
|
||||
}
|
||||
|
||||
int main() {
|
||||
char input[100];
|
||||
struct stack mystack;
|
||||
mystack.size = 0;
|
||||
|
||||
while (fgets(input, sizeof(input), stdin) != NULL) {
|
||||
input[strlen(input) - 1] = '\0';
|
||||
|
||||
if (is_valid_float(input)) {
|
||||
float value = atof(input);
|
||||
push_stack(&mystack, value);
|
||||
} else if (is_operator(input)) {
|
||||
perform_operation(&mystack, input);
|
||||
} else {
|
||||
printf("bad input\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
print_stack(&mystack);
|
||||
}
|
||||
|
||||
printf("no input\n");
|
||||
return 0;
|
||||
}
|
29
cv4/Makefile
Normal file
29
cv4/Makefile
Normal file
@ -0,0 +1,29 @@
|
||||
# Compiler and flags
|
||||
CC = gcc
|
||||
CFLAGS = -std=c99 -g -Wall
|
||||
|
||||
# Source files and object files
|
||||
SRCS = main.c a_train.c
|
||||
OBJS = $(SRCS:.c=.o)
|
||||
|
||||
# Target executable
|
||||
TARGET = main
|
||||
|
||||
# Default rule to build the executable
|
||||
all: $(TARGET)
|
||||
|
||||
# Rule to link object files and create the executable
|
||||
$(TARGET): $(OBJS)
|
||||
$(CC) $(OBJS) -o $(TARGET)
|
||||
|
||||
# Rule to compile .c files into .o files
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c $< -o $@
|
||||
|
||||
# Clean up generated files
|
||||
clean:
|
||||
rm -f $(OBJS) $(TARGET)
|
||||
|
||||
# Phony targets (targets that are not actual files)
|
||||
.PHONY: all clean
|
||||
|
70
cv4/a_train.c
Normal file
70
cv4/a_train.c
Normal file
@ -0,0 +1,70 @@
|
||||
#include "a_train.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
struct car* add_car(struct car* first, const char* target) {
|
||||
struct car* newcar = calloc(1, sizeof(struct car));
|
||||
strcpy(newcar->value, target);
|
||||
newcar->next = NULL;
|
||||
|
||||
if (first == NULL) {
|
||||
first = newcar;
|
||||
} else {
|
||||
struct car* current = first;
|
||||
while (current->next != NULL) {
|
||||
current = current->next;
|
||||
}
|
||||
current->next = newcar;
|
||||
}
|
||||
|
||||
return first;
|
||||
}
|
||||
|
||||
void print_train(struct car* first) {
|
||||
if(first != NULL){
|
||||
struct car* current = first;
|
||||
while(current != NULL){
|
||||
printf("%s\n", current->value);
|
||||
current = current->next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cancel_train(struct car* first) {
|
||||
struct car* current = first;
|
||||
while(first != NULL){
|
||||
current = current->next;
|
||||
free(first);
|
||||
first = current;
|
||||
}
|
||||
}
|
||||
|
||||
struct car* clear_train(struct car* first, const char* target) {
|
||||
if (first == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct car* current = first;
|
||||
struct car* previous = NULL;
|
||||
|
||||
while (current != NULL && strcmp(current->value, target) == 0) {
|
||||
struct car* temp = current;
|
||||
first = current->next;
|
||||
current = first;
|
||||
free(temp);
|
||||
}
|
||||
|
||||
while (current != NULL) {
|
||||
if (strcmp(current->value, target) == 0) {
|
||||
previous->next = current->next;
|
||||
free(current);
|
||||
current = previous->next;
|
||||
} else {
|
||||
previous = current;
|
||||
current = current->next;
|
||||
}
|
||||
}
|
||||
|
||||
return first;
|
||||
}
|
51
cv4/a_train.h
Normal file
51
cv4/a_train.h
Normal file
@ -0,0 +1,51 @@
|
||||
#ifndef TRAIN_H
|
||||
#define TRAIN_H
|
||||
#define SIZE 100
|
||||
|
||||
/**
|
||||
* Jeden vozen vlaku
|
||||
*/
|
||||
struct car {
|
||||
/**
|
||||
* Nazov cielovej stanice
|
||||
*/
|
||||
char value[SIZE];
|
||||
/**
|
||||
* Smenik na dalsi vozen
|
||||
*/
|
||||
struct car* next;
|
||||
};
|
||||
|
||||
/**
|
||||
* Prida vozen na koniec vlaku.
|
||||
*
|
||||
* @arg nazov cielovej stanice, ktory sa ma priradit novemu voznu.
|
||||
* @return smernik na zaciatok vlaku.
|
||||
*/
|
||||
struct car* add_car(struct car* first,const char* target);
|
||||
|
||||
|
||||
/**
|
||||
* Vypise vsetky vozne vo vlaku
|
||||
*
|
||||
* @arg smernik na prvy vozen
|
||||
*/
|
||||
void print_train(struct car* first);
|
||||
|
||||
/**
|
||||
* Zrusenie vsetkych voznov vo vlaku.
|
||||
* @arg smernik na prvy vozen
|
||||
*/
|
||||
void cancel_train(struct car* first);
|
||||
|
||||
/**
|
||||
* Vyradenie vsetkych voznov, ktorych cielova stanica je target
|
||||
*
|
||||
* @arg smernik na prvy vozen
|
||||
* @arg cielova stanica, ktora sa ma vyradit z vlaku.
|
||||
* @return smernik na novy prvy vozen
|
||||
*
|
||||
*/
|
||||
struct car* clear_train(struct car* first,const char* target);
|
||||
|
||||
#endif // TRAIN_H
|
85
cv4/main.c
Normal file
85
cv4/main.c
Normal file
@ -0,0 +1,85 @@
|
||||
#include "a_train.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int main() {
|
||||
struct car* train = NULL;
|
||||
int choice;
|
||||
char station[100];
|
||||
|
||||
while (1) {
|
||||
printf("\nMenu:\n");
|
||||
printf("1. Add station\n");
|
||||
printf("2. Remove a station\n");
|
||||
printf("3. Print route\n");
|
||||
printf("4. Cancel train\n");
|
||||
printf("5. Exit\n");
|
||||
printf("Enter your choice: ");
|
||||
scanf("%d", &choice);
|
||||
getchar();
|
||||
|
||||
switch(choice) {
|
||||
case 1:
|
||||
while (1) {
|
||||
printf("Enter the station name to add (or press Enter to stop): ");
|
||||
fgets(station, sizeof(station), stdin);
|
||||
station[strcspn(station, "\n")] = '\0'; // Remove newline character
|
||||
|
||||
if (station[0] == '\0') {
|
||||
break; // Exit the loop if input is empty
|
||||
}
|
||||
|
||||
train = add_car(train, station);
|
||||
printf("Station '%s' added to the train.\n", station);
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
while (1) {
|
||||
printf("Enter the station name to clear (or press Enter to stop): ");
|
||||
fgets(station, sizeof(station), stdin);
|
||||
station[strcspn(station, "\n")] = '\0'; // Remove newline character
|
||||
|
||||
if (station[0] == '\0') {
|
||||
break; // Exit the loop if input is empty
|
||||
}
|
||||
|
||||
struct car* temp = train;
|
||||
int found = 0;
|
||||
while (temp != NULL) {
|
||||
if (strcmp(temp->value, station) == 0) {
|
||||
found = 1;
|
||||
break;
|
||||
}
|
||||
temp = temp->next;
|
||||
}
|
||||
|
||||
if (found) {
|
||||
train = clear_train(train, station);
|
||||
printf("Station '%s' deleted from the train.\n", station);
|
||||
} else {
|
||||
printf("Station '%s' does not exist in the train.\n", station);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
printf("\nRoute List:\n");
|
||||
print_train(train);
|
||||
break;
|
||||
case 4:
|
||||
printf("\nCanceling the train...\n");
|
||||
cancel_train(train);
|
||||
train = NULL;
|
||||
break;
|
||||
case 5:
|
||||
printf("Exiting program...\n");
|
||||
cancel_train(train);
|
||||
return 0;
|
||||
default:
|
||||
printf("Invalid choice, please try again.\n");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
13
cv6/Makefile
Normal file
13
cv6/Makefile
Normal file
@ -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
|
||||
|
93
cv6/a_station.c
Normal file
93
cv6/a_station.c
Normal file
@ -0,0 +1,93 @@
|
||||
#include <stdio.h>
|
||||
#include "a_station.h"
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
struct station* create_station(){
|
||||
struct station* station = (struct station*)calloc(1,sizeof(struct station));
|
||||
station->tracks = (struct car**)calloc(STATION_SIZE, sizeof(struct car*));
|
||||
station->track_count = STATION_SIZE;
|
||||
return 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){
|
||||
size_t length = strlen(target);
|
||||
int sum = 0;
|
||||
for (size_t i = 0; i < length; i++) {
|
||||
sum += target[i];
|
||||
}
|
||||
return sum % station->track_count;
|
||||
}
|
||||
|
||||
void add_target_capacity(struct station* station,const char* target, int capacity){
|
||||
int track = select_track(station, target);
|
||||
struct car* current = station->tracks[track];
|
||||
|
||||
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 - 1);
|
||||
new_car->value[TARGET_SIZE - 1] = '\0';
|
||||
new_car->capacity = capacity;
|
||||
new_car->next = station->tracks[track];
|
||||
station->tracks[track] = new_car;
|
||||
}
|
||||
|
||||
int get_target_capacity(struct station* station, const char* target) {
|
||||
int track = select_track(station, target);
|
||||
struct car* current = station->tracks[track];
|
||||
|
||||
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
|
53
cv6/main.c
Normal file
53
cv6/main.c
Normal file
@ -0,0 +1,53 @@
|
||||
#include "a_station.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_INPUT 100
|
||||
|
||||
void test_station(struct station* station) {
|
||||
char station_name[MAX_INPUT];
|
||||
int capacity;
|
||||
|
||||
while (1) {
|
||||
printf("Enter station name and capacity (or 'exit' to stop):\n");
|
||||
printf("Station name: ");
|
||||
if (!fgets(station_name, MAX_INPUT, stdin)) break;
|
||||
|
||||
// Remove trailing newline
|
||||
station_name[strcspn(station_name, "\n")] = '\0';
|
||||
|
||||
if (strcmp(station_name, "exit") == 0) break;
|
||||
|
||||
printf("Capacity: ");
|
||||
if (scanf("%d", &capacity) != 1) {
|
||||
printf("Invalid input. Try again.\n");
|
||||
while (getchar() != '\n'); // Clear input buffer
|
||||
continue;
|
||||
}
|
||||
|
||||
// Clear input buffer
|
||||
while (getchar() != '\n');
|
||||
|
||||
add_target_capacity(station, station_name, capacity);
|
||||
|
||||
int track = select_track(station, station_name);
|
||||
printf("Track for %s: %d\n", station_name, track);
|
||||
|
||||
int current_capacity = get_target_capacity(station, station_name);
|
||||
printf("Current capacity to %s: %d\n\n", station_name, current_capacity);
|
||||
}
|
||||
|
||||
printf("Final Statistics:\n");
|
||||
printf("Total number of targets: %d\n", count_targets(station));
|
||||
printf("Total capacity: %d\n", count_capacity(station));
|
||||
}
|
||||
|
||||
int main() {
|
||||
struct station* station = create_station();
|
||||
test_station(station);
|
||||
destroy_station(station);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
109
cv7/program.c
Normal file
109
cv7/program.c
Normal file
@ -0,0 +1,109 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define SIZE 100
|
||||
|
||||
struct tree {
|
||||
char value[SIZE];
|
||||
struct tree* left;
|
||||
struct tree* right;
|
||||
};
|
||||
|
||||
struct tree* read_tree() {
|
||||
char buffer[SIZE];
|
||||
memset(buffer, 0, SIZE);
|
||||
char* r = fgets(buffer, SIZE, stdin);
|
||||
if (!r || buffer[0] == '\n') {
|
||||
return NULL;
|
||||
}
|
||||
buffer[strcspn(buffer, "\n")] = 0;
|
||||
struct tree* node = calloc(1, sizeof(struct tree));
|
||||
strncpy(node->value, buffer, SIZE - 1);
|
||||
return node;
|
||||
}
|
||||
|
||||
struct tree* load_tree() {
|
||||
struct tree* node = read_tree();
|
||||
if (!node) {
|
||||
return NULL;
|
||||
}
|
||||
if (node->value[0] != '*') {
|
||||
node->left = load_tree();
|
||||
node->right = load_tree();
|
||||
} else if (node->left != NULL || node->right != NULL) {
|
||||
printf("Chybna databaza\n");
|
||||
free(node);
|
||||
return NULL;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
void run_tree(struct tree* tree) {
|
||||
if (!tree) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (tree->value[0] == '*') {
|
||||
printf("*%s\nKoniec\n", tree->value + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
printf("%s\n", tree->value);
|
||||
|
||||
char response;
|
||||
if (scanf(" %c", &response) != 1) {
|
||||
printf("Koniec vstupu\n");
|
||||
return;
|
||||
} else if (response != 'a' && response != 'n') {
|
||||
printf("Nerozumiem\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (response == 'a') {
|
||||
run_tree(tree->left);
|
||||
} else {
|
||||
run_tree(tree->right);
|
||||
}
|
||||
}
|
||||
|
||||
void destroy_tree(struct tree* tree) {
|
||||
if (tree) {
|
||||
destroy_tree(tree->left);
|
||||
destroy_tree(tree->right);
|
||||
free(tree);
|
||||
}
|
||||
}
|
||||
|
||||
void count_items(struct tree* tree, int* count) {
|
||||
if (tree) {
|
||||
if (tree->left == NULL && tree->right == NULL) {
|
||||
(*count)++;
|
||||
} else {
|
||||
count_items(tree->left, count);
|
||||
count_items(tree->right, count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
struct tree* root = load_tree();
|
||||
|
||||
printf("Expert z bufetu to vie.\n");
|
||||
|
||||
if (!root) {
|
||||
printf("Chybna databaza\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int count = 0;
|
||||
count_items(root, &count);
|
||||
printf("Pozna %d druhov ovocia a zeleniny.\n", count);
|
||||
printf("Odpovedajte 'a' pre prvu moznost alebo 'n' pre druhu moznost.\n");
|
||||
|
||||
run_tree(root);
|
||||
|
||||
destroy_tree(root);
|
||||
return 0;
|
||||
}
|
18
sk1/Makefile
Normal file
18
sk1/Makefile
Normal file
@ -0,0 +1,18 @@
|
||||
CC = gcc
|
||||
CFLAGS = -Wall -Wextra -std=c11
|
||||
TARGET = compressor
|
||||
|
||||
all: $(TARGET)
|
||||
|
||||
$(TARGET): main.o compressor.o
|
||||
$(CC) $(CFLAGS) -o $(TARGET) main.o compressor.o
|
||||
|
||||
main.o: main.c compressor.h
|
||||
$(CC) $(CFLAGS) -c main.c
|
||||
|
||||
compressor.o: compressor.c compressor.h
|
||||
$(CC) $(CFLAGS) -c compressor.c
|
||||
|
||||
clean:
|
||||
rm -f *.o $(TARGET)
|
||||
|
11
sk1/compressed.txt
Normal file
11
sk1/compressed.txt
Normal file
@ -0,0 +1,11 @@
|
||||
0-A
|
||||
0-n
|
||||
0-t
|
||||
0-o
|
||||
2-
|
||||
0-K
|
||||
4-z
|
||||
0-a
|
||||
0-r
|
||||
0-
|
||||
|
BIN
sk1/compressor
Executable file
BIN
sk1/compressor
Executable file
Binary file not shown.
127
sk1/compressor.c
127
sk1/compressor.c
@ -1,43 +1,64 @@
|
||||
#include "compressor.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#define BUFFER_SIZE 1024
|
||||
#define LZ78_DICT_SIZE 256
|
||||
// Trie (prefix tree) structure for LZ78 compression
|
||||
struct dict {
|
||||
int index;
|
||||
struct dict* characters[LZ78_DICT_SIZE];
|
||||
};
|
||||
|
||||
// Function prototypes
|
||||
int compress(const char* input_file_name, const char* output_file_name);
|
||||
int decompress(const char* input_file_name, const char* output_file_name);
|
||||
void lz78_compress(FILE* in, FILE* out);
|
||||
void lz78_decompress(FILE* in, FILE* out);
|
||||
|
||||
void print_usage() {
|
||||
printf("Usage:\n");
|
||||
printf(" ./compressor -c infile outfile Compress infile into outfile\n");
|
||||
printf(" ./compressor -d compressed uncompressed Decompress compressed into uncompressed\n");
|
||||
// Free the dictionary trie
|
||||
void delete_dict(struct dict* tree) {
|
||||
if (!tree) {
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < LZ78_DICT_SIZE; i++) {
|
||||
delete_dict(tree->characters[i]);
|
||||
}
|
||||
free(tree);
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc != 4) {
|
||||
print_usage();
|
||||
return 1;
|
||||
// LZ78 Compression
|
||||
void lz78_compress(FILE* in, FILE* out) {
|
||||
struct dict* root = calloc(1, sizeof(struct dict));
|
||||
struct dict* current = root;
|
||||
int index = 1;
|
||||
int c;
|
||||
|
||||
while ((c = fgetc(in)) != EOF) {
|
||||
if (current->characters[c]) {
|
||||
current = current->characters[c];
|
||||
} else {
|
||||
current->characters[c] = calloc(1, sizeof(struct dict));
|
||||
current->characters[c]->index = index++;
|
||||
fprintf(out, "%d-%c\n", current->index, c);
|
||||
current = root;
|
||||
}
|
||||
}
|
||||
|
||||
const char* mode = argv[1];
|
||||
const char* infile = argv[2];
|
||||
const char* outfile = argv[3];
|
||||
delete_dict(root);
|
||||
}
|
||||
|
||||
if (strcmp(mode, "-c") == 0) {
|
||||
return compress(infile, outfile);
|
||||
} else if (strcmp(mode, "-d") == 0) {
|
||||
return decompress(infile, outfile);
|
||||
} else {
|
||||
print_usage();
|
||||
return 1;
|
||||
// LZ78 Decompression
|
||||
void lz78_decompress(FILE* in, FILE* out) {
|
||||
char buffer[LZ78_DICT_SIZE][BUFFER_SIZE] = {""};
|
||||
int index, dict_index = 1;
|
||||
char c;
|
||||
|
||||
while (fscanf(in, "%d-%c\n", &index, &c) == 2) {
|
||||
if (index > 0) {
|
||||
fprintf(out, "%s", buffer[index]);
|
||||
}
|
||||
fputc(c, out);
|
||||
snprintf(buffer[dict_index], BUFFER_SIZE, "%s%c", buffer[index], c);
|
||||
dict_index++;
|
||||
}
|
||||
}
|
||||
|
||||
// Compress function
|
||||
int compress(const char* input_file_name, const char* output_file_name) {
|
||||
FILE* input_file = fopen(input_file_name, "rb");
|
||||
if (!input_file) {
|
||||
@ -61,6 +82,7 @@ int compress(const char* input_file_name, const char* output_file_name) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Decompress function
|
||||
int decompress(const char* input_file_name, const char* output_file_name) {
|
||||
FILE* input_file = fopen(input_file_name, "rb");
|
||||
if (!input_file) {
|
||||
@ -84,54 +106,3 @@ int decompress(const char* input_file_name, const char* output_file_name) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// LZ78 compression
|
||||
struct dict {
|
||||
int index;
|
||||
struct dict* characters[LZ78_DICT_SIZE];
|
||||
};
|
||||
|
||||
void delete_dict(struct dict* tree) {
|
||||
if (!tree) {
|
||||
return;
|
||||
}
|
||||
for (int i = 0; i < LZ78_DICT_SIZE; i++) {
|
||||
delete_dict(tree->characters[i]);
|
||||
}
|
||||
free(tree);
|
||||
}
|
||||
|
||||
void lz78_compress(FILE* in, FILE* out) {
|
||||
struct dict* root = calloc(1, sizeof(struct dict));
|
||||
struct dict* current = root;
|
||||
int index = 1;
|
||||
int c;
|
||||
|
||||
while ((c = fgetc(in)) != EOF) {
|
||||
if (current->characters[c]) {
|
||||
current = current->characters[c];
|
||||
} else {
|
||||
current->characters[c] = calloc(1, sizeof(struct dict));
|
||||
current->characters[c]->index = index++;
|
||||
fprintf(out, "%d-%c\n", current->index, c);
|
||||
current = root;
|
||||
}
|
||||
}
|
||||
|
||||
delete_dict(root);
|
||||
}
|
||||
|
||||
// LZ78 decompression
|
||||
void lz78_decompress(FILE* in, FILE* out) {
|
||||
char buffer[LZ78_DICT_SIZE][BUFFER_SIZE] = {""};
|
||||
int index;
|
||||
char c;
|
||||
|
||||
while (fscanf(in, "%d-%c\n", &index, &c) == 2) {
|
||||
if (index > 0) {
|
||||
fprintf(out, "%s", buffer[index]);
|
||||
}
|
||||
fputc(c, out);
|
||||
snprintf(buffer[index], BUFFER_SIZE, "%s%c", buffer[index], c);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8,4 +8,3 @@ int compress(const char* input_file_name, const char* output_file_name);
|
||||
int decompress(const char* input_file_name, const char* output_file_name);
|
||||
|
||||
#endif // COMPRESSOR_H
|
||||
|
||||
|
BIN
sk1/compressor.o
Normal file
BIN
sk1/compressor.o
Normal file
Binary file not shown.
1
sk1/input.txt
Normal file
1
sk1/input.txt
Normal file
@ -0,0 +1 @@
|
||||
Anton Kozar
|
30
sk1/main.c
Normal file
30
sk1/main.c
Normal file
@ -0,0 +1,30 @@
|
||||
#include "compressor.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
void print_usage() {
|
||||
printf("Usage:\n");
|
||||
printf(" ./compressor -c infile outfile Compress infile into outfile\n");
|
||||
printf(" ./compressor -d compressed uncompressed Decompress compressed into uncompressed\n");
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[]) {
|
||||
if (argc != 4) {
|
||||
print_usage();
|
||||
return 1;
|
||||
}
|
||||
|
||||
const char* mode = argv[1];
|
||||
const char* infile = argv[2];
|
||||
const char* outfile = argv[3];
|
||||
|
||||
if (strcmp(mode, "-c") == 0) {
|
||||
return compress(infile, outfile);
|
||||
} else if (strcmp(mode, "-d") == 0) {
|
||||
return decompress(infile, outfile);
|
||||
} else {
|
||||
print_usage();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
BIN
sk1/main.o
Normal file
BIN
sk1/main.o
Normal file
Binary file not shown.
1
sk1/output.txt
Normal file
1
sk1/output.txt
Normal file
@ -0,0 +1 @@
|
||||
Anton Kozar
|
Loading…
Reference in New Issue
Block a user