#include #include #include #include #include #define SIZE 128 //kontrola, ze ci vycitane informacie su aritmeticky spravne //VRACIA: int: -1 (CHYBA), 0 (False), (True) float IsArithCorrect(float num1, float num2, char* op, float result) { switch (*op) { case '-': if ((num1-num2) == result) { return 1;} break; case '+': if ((num1+num2) == result) { return 1;} break; case '*': if ((num1*num2) == result) { return 1;} break; case '/': if (num2 == 0) { return -1;} if ((num1/num2) == result) { return 1;} break; } return 0; } int main() { //pomocne premeny char line[SIZE], strBuffer[SIZE]; line[0] = '\0'; strBuffer[0] = '\0'; char* strtofEndPtr; while (fgets(line, SIZE, stdin) != NULL) { if (sscanf(line, "%127[^\n]", strBuffer) == 1) { bool isLineInvalid = false; //docasne 'char' premeny char num1Temp[10], num2Temp[10], resultTemp[10]; num1Temp[0] = '\0'; num2Temp[0] = '\0'; resultTemp[0] = '\0'; bool hasOper = false; bool hasEqualsSign = false; char op1 = 'N'; //N = 'None/NIC' for (int i = 0; strBuffer[i] != '\0'; i++) { if (isdigit(strBuffer[i]) != 0) { //skontroluj, ze ci char po nom je tiez cislo (a NIE je desat. bodka), AK NIE, povazuj buduce cisla v riadku ako ine cislo // a inkrementuj kontrolnu citaciu premenu if (isdigit(strBuffer[i+1]) == 0 && strBuffer[i+1] != '.') { writeIntoArrayNum += 1; } switch (writeIntoArrayNum) { case 1: strncat(num1Temp, &strBuffer[i], 1); break; case 2: strncat(num2Temp, &strBuffer[i], 1); break; case 3: strncat(resultTemp, &strBuffer[i], 1); break; } continue; } if (ispunct(strBuffer[i]) != 0) { //ak je to nejaky printable symbol ('*/-,:./), skontroluj ci to nie je artimeticke znamienko alebo desatinna bodka (a udel im vynimku) //AK NIE, povazuj za riadok neplatny... if (strBuffer[i] == '=') { continue; } if (strBuffer[i] == '+' || strBuffer[i] == '-' || strBuffer[i] == '/' || strBuffer[i] == '*') { op1 = strBuffer[i]; } else if (strBuffer[i] == '.') { //zisti, kde treba zapisat desatinnu bodku switch (writeIntoArrayNum) { case 1: strncat(num1Temp, &strBuffer[i], 1); break; case 2: strncat(num2Temp, &strBuffer[i], 1); break; case 3: strncat(resultTemp, &strBuffer[i], 1); break; } } else { isLineInvalid = true; break; } continue; } if (isalpha(strBuffer[i]) != 0) { isLineInvalid = true; break; } } float num1 = strtof(num1Temp, &strtofEndPtr); float num2 = strtof(num2Temp, &strtofEndPtr); float resultNum = strtof(resultTemp, &strtofEndPtr); //** konecna faza = vypisovanie vysledkov //ak systematicka chyba if (isLineInvalid || op1 == 'N' || IsArithCorrect(num1, num2, &op1, resultNum) == -1) { printf("CHYBA\n"); } else if (IsArithCorrect(num1, num2, &op1, resultNum) == 0) { printf("ZLE\n"); } else { printf("OK\n"); } } } return 0; }