Обновить du3/program.c
This commit is contained in:
		
							parent
							
								
									f855b9081c
								
							
						
					
					
						commit
						848580647e
					
				
							
								
								
									
										207
									
								
								du3/program.c
									
									
									
									
									
								
							
							
						
						
									
										207
									
								
								du3/program.c
									
									
									
									
									
								
							@ -1,112 +1,143 @@
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <math.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
 | 
			
		||||
#define EPSILON 0.001
 | 
			
		||||
#define BUFFER_SIZE 100
 | 
			
		||||
#define EPSILON 0.001 
 | 
			
		||||
 | 
			
		||||
// Функция вычисления результата
 | 
			
		||||
float vypocitaj(float a, float b, char op, int* error) {
 | 
			
		||||
    if (op == '+') return a + b;
 | 
			
		||||
    if (op == '-') return a - b;
 | 
			
		||||
    if (op == '*') return a * b;
 | 
			
		||||
    if (op == '/') {
 | 
			
		||||
        if (b == 0) {
 | 
			
		||||
            *error = 1; // Ошибка: деление на ноль
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        return a / b;
 | 
			
		||||
    }
 | 
			
		||||
    *error = 1; // Ошибка: некорректный оператор
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Функция проверки результата
 | 
			
		||||
void over_vysledok(float skutocny, float ocakavany) {
 | 
			
		||||
    if (abs(skutocny - ocakavany) <= EPSILON) {
 | 
			
		||||
        printf("OK\n");
 | 
			
		||||
    } else {
 | 
			
		||||
        printf("ZLE\n");
 | 
			
		||||
void trim_newline(char *line) {
 | 
			
		||||
    size_t len = strlen(line);
 | 
			
		||||
    if (len > 0 && line[len - 1] == '\n') {
 | 
			
		||||
        line[len - 1] = '\0';
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Функция обработки одной строки
 | 
			
		||||
void spracuj_riadok(char* riadok) {
 | 
			
		||||
    char* zaciatok = riadok;
 | 
			
		||||
    char* koniec;
 | 
			
		||||
char* skip_spaces(char *str) {
 | 
			
		||||
    while (*str && isspace((unsigned char)*str)) {
 | 
			
		||||
        str++;
 | 
			
		||||
    }
 | 
			
		||||
    return str;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int parse_expression(char *line, float *num1, char *op, float *num2, float *result) {
 | 
			
		||||
    char *ptr = line;
 | 
			
		||||
    
 | 
			
		||||
    // Читаем первое число
 | 
			
		||||
    float a = strtof(zaciatok, &koniec);
 | 
			
		||||
    if (zaciatok == koniec) {
 | 
			
		||||
        printf("CHYBA\n");
 | 
			
		||||
        return;
 | 
			
		||||
    ptr = skip_spaces(ptr);
 | 
			
		||||
    char *endPtr;
 | 
			
		||||
    *num1 = strtof(ptr, &endPtr);
 | 
			
		||||
    if (ptr == endPtr) {
 | 
			
		||||
        return 1; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Пропускаем пробелы перед оператором
 | 
			
		||||
    while (*koniec == ' ') koniec++;
 | 
			
		||||
 | 
			
		||||
    // Читаем оператор
 | 
			
		||||
    char op = *koniec;
 | 
			
		||||
    if (op != '+' && op != '-' && op != '*' && op != '/') {
 | 
			
		||||
        printf("CHYBA\n");
 | 
			
		||||
        return;
 | 
			
		||||
    ptr = endPtr;
 | 
			
		||||
    
 | 
			
		||||
    ptr = skip_spaces(ptr);
 | 
			
		||||
    if (*ptr == '\0') return 1;
 | 
			
		||||
    *op = *ptr;
 | 
			
		||||
    if (*op != '+' && *op != '-' && *op != '*' && *op != '/') {
 | 
			
		||||
        return 1; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Двигаем указатель дальше
 | 
			
		||||
    koniec++;
 | 
			
		||||
    while (*koniec == ' ') koniec++;
 | 
			
		||||
 | 
			
		||||
    // Читаем второе число
 | 
			
		||||
    float b = strtof(koniec, &koniec);
 | 
			
		||||
    if (koniec == zaciatok) {
 | 
			
		||||
        printf("CHYBA\n");
 | 
			
		||||
        return;
 | 
			
		||||
    ptr++;
 | 
			
		||||
    
 | 
			
		||||
    ptr = skip_spaces(ptr);
 | 
			
		||||
    *num2 = strtof(ptr, &endPtr);
 | 
			
		||||
    if (ptr == endPtr) {
 | 
			
		||||
        return 1; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Пропускаем пробелы перед знаком "="
 | 
			
		||||
    while (*koniec == ' ') koniec++;
 | 
			
		||||
    if (*koniec != '=') {
 | 
			
		||||
        printf("CHYBA\n");
 | 
			
		||||
        return;
 | 
			
		||||
    ptr = endPtr;
 | 
			
		||||
    
 | 
			
		||||
    ptr = skip_spaces(ptr);
 | 
			
		||||
    if (*ptr != '=') {
 | 
			
		||||
        return 1; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Двигаем указатель дальше
 | 
			
		||||
    koniec++;
 | 
			
		||||
    while (*koniec == ' ') koniec++;
 | 
			
		||||
 | 
			
		||||
    // Читаем результат
 | 
			
		||||
    float vysledok = strtof(koniec, &koniec);
 | 
			
		||||
    if (koniec == zaciatok) {
 | 
			
		||||
        printf("CHYBA\n");
 | 
			
		||||
        return;
 | 
			
		||||
    ptr++; 
 | 
			
		||||
    
 | 
			
		||||
    ptr = skip_spaces(ptr);
 | 
			
		||||
    *result = strtof(ptr, &endPtr);
 | 
			
		||||
    if (ptr == endPtr) {
 | 
			
		||||
        return 1;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Вычисляем реальный результат
 | 
			
		||||
    int error = 0;
 | 
			
		||||
    float skutocny = vypocitaj(a, b, op, &error);
 | 
			
		||||
    if (error) {
 | 
			
		||||
        printf("CHYBA\n");
 | 
			
		||||
        return;
 | 
			
		||||
    ptr = endPtr;
 | 
			
		||||
    
 | 
			
		||||
    ptr = skip_spaces(ptr);
 | 
			
		||||
    if (*ptr != '\0') {
 | 
			
		||||
        return 1; 
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Проверяем правильность ответа
 | 
			
		||||
    over_vysledok(skutocny, vysledok);
 | 
			
		||||
    
 | 
			
		||||
    return 0; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main() {
 | 
			
		||||
    char buffer[BUFFER_SIZE];
 | 
			
		||||
 | 
			
		||||
    while (1) {
 | 
			
		||||
        printf("Zadajte priklad:\n");
 | 
			
		||||
float calculate(float num1, char op, float num2, int *error) {
 | 
			
		||||
    *error = 0;
 | 
			
		||||
    float res;
 | 
			
		||||
    switch(op) {
 | 
			
		||||
        case '+':
 | 
			
		||||
            res = num1 + num2;
 | 
			
		||||
            break;
 | 
			
		||||
        case '-':
 | 
			
		||||
            res = num1 - num2;
 | 
			
		||||
            break;
 | 
			
		||||
        case '*':
 | 
			
		||||
            res = num1 * num2;
 | 
			
		||||
            break;
 | 
			
		||||
        case '/':
 | 
			
		||||
            if (fabs(num2) < EPSILON) {
 | 
			
		||||
                *error = 1;  
 | 
			
		||||
                return 0;
 | 
			
		||||
            }
 | 
			
		||||
            res = num1 / num2;
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            *error = 1;
 | 
			
		||||
            return 0;
 | 
			
		||||
    }
 | 
			
		||||
    return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
        if (!fgets(buffer, sizeof(buffer), stdin)) break; // Проверяем конец ввода
 | 
			
		||||
        if (buffer[0] == '\n') {
 | 
			
		||||
            printf("KONIEC\n");
 | 
			
		||||
 | 
			
		||||
void process_line(const char *line, char *output, size_t output_size) {
 | 
			
		||||
    char buffer[256];
 | 
			
		||||
    strncpy(buffer, line, 255);
 | 
			
		||||
    buffer[255] = '\0'; 
 | 
			
		||||
    trim_newline(buffer);
 | 
			
		||||
    
 | 
			
		||||
    float num1, num2, givenResult;
 | 
			
		||||
    char op;
 | 
			
		||||
    if (parse_expression(buffer, &num1, &op, &num2, &givenResult) != 0) {
 | 
			
		||||
        snprintf(output, output_size, "CHYBA");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    int calcError = 0;
 | 
			
		||||
    float calculatedResult = calculate(num1, op, num2, &calcError);
 | 
			
		||||
    if (calcError) {
 | 
			
		||||
        snprintf(output, output_size, "ZLE");
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    float roundedResult = round(calculatedResult * 100) / 100;
 | 
			
		||||
    
 | 
			
		||||
    if (fabs(roundedResult - givenResult) <= EPSILON) {
 | 
			
		||||
        snprintf(output, output_size, "OK");
 | 
			
		||||
    } else {
 | 
			
		||||
        snprintf(output, output_size, "ZLE");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int main(int argc, char *argv[]) {
 | 
			
		||||
    char buffer[256];
 | 
			
		||||
    char output[32];
 | 
			
		||||
    
 | 
			
		||||
    while (fgets(buffer, sizeof(buffer), stdin) != NULL) {
 | 
			
		||||
        trim_newline(buffer);
 | 
			
		||||
        if (*skip_spaces(buffer) == '\0') {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        spracuj_riadok(buffer);
 | 
			
		||||
        process_line(buffer, output, sizeof(output));
 | 
			
		||||
        printf("%s\n", output);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user