Обновить 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 <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;
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user