C++实现四则混合运算计算器
程序员文章站
2022-06-24 22:48:30
本文实例为大家分享了c++实现四则混合运算的计算器,供大家参考,具体内容如下计算器是带括号的四则运算实际上利用的是栈后进先出的原则转换思想:#define _crt_secure_no_warning...
本文实例为大家分享了c++实现四则混合运算的计算器,供大家参考,具体内容如下
计算器是带括号的四则运算实际上利用的是栈后进先出的原则
转换思想:
#define _crt_secure_no_warnings 1 #include"stdio.h" #include"stdlib.h" #include"string.h" #define maxsize 1024 typedef struct { float data[maxsize]; int top; }stack1; void initstack1(stack1 *s) { s = (stack1*)malloc(sizeof(stack1)); s->top = -1; } int push1(stack1 *s, float ch) { if (s->top == maxsize - 1) return 0; else { s->top++; s->data[s->top] = ch; return 1; } }//入栈push int pop1(stack1 *s, float ch) { if (s->top == -1) printf("栈上溢出!\n"); else ch = s->data[s->top]; s->top--; return 1; }//出栈 typedef struct { char data[maxsize]; int top; }stack2; void initstack2(stack2 *s) { s = (stack2*)malloc(sizeof(stack2)); s->top = -1; } int push2(stack2 *s, char ch) { if (s->top == maxsize - 1) return 0; else { s->top++; s->data[s->top] = ch; return 1; } }//入栈push int pop2(stack2 *s, char ch) { if (s->top == -1) printf("栈上溢出!\n"); else ch = s->data[s->top]; s->top--; return 1; }//出栈 int comop(char ch) //判断是否是运算符 { switch (ch) { case'+': case'-': case'*': case'/': case'(': case')': case'#': return 1; default: return 0; } }//判断ch是否为运算符 char prior[7][7] = { // 运算符优先级表 // '+' '-' '*' '/' '(' ')' '#' /*'+'*/{ '>', '>', '<', '<', '<', '>', '>' }, /*'-'*/{ '>', '>', '<', '<', '<', '>', '>' }, /*'*'*/{ '>', '>', '>', '>', '<', '>', '>' }, /*'/'*/{ '>', '>', '>', '>', '<', '>', '>' }, /*'('*/{ '<', '<', '<', '<', '<', '=', '< ' }, /*')'*/{ '>', '>', '>', '>', ' ', '>', '>' }, /*'#'*/{ '<', '<', '<', '<', '<', '> ', '=' }, }; int opid(char op1) { switch (op1) { case'+':return 0; case'-':return 1; case'*':return 2; case'/':return 3; case'(':return 4; case')':return 5; case'#':return 6; default:return -123456; } } char precede(char op1, char op2) //优先级比较 { int a, b; a = opid(op1); b = opid(op2); return(prior[a][b]); } float operation(float a, char op, float b) { switch (op) { case '+': return b + a; case '-': return b - a; case '*': return b * a; case '/': return b / a; default: return -123456; } } void createexpression(char *exp) { if (exp == null) { exit(1); } scanf("%s", exp); } void transmitexpression(char *exp, char postexp[]) //中缀表达式转换后缀表达式 { stack2 fz; initstack2(&fz); int i = 0; char x; fz.top = -1; push2(&fz, '#'); fz.data[fz.top] = '#'; while (*exp != '\0') { if (!comop(*exp)) { while (*exp >= '0'&&*exp <= '9')//读取一个数字串 { postexp[i++] = *exp; exp++; } postexp[i++] = '#'; } else switch (precede(fz.data[fz.top], *exp)) { case'<': push2(&fz, *exp); exp++; break; case'=': x = fz.data[fz.top]; pop2(&fz, x); exp++; break; case'>': postexp[i++] = fz.data[fz.top]; x = fz.data[fz.top]; pop2(&fz, x); break; } } while (fz.data[fz.top] != '#') { postexp[i++] = fz.data[fz.top]; x = fz.data[fz.top]; pop2(&fz, x); } postexp[i] = '\0'; } float evaluateexpression(char *postexp) //后缀表达式的计算 { stack1 sz; initstack1(&sz); float a, b, d; sz.top = -1; while (*postexp != '\0') { switch (*postexp) { case'+': case'-': case'*': case'/': a = sz.data[sz.top]; pop1(&sz, a); b = sz.data[sz.top]; pop1(&sz, b); push1(&sz, operation(a, *postexp, b)); break; default: d = 0; while (*postexp >= '0'&&*postexp <= '9') { d = 10 * d + *postexp - '0'; postexp++; } push1(&sz, d); sz.data[sz.top] = d; break; } postexp++; } return(sz.data[sz.top]); } int error(char *exp) //错误表达式判断 { int i = 0; while (exp[i] != '\0') { if ( ((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i + 1] == ')')) || ((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i - 1] == '(')) || (exp[i] == ')'&&exp[i + 1] == '(') || (exp[i] == '('&&exp[i + 1] == ')') || ((exp[i] == ')') && exp[i + 1] >= '0'&&exp[i + 1] <= '9') || (exp[i] >= '0'&&exp[i] <= '9'&&exp[i + 1] == '(') || (exp[0] == '+' || exp[0] == '-' || exp[0] == '*' || exp[0] == '/' || exp[0] == ')') || ((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i + 1] == '+' || exp[i + 1] == '-' || exp[i + 1] == '*' || exp[i + 1] == '/')) || (exp[i] == '/'&&exp[i + 1] == '0') ) return 1; else if (exp[i] == '\0') return 0; i++; } return 0; } void menu() { printf("\t\t--------------------------------------------\n"); printf("\t\t| 计算器 |\n"); printf("\t\t| ---------------- |\n"); printf("\t\t| | | |\n"); printf("\t\t| ---------------- |\n"); printf("\t\t| 1 2 3 + |\n"); printf("\t\t| 4 5 6 - |\n"); printf("\t\t| 7 8 9 * |\n"); printf("\t\t| 0 ( ) / |\n"); printf("\t\t--------------------------------------------\n"); printf("\t\t 请输入你要进行的操作:\n"); printf("\t\t a表达式求值 b清空 c退出\n"); } void clear() { system("cls"); menu(); } void quit() { system("cls"); exit(1); } void main() { char c; char exp[maxsize]; char postexp[maxsize] = { 0 }; menu(); while (1) { scanf("%c", &c); switch (c) { case 'a': sr : printf("请输入要计算的表达式:\n"); createexpression(exp); if (!error(exp)) { transmitexpression(exp, postexp); printf("后缀表达式为:%s\n", postexp); printf("表达式结果为:%s=", exp); printf("%g\n", evaluateexpression(postexp)); break; } else if (error(exp)) { printf("您输入的表达式有误!\n"); goto sr;//goto语句在循环体里进行跳转 } case'b': clear(); break; case'c': quit(); break; } } system("pause"); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: Redis的使用模式之计数器模式实例