118 lines
3.1 KiB
C++
118 lines
3.1 KiB
C++
|
#include <math.h>
|
|||
|
#include <stdio.h>
|
|||
|
#include <stdlib.h>
|
|||
|
|
|||
|
int priority(char op) {
|
|||
|
switch(op) {
|
|||
|
case '+' : case '-' : return 1;
|
|||
|
case '*' : case '/' : case '%' : return 2;
|
|||
|
case '^' : return 3;
|
|||
|
default : return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void printf_postfix(char str[105][10], int len) {
|
|||
|
int i = 0;
|
|||
|
for (i = 0; i < len; i++) {
|
|||
|
if (str[i][0] != '0') printf("%s ", str[i]);
|
|||
|
}
|
|||
|
printf("\n");
|
|||
|
}
|
|||
|
|
|||
|
double cal(char op, double p1, double p2) {
|
|||
|
switch(op) {
|
|||
|
case '+' : return p1 + p2;
|
|||
|
case '-' : return p1 - p2;
|
|||
|
case '*' : return p1 * p2;
|
|||
|
case '/' : return p1 / p2;
|
|||
|
case '%' : return (int)p1 % (int)p2;
|
|||
|
case '^' : return pow(p1, p2);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void oper(char str[105][10], int len) {
|
|||
|
double now[105] = {0.0};
|
|||
|
|
|||
|
int L = 0, top = 0;
|
|||
|
while (L < len) {
|
|||
|
switch(str[L][0]) {
|
|||
|
case '+' : case '-' : case '*' : case '/' : case '%' : case '^' :
|
|||
|
now[top-1] = cal(str[L][0], now[top-1], now[top]);
|
|||
|
top--;
|
|||
|
break;
|
|||
|
default :
|
|||
|
now[++top] = atof(str[L]);
|
|||
|
}
|
|||
|
L++;
|
|||
|
}
|
|||
|
printf("\n<EFBFBD>B<EFBFBD><EFBFBD>G=%5f\n\n", now[top]);
|
|||
|
}
|
|||
|
|
|||
|
void infix_to_postfix(char* str) {
|
|||
|
char infix[105][10] = {' '}, stack[105], now[10];
|
|||
|
|
|||
|
int L = 0, R = 0, top = 0, i, j, flag = 0;
|
|||
|
while (str[L] != '\0') {
|
|||
|
switch(str[L]) {
|
|||
|
case '(' :
|
|||
|
stack[++top] = str[L];
|
|||
|
if (str[L+1] == '-') { flag = 1; L++; }
|
|||
|
break;
|
|||
|
case ')' :
|
|||
|
while (stack[top] != '(') {
|
|||
|
infix[R++][0] = stack[top--];
|
|||
|
}
|
|||
|
top--;
|
|||
|
break;
|
|||
|
case '+' : case '-' : case '*' : case '/' : case '%' : case '^' :
|
|||
|
while (priority(stack[top]) >= priority(str[L])) {
|
|||
|
infix[R++][0] = stack[top--];
|
|||
|
}
|
|||
|
stack[++top] = str[L];
|
|||
|
if (str[L+1] == '-') { flag = 1; L++; }
|
|||
|
break;
|
|||
|
default :
|
|||
|
i = 0;
|
|||
|
while (str[L] == '.' || (str[L] >= '0' && str[L] <= '9')) {
|
|||
|
now[i++] = str[L++];
|
|||
|
}
|
|||
|
if (flag) {
|
|||
|
infix[R][0] = '0'; infix[R+2][0] = '-'; flag = 0;
|
|||
|
for (j = 0; j < i; j++) infix[R+1][j] = now[j];
|
|||
|
R += 2;
|
|||
|
} else {
|
|||
|
for (j = 0; j < i; j++) infix[R][j] = now[j];
|
|||
|
}
|
|||
|
L--; R++;
|
|||
|
}
|
|||
|
L++;
|
|||
|
}
|
|||
|
|
|||
|
while (top) {
|
|||
|
infix[R++][0] = stack[top--];
|
|||
|
}
|
|||
|
|
|||
|
printf_postfix(infix, R);
|
|||
|
oper(infix, R);
|
|||
|
}
|
|||
|
|
|||
|
int main() {
|
|||
|
printf("%5f", 1+sin((-50.2+sin(3.8*20)*cos(-30-100%40))*pow(2, -2.5))*cos(123.456));
|
|||
|
char str[105] = {'\0'};
|
|||
|
while (printf("<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD>(<28>䴩+ - * / ^ () sin() cos()<29>B<EFBFBD><42>) => ")) {
|
|||
|
scanf("%s", str);
|
|||
|
|
|||
|
printf("\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><EFBFBD>G");
|
|||
|
infix_to_postfix(str);
|
|||
|
}
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
/*
|
|||
|
10+20*(50-30)/2^4-6*8
|
|||
|
10.5+20.8*(50.1-30.6)/2.5^4-6.6*8.2
|
|||
|
10-30*(-40-20)%2^4+7.5*-6
|
|||
|
1+sin((-50.2+sin(3.8*20)*cos(-30-100%40))*2^-2.5)*cos(123.456)
|
|||
|
*/
|
|||
|
|