#include<stdio.h>
#include<windows.h>
#include<math.h>
#include<string.h>
int o_top = 0;
int num_top = 0;
char o_s[100];
int num_s[100];
int jop(char o)
{
if (o == '(')
return 1;
if (o == '+' || o == '-')
return 2;
if (o == '*' || o == '/')
return 3;
if (o == '^')
return 4;
}
void o_push(char o)
{
o_top++;
o_s[o_top] = o;
return;
}
void num_push(int n)
{
num_top++;
num_s[num_top] = n;
return;
}
int math(int n1, int n2, char o)
{
if (o == '+')
return n1 + n2;
if (o == '-')
return n1 - n2;
if (o == '*')
return n1 * n2;
if (o == '/' && n2 != 0)
return n1 / n2;
else if (o == '/' && n2 == 0)
{
printf("出错!\n");
system("pause");
}
if (o == '^')
{
return pow(n1, n2);
}
}
int main()
{
printf("WB版计算器由于技术原因,仅支持以下运算....\n");
printf("1.带括号的+-*/运算\n");
printf("2.进制转换计算\n");
printf("现在,请你输入“1”或“2”进行运算:\n");
int choice;
scanf_s("%d", &choice);
if (choice == 1)
{
char str[100] = {0};
printf("Please enter the equation(no space):\n");
int i = 0;
gets(str);
int size = strlen(str);
while (i < size)
{
if (str[i] == '(')
{
o_push(str[i]);
i++;
}
else if (str[i] >= '0' && str[i] <= '9')
{
int t = 0;
while (str[i] >= '0' && str[i] <= '9' && i < size)
{
t = t * 10 + (str[i] - 48);
i++;
}
num_push(t);
}
else if (str[i] == '+' || str[i] == '-')
{
if (o_top == 0 || jop(num_s[o_top]) == 1)
{
o_push(str[i]);
}
else if (jop(o_s[o_top]) == 2 || jop(o_s[o_top]) == 3 || jop(o_s[o_top]) == 4)
{
if (o_top >= 1 && num_top > 1 && jop(o_s[o_top]) != 1)
{
int n1 = num_s[num_top - 1];
int n2 = num_s[num_top];
num_s[num_top - 1] = math(n1, n2, o_s[o_top]);
num_s[num_top] = 0;
o_s[o_top] = '\0';
num_top--; o_top--;
}
o_push(str[i]);
}
i++;
}
else if (str[i] == '*' || str[i] == '/')
{
if (o_top == 0 || jop(o_s[o_top]) == 1 || jop(o_s[o_top]) == 2)
{
o_push(str[i]);
}
else if (jop(o_s[o_top]) == 2 || jop(o_s[o_top]) == 3)
{
if (o_top >= 1 && num_top > 1 && jop(o_s[o_top]) != 1)
{
int n1 = num_s[num_top - 1];
int n2 = num_s[num_top];
num_s[num_top - 1] = math(n1, n2, o_s[o_top]);
num_s[num_top] = 0;
o_s[o_top] = '\0';
num_top--; o_top--;
}
o_push(str[i]);
}
i++;
}
else if (str[i] == '^')
{
if (o_top == 0 || jop(o_s[o_top]) == 1 || jop(o_s[o_top]) == 2 || jop(o_s[o_top]) == 3)
{
o_push(str[i]);
}
else if (jop(o_s[o_top]) == 4)
{
if (o_top >= 1 && num_top > 1 && jop(o_s[o_top]) != 1)
{
int n1 = num_s[num_top - 1];
int n2 = num_s[num_top];
num_s[num_top - 1] = math(n1, n2, o_s[o_top]);
num_s[num_top] = 0;
o_s[o_top] = '\0';
num_top--; o_top--;
}
o_push(str[i]);
}
i++;
}
else if (str[i] == ')')
{
do {
int n1 = num_s[num_top - 1];
int n2 = num_s[num_top];
num_s[num_top - 1] = math(n1, n2, o_s[o_top]);
num_s[num_top] = 0;
o_s[o_top] = '\0';
num_top--; o_top--;
} while (jop(o_s[o_top]) != 1 && o_top >= 1 && num_top > 1);
o_s[o_top] = '\0';
o_top--;
i++;
}
}
while (o_top >= 1 && num_top > 1)
{
int n1 = num_s[num_top - 1];
int n2 = num_s[num_top];
num_s[num_top - 1] = math(n1, n2, o_s[o_top]);
num_s[num_top] = 0;
o_s[o_top] = '\0';
num_top--; o_top--;
}
printf("%d", num_s[1]);
}
else if (choice == 2)
{
int pr;
int fn;
int size;
int i;
int sum = 0;
char ch[50] = "0";
printf("即将输入三个数字,输入每个数字后,按回车转跳下一个输入内容......\n");
printf("请输入原进制:");
scanf_s("%d", &pr);
printf("请输入原数据:");
scanf_s("%s", &ch);
printf("请输入想要转换成的数据的进制:");
scanf_s("%d", &fn);
size = strlen(ch);
for (i = 0; i < size; i++)
{
int temp1 = pow(pr, size - i - 1);
int temp2 = ch[i];
switch (ch[i])
{
case 'A':
sum += (temp2 - 55) * temp1;
break;
case 'B':
sum += (temp2 - 55) * temp1;
break;
case 'C':
sum += (temp2 - 55) * temp1;
break;
case 'D':
sum += (temp2 - 55) * temp1;
break;
case 'E':
sum += (temp2 - 55) * temp1;
break;
case 'F':
sum += (temp2 - 55) * temp1;
break;
default:
sum += (temp2 - 48) * temp1;
break;
}
}
char ans[50] = "0";
int j = 0;
while (sum > 0)
{
switch (sum % fn)
{
case 10:
ans[j] = 'A';
break;
case 11:
ans[j] = 'B';
break;
case 12:
ans[j] = 'C';
break;
case 13:
ans[j] = 'D';
break;
case 14:
ans[j] = 'E';
break;
case 15:
ans[j] = 'F';
break;
default:
ans[j] = (sum % fn) + 48;
break;
}
j++;
sum /= fn;
}
j--;
for (; j >= 0; j--)
{
printf("%c", ans[j]);
}
}
return 0;
}