pumpit
This commit is contained in:
parent
d9f282243a
commit
c513d24ba7
BIN
du4/program
BIN
du4/program
Binary file not shown.
183
du4/program.c
183
du4/program.c
@ -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");
|
|
||||||
|
|
||||||
return 0;
|
if (retVal == 0 || isNewline(buffer[0]) == true) {
|
||||||
}
|
// puts("KONIEC");
|
||||||
|
|
||||||
int l = strlen(buffer);
|
return 0;
|
||||||
|
|
||||||
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';
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user