diff --git a/du3/program.c b/du3/program.c index 546a0e2..2972a92 100644 --- a/du3/program.c +++ b/du3/program.c @@ -4,15 +4,16 @@ #include #include -#define EPSILON 0.001 +#define EPSILON 0.001 //Dopustiteľná chyba pri porovnávaní čísel -void trim_newline(char *line) { - size_t len = strlen(line); +void trim_newline(char *line) { //Funkcia odstráni znak nového riadku '\n' na konci + size_t len = strlen(line); //Získame dĺžku reťazca if (len > 0 && line[len - 1] == '\n') { line[len - 1] = '\0'; } } +//funkcia na odstranenie medzery na začiatku reťazca char* skip_spaces(char *str) { while (*str && isspace((unsigned char)*str)) { str++; @@ -20,27 +21,28 @@ char* skip_spaces(char *str) { return str; } +//Analyzuje reťazec s matematickým výrazom int parse_expression(char *line, float *num1, char *op, float *num2, float *result) { - char *ptr = line; + char *ptr = line; //smernik `ptr` ukazuje na prvý znak reťazca `line` ptr = skip_spaces(ptr); - char *endPtr; - *num1 = strtof(ptr, &endPtr); - if (ptr == endPtr) { + char *endPtr; //Uloženie smernika na ten znak, na ktorom sa funkcia zastavila + *num1 = strtof(ptr, &endPtr); //Čítame prvé číslo + if (ptr == endPtr) { //z reťazca sa nepodarilo prečítať číslo return 1; } - ptr = endPtr; + ptr = endPtr; //Ukazuje na prvý znak po čísle, ktoré bolo úspešne prečítané ptr = skip_spaces(ptr); if (*ptr == '\0') return 1; *op = *ptr; - if (*op != '+' && *op != '-' && *op != '*' && *op != '/') { + if (*op != '+' && *op != '-' && *op != '*' && *op != '/') { //Kontroluje, či je znak, uložený v premennej `op`, jedným z povolených operátorov return 1; } ptr++; ptr = skip_spaces(ptr); - *num2 = strtof(ptr, &endPtr); + *num2 = strtof(ptr, &endPtr);//Čítame druhé číslo if (ptr == endPtr) { return 1; } @@ -67,10 +69,10 @@ int parse_expression(char *line, float *num1, char *op, float *num2, float *resu return 0; } - +//Vykonanie matematickej operácie na dvoch číslach float calculate(float num1, char op, float num2, int *error) { *error = 0; - float res; + float res; //výsledok výpočtov switch(op) { case '+': res = num1 + num2; @@ -82,7 +84,7 @@ float calculate(float num1, char op, float num2, int *error) { res = num1 * num2; break; case '/': - if (fabs(num2) < EPSILON) { + if (fabs(num2) < EPSILON) { //Kontrola na delenie nulou *error = 1; return 0; } @@ -95,10 +97,10 @@ float calculate(float num1, char op, float num2, int *error) { return res; } - +//Svykoná výpočty a výsledok zapíše v "output" void process_line(const char *line, char *output, size_t output_size) { char buffer[256]; - strncpy(buffer, line, 255); + strncpy(buffer, line, 255); //Kopírovanie až 255 znakov z reťazca `line` do `buffer` buffer[255] = '\0'; trim_newline(buffer); @@ -109,16 +111,16 @@ void process_line(const char *line, char *output, size_t output_size) { return; } - int calcError = 0; - float calculatedResult = calculate(num1, op, num2, &calcError); - if (calcError) { + int calcError = 0; //Premenná na sledovanie chýb pri výpočtoch. + float calculatedResult = calculate(num1, op, num2, &calcError); //Vykonáva matematickú operáciu s číslami + if (calcError) { //Ak došlo k chybe (napríklad delenie nulou), potom\/ snprintf(output, output_size, "ZLE"); return; } - float roundedResult = round(calculatedResult * 100) / 100; + float roundedResult = round(calculatedResult * 100) / 100; // sa zaokrúhľuje na dve desatinné miesta - if (fabs(roundedResult - givenResult) <= EPSILON) { + if (fabs(roundedResult - givenResult) <= EPSILON) { //výpočet absolútnej hodnoty rozdielu medzi čislami snprintf(output, output_size, "OK"); } else { snprintf(output, output_size, "ZLE"); @@ -128,11 +130,11 @@ void process_line(const char *line, char *output, size_t output_size) { int main(int argc, char *argv[]) { char buffer[256]; - char output[32]; + char output[32]; //Pre uloženie výsledkov práce funkcie process_line - while (fgets(buffer, sizeof(buffer), stdin) != NULL) { + while (fgets(buffer, sizeof(buffer), stdin) != NULL) { //číta reťazec zo štandardného vstupu (stdin) a ukladá ho do poľa buffer trim_newline(buffer); - if (*skip_spaces(buffer) == '\0') { + if (*skip_spaces(buffer) == '\0') { //Ak po preskočení medzier v reťazci už nie sú žiadne znaky, ukončime break; } process_line(buffer, output, sizeof(output));