diff --git a/du4/program b/du4/program new file mode 100755 index 0000000..9bec58c Binary files /dev/null and b/du4/program differ diff --git a/du4/program.c b/du4/program.c new file mode 100644 index 0000000..e349f85 --- /dev/null +++ b/du4/program.c @@ -0,0 +1,239 @@ +#include +#include +#include +#include +#include + +#define SCAN_FIRST_NUMBER 0 +#define SCAN_FIRST_OPERATOR 1 +#define SCAN_SECOND_NUMBER 2 +#define SCAN_SECOND_OPERATOR 3 +#define SCAN_RESULT 4 +// #define SCAN_END 5 + +char* scanValue(char *s, float *output); +char* scanOperator(char *s, char *output); + +// bool isDigit(char c); +bool isOperator(char c); +// bool isFloatingPoint(char c); +// bool isWhitespace(char c); +bool isNewline(char c); +bool evaluate(float a, float b, float c, char op); + +void error(); + +int main(){ + char buffer[2048]; + // char str[512]; + + float a; + float b; + float c; + char operator; + + char *retVal = fgets (buffer, sizeof(buffer), stdin); + + if (retVal == 0 || isNewline(buffer[0]) == true) { + puts("KONIEC"); + + return 0; + } + + int l = strlen(buffer); + + if (isNewline(buffer[l - 1]) == false) { + error(); + + return 0; + } + + int scanStatus = SCAN_FIRST_NUMBER; + char *currentChar = buffer; + char *endChar = buffer + l - 1; + + // for (char *i = 0; i < l; i++) { + // // int forward = 0; + + // char currentChar = buffer[i]; + + // if (i == l - 1 && isNewline(currentChar) == false) { + + // } + // } + + while (currentChar < endChar) { + if (scanStatus == SCAN_FIRST_NUMBER) { + retVal = scanValue(currentChar, &a); + } else if (scanStatus == SCAN_FIRST_OPERATOR) { + retVal = scanOperator(currentChar, &operator); + } else if (scanStatus == SCAN_SECOND_NUMBER) { + retVal = scanValue(currentChar, &b); + } else if (scanStatus == SCAN_SECOND_OPERATOR) { + char eqOp; + + retVal = scanOperator(currentChar, &eqOp); + + if (eqOp != '=') { + retVal = 0; + } + } else if (scanStatus == SCAN_RESULT) { + retVal = scanValue(currentChar, &c); + } else { + error(); + + break; + } + + if (retVal == 0) { + error(); + + break; + } else if (scanStatus == SCAN_RESULT) { + bool validResult = evaluate(a, b, c, operator); + + if (validResult == true) { + puts("OK"); + } else { + puts("ZLE"); + } + + break; + } + + currentChar = retVal; + scanStatus++; + } + + return 0; +} + +char* scanValue(char *s, float *output) { + char *retVal = 0; + + *output = strtof(s, &retVal); + + if (retVal == 0 || retVal == s || ((*output) == 0 && *(retVal - 1) != '0')) { + return 0; + } + + return retVal; + + // int outPosition = 0; + // int l = strlen(s); + // bool hasPoint = false; + + // for (int i = 0; i < l - 1; i++) { + // char c = s[i]; + // char cNext = s[i+1]; + // bool isError = (outPosition == 0 && isDigit(c) == false) + // || (outPosition > 0 && ( + // (hasPoint == true && isFloatingPoint(c)) + // || (hasPoint == false && isFloatingPoint(c) == true && isDigit(cNext) == false) + // || (isDigit(c) == true && ( + // (hasPoint == true && isOperator(cNext) == false && isWhitespace(cNext) == false && isNewline(cNext) == false) + // || (hasPoint == false && isOperator(cNext) == false && isWhitespace(cNext) == false && isNewline(cNext) == false && isFloatingPoint(cNext) == false)) + // ) + // || (hasPoint == true && isDigit(c) == false) + // || (hasPoint == false && isFloatingPoint(c) == false && isDigit(c) == false) + // )); + + // if (isError == true) { + // return 0; + // } + + // if (isFloatingPoint(c)) { + // hasPoint = true; + // outPosition++; + + // continue; + // } + + // bool endsHere = isOperator(cNext) == true || isWhitespace(cNext) == true || isNewline(cNext) == true; + + // if (endsHere == true) { + // break; + // } + + // outPosition++; + // } + + // if (outPosition > 0) { + // *output = strtof(s, s + outPosition - 1); + // } + + // return outPosition; +} + +char* scanOperator(char *s, char *output) { + char *start = s; + + while (isspace(*start) != 0) { + start++; + } + + char c = *start; + + if (isOperator(c) == false) { + return 0; + } + + (*output) = c; + + return start + 1; +} + +// bool isDigit(char c) { +// return c >= '0' && c <= '9'; +// } + +bool isOperator(char c) { + return c == '+' || c == '-' || c == '*' || c == '/' || c == '='; +} + +// bool isFloatingPoint(char c) { +// return c == '.' || c == ','; +// } + +// bool isWhitespace(char c) { +// return c == ' ' || c == '\t'; +// } + +bool isNewline(char c) { + return c == '\n'; +} + +bool evaluate(float a, float b, float c, char op) { + float resultL = c - 0.001F; + float resultR = c + 0.001F; + float result; + + switch (op) + { + case '+': + result = a + b; + break; + + case '-': + result = a - b; + break; + + case '*': + result = a * b; + break; + + case '/': + result = a / b; + break; + + default: + error(); + return false; + } + + return result == c || (result >= resultL && result <= resultR); +} + +void error() { + puts("CHYBA"); +}