This commit is contained in:
Igor Dzuro 2020-04-02 23:34:39 +02:00
parent d9f282243a
commit c513d24ba7
2 changed files with 56 additions and 127 deletions

Binary file not shown.

View File

@ -9,15 +9,11 @@
#define SCAN_SECOND_NUMBER 2 #define SCAN_SECOND_NUMBER 2
#define SCAN_SECOND_OPERATOR 3 #define SCAN_SECOND_OPERATOR 3
#define SCAN_RESULT 4 #define SCAN_RESULT 4
// #define SCAN_END 5
char* scanValue(char *s, float *output); char* scanValue(char *s, float *output);
char* scanOperator(char *s, char *output); char* scanOperator(char *s, char *output);
// bool isDigit(char c);
bool isOperator(char c); bool isOperator(char c);
// bool isFloatingPoint(char c);
// bool isWhitespace(char c);
bool isNewline(char c); bool isNewline(char c);
bool evaluate(float a, float b, float c, char op); bool evaluate(float a, float b, float c, char op);
@ -25,84 +21,74 @@ void error();
int main(){ int main(){
char buffer[2048]; char buffer[2048];
// char str[512]; char *retVal;
float a; while ((retVal = fgets(buffer, sizeof(buffer), stdin)) != 0) {
float b; float a;
float c; float b;
char operator; float c;
char operator;
char *retVal = fgets (buffer, sizeof(buffer), stdin); if (retVal == 0 || isNewline(buffer[0]) == true) {
// puts("KONIEC");
if (retVal == 0 || isNewline(buffer[0]) == true) { return 0;
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) { int l = strlen(buffer);
if (isNewline(buffer[l - 1]) == false) {
error(); error();
break; return 0;
} else if (scanStatus == SCAN_RESULT) { }
bool validResult = evaluate(a, b, c, operator);
if (validResult == true) { int scanStatus = SCAN_FIRST_NUMBER;
puts("OK"); char *currentChar = buffer;
char *endChar = buffer + l - 1;
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 { } else {
puts("ZLE"); error();
break;
} }
break; if (retVal == 0) {
} error();
currentChar = retVal; break;
scanStatus++; } 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; return 0;
@ -118,51 +104,6 @@ char* scanValue(char *s, float *output) {
} }
return retVal; 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* scanOperator(char *s, char *output) {
@ -183,22 +124,10 @@ char* scanOperator(char *s, char *output) {
return start + 1; return start + 1;
} }
// bool isDigit(char c) {
// return c >= '0' && c <= '9';
// }
bool isOperator(char c) { bool isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/' || 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) { bool isNewline(char c) {
return c == '\n'; return c == '\n';
} }