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