软件工程第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() = "<<numb.size()<<endl;
	return (numb.top()).value;
}    

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

posted on 2018-11-09 12:04  baymax2016011926  阅读(188)  评论(1编辑  收藏  举报