zoukankan      html  css  js  c++  java
  • 学习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
    请按任意键继续. . .
  • 相关阅读:
    Java垃圾回收机制
    Java学习笔记——反射
    GitHub中有关已建仓库及上传项目文件的删除
    LaTex简历排版
    JavaSwing输入对话框,点击取消抛出异常的解决方法
    map的遍历方式(使用Junit测试)
    eclipse faild to creat the java Virtual Machine的解决办法
    XML消息解析_php
    [转载]android常用的API接口调用
    算法练习之:Doubles
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3398295.html
Copyright © 2011-2022 走看看