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

This commit is contained in:
Bohdana Marchenko 2025-03-12 20:00:10 +00:00
parent f855b9081c
commit 848580647e

View File

@ -1,112 +1,143 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <math.h>
#include <ctype.h>
#define EPSILON 0.001 #define EPSILON 0.001
#define BUFFER_SIZE 100
// Функция вычисления результата void trim_newline(char *line) {
float vypocitaj(float a, float b, char op, int* error) { size_t len = strlen(line);
if (op == '+') return a + b; if (len > 0 && line[len - 1] == '\n') {
if (op == '-') return a - b; line[len - 1] = '\0';
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");
} }
} }
// Функция обработки одной строки char* skip_spaces(char *str) {
void spracuj_riadok(char* riadok) { while (*str && isspace((unsigned char)*str)) {
char* zaciatok = riadok; str++;
char* koniec; }
return str;
}
int parse_expression(char *line, float *num1, char *op, float *num2, float *result) {
char *ptr = line;
// Читаем первое число ptr = skip_spaces(ptr);
float a = strtof(zaciatok, &koniec); char *endPtr;
if (zaciatok == koniec) { *num1 = strtof(ptr, &endPtr);
printf("CHYBA\n"); if (ptr == endPtr) {
return; return 1;
} }
ptr = endPtr;
// Пропускаем пробелы перед оператором
while (*koniec == ' ') koniec++; ptr = skip_spaces(ptr);
if (*ptr == '\0') return 1;
// Читаем оператор *op = *ptr;
char op = *koniec; if (*op != '+' && *op != '-' && *op != '*' && *op != '/') {
if (op != '+' && op != '-' && op != '*' && op != '/') { return 1;
printf("CHYBA\n");
return;
} }
ptr++;
// Двигаем указатель дальше
koniec++; ptr = skip_spaces(ptr);
while (*koniec == ' ') koniec++; *num2 = strtof(ptr, &endPtr);
if (ptr == endPtr) {
// Читаем второе число return 1;
float b = strtof(koniec, &koniec);
if (koniec == zaciatok) {
printf("CHYBA\n");
return;
} }
ptr = endPtr;
// Пропускаем пробелы перед знаком "="
while (*koniec == ' ') koniec++; ptr = skip_spaces(ptr);
if (*koniec != '=') { if (*ptr != '=') {
printf("CHYBA\n"); return 1;
return;
} }
ptr++;
// Двигаем указатель дальше
koniec++; ptr = skip_spaces(ptr);
while (*koniec == ' ') koniec++; *result = strtof(ptr, &endPtr);
if (ptr == endPtr) {
// Читаем результат return 1;
float vysledok = strtof(koniec, &koniec);
if (koniec == zaciatok) {
printf("CHYBA\n");
return;
} }
ptr = endPtr;
// Вычисляем реальный результат
int error = 0; ptr = skip_spaces(ptr);
float skutocny = vypocitaj(a, b, op, &error); if (*ptr != '\0') {
if (error) { return 1;
printf("CHYBA\n");
return;
} }
// Проверяем правильность ответа return 0;
over_vysledok(skutocny, vysledok);
} }
int main() {
char buffer[BUFFER_SIZE];
while (1) { float calculate(float num1, char op, float num2, int *error) {
printf("Zadajte priklad:\n"); *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') { void process_line(const char *line, char *output, size_t output_size) {
printf("KONIEC\n"); 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; break;
} }
process_line(buffer, output, sizeof(output));
spracuj_riadok(buffer); printf("%s\n", output);
} }
return 0; return 0;
} }