学习UML系列之——绘制流程图,解决一个简单的运算顺序问题
题目定义:
输入为合法的整数四则运算表达式,不带括号,编程计算表达式的运算结果。
思路:
先设计程序流程图,之后打印出流程图,根据流程图编程实现代码。
程序流程图:
代码:
1 #include <stdlib.h> 2 #include <stack> 3 4 using namespace std; 5 6 int get_int(const char* &p) 7 { 8 int tmp = 0; 9 while(*p >= '0' && *p <= '9') 10 { 11 tmp *= 10; 12 tmp += *p++-'0'; 13 } 14 return tmp; 15 } 16 17 char get_opt(const char* &p) 18 { 19 return *p++; 20 } 21 22 int cal(int first, int second, char oprtr) 23 { 24 switch(oprtr) 25 { 26 case '+': 27 return first+second; 28 break; 29 case '-': 30 return first-second; 31 break; 32 case '*': 33 return first*second; 34 break; 35 case '/': 36 return first/second; 37 break; 38 default: 39 return 0; 40 } 41 } 42 43 int _tmain(int argc, _TCHAR* argv[]) 44 { 45 const char* str = "50+10+5*6/3+3/3*4/2"; 46 const char* p = str; 47 const char* eos = str+strlen(str); 48 stack<int> stack_value; 49 stack<char> stack_oprtr; 50 while(true) 51 { 52 // 整数压入栈 53 stack_value.push(get_int(p)); 54 55 check_is_end_of_string: 56 // 判断是否结束 57 if(p == eos) 58 break; 59 60 // 将当前运算符压入栈 61 char ch = get_opt(p); 62 stack_oprtr.push(ch); 63 64 // 判断是否+或者- 65 if(ch == '+' || ch == '-') 66 continue; 67 68 // 整数压入栈 69 stack_value.push(get_int(p)); 70 71 // 做一次运算 72 char oprtr = stack_oprtr.top(); 73 stack_oprtr.pop(); 74 int second = stack_value.top(); 75 stack_value.pop(); 76 int first = stack_value.top(); 77 stack_value.pop(); 78 int res = cal(first, second, oprtr); 79 stack_value.push(res); 80 81 goto check_is_end_of_string; // 这里使用了goto和lable,仅做练习,实际编程中不推荐使用! 82 } 83 84 while(!stack_oprtr.empty()) 85 { 86 // 做一次运算 87 char oprtr = stack_oprtr.top(); 88 stack_oprtr.pop(); 89 int second = stack_value.top(); 90 stack_value.pop(); 91 int first = stack_value.top(); 92 stack_value.pop(); 93 int res = cal(first, second, oprtr); 94 stack_value.push(res); 95 } 96 97 printf("result = %d ", stack_value.top()); 98 99 system("pause"); 100 return 0; 101 }
输出结果:
result = 72
请按任意键继续. . .