Обновить du3/program.c

This commit is contained in:
Bohdana Marchenko 2025-03-27 00:19:54 +00:00
parent 345841f302
commit b84499a326

View File

@ -4,15 +4,16 @@
#include <math.h> #include <math.h>
#include <ctype.h> #include <ctype.h>
#define EPSILON 0.001 #define EPSILON 0.001 //Dopustiteľná chyba pri porovnávaní čísel
void trim_newline(char *line) { void trim_newline(char *line) { //Funkcia odstráni znak nového riadku '\n' na konci
size_t len = strlen(line); size_t len = strlen(line); //Získame dĺžku reťazca
if (len > 0 && line[len - 1] == '\n') { if (len > 0 && line[len - 1] == '\n') {
line[len - 1] = '\0'; line[len - 1] = '\0';
} }
} }
//funkcia na odstranenie medzery na začiatku reťazca
char* skip_spaces(char *str) { char* skip_spaces(char *str) {
while (*str && isspace((unsigned char)*str)) { while (*str && isspace((unsigned char)*str)) {
str++; str++;
@ -20,27 +21,28 @@ char* skip_spaces(char *str) {
return str; return str;
} }
//Analyzuje reťazec s matematickým výrazom
int parse_expression(char *line, float *num1, char *op, float *num2, float *result) { 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); ptr = skip_spaces(ptr);
char *endPtr; char *endPtr; //Uloženie smernika na ten znak, na ktorom sa funkcia zastavila
*num1 = strtof(ptr, &endPtr); *num1 = strtof(ptr, &endPtr); //Čítame prvé číslo
if (ptr == endPtr) { if (ptr == endPtr) { //z reťazca sa nepodarilo prečítať číslo
return 1; return 1;
} }
ptr = endPtr; ptr = endPtr; //Ukazuje na prvý znak po čísle, ktoré bolo úspešne prečítané
ptr = skip_spaces(ptr); ptr = skip_spaces(ptr);
if (*ptr == '\0') return 1; if (*ptr == '\0') return 1;
*op = *ptr; *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; return 1;
} }
ptr++; ptr++;
ptr = skip_spaces(ptr); ptr = skip_spaces(ptr);
*num2 = strtof(ptr, &endPtr); *num2 = strtof(ptr, &endPtr);//Čítame druhé číslo
if (ptr == endPtr) { if (ptr == endPtr) {
return 1; return 1;
} }
@ -67,10 +69,10 @@ int parse_expression(char *line, float *num1, char *op, float *num2, float *resu
return 0; return 0;
} }
//Vykonanie matematickej operácie na dvoch číslach
float calculate(float num1, char op, float num2, int *error) { float calculate(float num1, char op, float num2, int *error) {
*error = 0; *error = 0;
float res; float res; //výsledok výpočtov
switch(op) { switch(op) {
case '+': case '+':
res = num1 + num2; res = num1 + num2;
@ -82,7 +84,7 @@ float calculate(float num1, char op, float num2, int *error) {
res = num1 * num2; res = num1 * num2;
break; break;
case '/': case '/':
if (fabs(num2) < EPSILON) { if (fabs(num2) < EPSILON) { //Kontrola na delenie nulou
*error = 1; *error = 1;
return 0; return 0;
} }
@ -95,10 +97,10 @@ float calculate(float num1, char op, float num2, int *error) {
return res; 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) { void process_line(const char *line, char *output, size_t output_size) {
char buffer[256]; 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'; buffer[255] = '\0';
trim_newline(buffer); trim_newline(buffer);
@ -109,16 +111,16 @@ void process_line(const char *line, char *output, size_t output_size) {
return; return;
} }
int calcError = 0; int calcError = 0; //Premenná na sledovanie chýb pri výpočtoch.
float calculatedResult = calculate(num1, op, num2, &calcError); float calculatedResult = calculate(num1, op, num2, &calcError); //Vykonáva matematickú operáciu s číslami
if (calcError) { if (calcError) { //Ak došlo k chybe (napríklad delenie nulou), potom\/
snprintf(output, output_size, "ZLE"); snprintf(output, output_size, "ZLE");
return; 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"); snprintf(output, output_size, "OK");
} else { } else {
snprintf(output, output_size, "ZLE"); 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[]) { int main(int argc, char *argv[]) {
char buffer[256]; 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); 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; break;
} }
process_line(buffer, output, sizeof(output)); process_line(buffer, output, sizeof(output));