pvjc26/du3/program.c
2026-03-18 09:08:28 +01:00

118 lines
2.9 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define LINE_SIZE 256
void preskoc_medzery(char** p) {
while (**p == ' ') {
*p += 1;
}
}
float zaokruhli(float x) {
return roundf(x * 100.0f) / 100.0f;
}
int su_rovnake(float a, float b) {
float rozdiel = a - b;
return (rozdiel < 0.001f && rozdiel > -0.001f);
}
void vypis_statistiku(int ok, int zle, int chyba) {
int spolu = ok + zle + chyba;
fprintf(stderr, "-------------------\n");
fprintf(stderr, "Spolu: %d prikladov\n", spolu);
fprintf(stderr, "OK: %d\n", ok);
fprintf(stderr, "ZLE: %d\n", zle);
fprintf(stderr, "CHYBA: %d\n", chyba);
}
int main(void) {
char riadok[LINE_SIZE];
int pocet_ok = 0;
int pocet_zle = 0;
int pocet_chyba = 0;
while (1) {
memset(riadok, 0, LINE_SIZE);
char* r = fgets(riadok, LINE_SIZE, stdin);
if (r == NULL) {
vypis_statistiku(pocet_ok, pocet_zle, pocet_chyba);
break;
}
if (riadok[0] == '\n' || riadok[0] == '\0') {
vypis_statistiku(pocet_ok, pocet_zle, pocet_chyba);
break;
}
char* p = riadok;
char* koniec = NULL;
float cislo1, cislo2, vysledok;
char operator;
preskoc_medzery(&p);
cislo1 = strtof(p, &koniec);
if (koniec == p) { printf("CHYBA\n"); pocet_chyba++; continue; }
p = koniec;
preskoc_medzery(&p);
operator = *p;
if (operator != '+' && operator != '-' &&
operator != '*' && operator != '/') {
printf("CHYBA\n"); pocet_chyba++; continue;
}
p += 1;
preskoc_medzery(&p);
koniec = NULL;
cislo2 = strtof(p, &koniec);
if (koniec == p) { printf("CHYBA\n"); pocet_chyba++; continue; }
p = koniec;
preskoc_medzery(&p);
if (*p != '=') { printf("CHYBA\n"); pocet_chyba++; continue; }
p += 1;
preskoc_medzery(&p);
koniec = NULL;
vysledok = strtof(p, &koniec);
if (koniec == p) { printf("CHYBA\n"); pocet_chyba++; continue; }
p = koniec;
preskoc_medzery(&p);
if (*p != '\n' && *p != '\0' && *p != '\r') {
printf("CHYBA\n"); pocet_chyba++; continue;
}
float spravny;
if (operator == '+') {
spravny = cislo1 + cislo2;
} else if (operator == '-') {
spravny = cislo1 - cislo2;
} else if (operator == '*') {
spravny = cislo1 * cislo2;
} else {
if (cislo2 == 0.0f) { printf("ZLE\n"); pocet_zle++; continue; }
spravny = cislo1 / cislo2;
}
spravny = zaokruhli(spravny);
if (su_rovnake(spravny, vysledok)) {
printf("OK\n");
pocet_ok++;
} else {
printf("ZLE\n");
pocet_zle++;
}
}
return 0;
}