学习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\n", stack_value.top());
 98 
 99     system("pause");
100     return 0;
101 }

输出结果:

result = 72
请按任意键继续. . .

 

posted @ 2013-10-30 23:58  铁甲小宝  阅读(1162)  评论(0编辑  收藏  举报