软件工程第3次作业

第三次作业

要求0

作业地址 https://edu.cnblogs.com/campus/nenu/2016CS/homework/2266

要求1

git仓库地址:https://git.coding.net/wudb527/f4.git

要求2

结对同学: 武东钵

博客地址:https://www.cnblogs.com/wudb527/p/9933811.html

重难点:在解决这个作业时,感觉的最重要最难解决的地方便是处理生成的算式,因为都是字符型,要想运算只能转换为可运算的式子,又因为括号,加减乘除有优先级,所以一般的用if语句解决的话,就会十分麻烦。所以武东钵提出了逆波兰式,可以将中序表达式转化为逆波兰表达式,这样就可以将运算符与运算数入栈,就可以判别优先级。

double Calculate(int len,bool& havewrong)
{
    havewrong = false;
    Node t;
    while(!numb.empty()) numb.pop();
    while(!Opt.empty()) Opt.pop();
    for(int i = 0; i < len; ++i)
    {
        if(line[i].name == "(")
        {
            Opt.push(line[i]);
        }
        else if(line[i].name == ")")
        {
            while(1)
            {

                t = Opt.top();
                Opt.pop();
                if(t.name == "(")
                {
                    break;
                }
                else
                {
                    numb.push(t);
                }
            }
        }
        else if(line[i].isnum == false)
        {
            if(Opt.empty() == true)
            {
                Opt.push(line[i]);
                continue;
            }

            t = Opt.top();
            if(t.name == "(")
            {
                Opt.push(line[i]);
            }
            else if(opt2int(line[i].name) > opt2int(t.name))
            {
                Opt.push(line[i]);
            }
            else if(opt2int(line[i].name) <= opt2int(t.name))
            {
                while(!Opt.empty())
                {
                    t = Opt.top();

                    if(opt2int(line[i].name) > opt2int(t.name))
                    {
                        Opt.push(line[i]);
                        break;
                    }
                    else
                    {
                        numb.push(t);
                        Opt.pop();
                    }
                }
                if(Opt.empty() == true) Opt.push(line[i]);
            }
        }
        else if(line[i].isnum == true)
        {
            numb.push(line[i]);
        }
    }
    while(!Opt.empty())
    {
        t = Opt.top();
        Opt.pop();
        numb.push(t);
    }
    while(!numb.empty())
    {
        line[numb.size()-1] = numb.top();
        numb.pop();
    }
    double ans;
    Node t1,t2;
    for(int i = 0; i < 7 ; ++i)
    {
        if(line[i].isnum == true) numb.push(line[i]);
        else if(line[i].isnum == false)
        {
            t2 = numb.top();
            numb.pop();
            t1 = numb.top();
            numb.pop();

            t.isnum = true;
            if(line[i].name == "+")
            {
                t.value = t1.value + t2.value;
            }
            else if(line[i].name == "-")
            {
                t.value = t1.value - t2.value;
            }
            else if(line[i].name == "/")
            {
                if(fabs(t2.value) < eps)
                {
                    havewrong = true;
                    return 0.1;
                }
                else
                    t.value = t1.value / t2.value;
            }
            else if(line[i].name == "*")
            {
                t.value = t1.value * t2.value;
            }
            numb.push(t);
        }
    }
    //cout<<"numb.size() = "<

体会: 结对编程可以使两个人有更多的交流,对解决问题的思路,想法以及大体上的重难点,在开始编程前就有更多的选择,有更好的目标。另外在一个问题上,往往不会尝试,便会有一个较优的解决方案。当两个人编码习惯不同时,结对编程也能更好地解决编码规范。

软件工程第3次作业_第1张图片

你可能感兴趣的:(软件工程第3次作业)