Обновить du3/program.c
This commit is contained in:
parent
345841f302
commit
b84499a326
@ -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));
|
||||||
|
Loading…
Reference in New Issue
Block a user