作业要求 20190919-6 四则运算试题生成,结对

此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631

代码地址:https://e.coding.net/yangtianyu/szysuan.git

结对伙伴:魏新

要求一:(1)功能1. 四则运算

支持出题4个数的四则运算题目,所有题目要求作者有能力正确回答

重点难点:需要随机产生一组表达式,包括字符

随机产生

void Cequation(vector<char>&infix)
{
    infix.clear();
    char r_num[5];
    int temp;
    int e_form;
    push_num=0;
    e_form=rand()%11;
char RdOp()
{
    int rd_op=rand()%4;
    if(rd_op==0)
    {
        return '+';
    }
    if(rd_op==1)
    {
        return '-';
    }
    if(rd_op==2)
    {
        return '*';
    }
    if(rd_op==3)
    {
        return '/';
    }
}

运算优先级

int Priority(char c,string str)
{
    int priority_level=str.find(c);
    if(priority_level==2||priority_level==3)
    {
        return 2;
    }
    else if(priority_level==4||priority_level==5)
    {
        return 4;
    }
    else
    {
        return priority_level;
    }

计算正确题目数量

 if(fabs(input_ans-ans)<=precision)
            {
                right_num++;
                printf("答对啦,你真是个天才!\n");
            }
            else
            {
                printf("再想想吧,答案似乎是%.1f喔!\n",ans);
            }
        }
        printf("你一共答对%d道题,共20道题。",right_num);

功能一程序运行成功截图

 

 

 

 收获,心得:功能一加减乘除功能实现不算困难,只要小心算数运算符的优先级问题。通过和伙伴的合作,让我知道两个人合作应该在那些方面值得注意,大学阶段我们已经习惯了一个人完成作业,所以肯定会有不适应和生疏感,对合作没有经验。相信慢慢会变好。基本语法虽然枯燥,但是就好比高楼大厦的一砖一瓦,一定要下硬功夫熟练掌握。

功能2:支持括号 

重点难点:括号的匹配及运算的优先级

for(int i=0;i<13;i++)
    {
        //printf("%d",form[e_form][i]);
        temp=form[e_form][i];
        if(temp<0)//左括号
        {
            while(temp<0)
            {
                infix.push_back('(');
                temp++;
                push_num++;
            }
        }
        else if(temp>0)
        {
            if(temp==3)//数字
            {
                itoa(rand()%9+1,r_num,10);
                infix.push_back(r_num[0]);
                push_num++;
            }
            else if(temp==4)//运算符
            {
                infix.push_back(RdOp());
                push_num++;
            }
            else//右括号
            {
                while(temp>0)
                {
                    infix.push_back(')');
                    push_num++;
                    temp--;
                }
            }

功能二成功运行程序截图

  收获,心得:如果你对数据结构不是很了解,不能合理的运用,那么功能二就是比较明显的利用数据结构解决问题,这个功能类似于数据结构中前(中,后)缀表达式出栈问题。要想设计出好的程序,数据结构必须要熟练掌握,所以以后要更加强对各种数据结构的了解,争取用语言去实现各种数据结构和算法。

功能3: 限定题目数量,"精美"打印输出,避免重复

重点,难点:限定题目数量,区分命令行参数是否为正整数字符串或者小数均是错的,然后打印输出,避免重复。

string IntoSuf(vector<char>&infix,int &push_num)
{
    string temp="";
    stack<char>s;
    s.push('#');
    for(int i=0;i<push_num;i++)
    {
        switch(infix[i])
        {
        case '(':
            s.push('(');
            break;
        case ')':
            while(!s.empty()&&s.top()!='(')
            {
                temp=temp+s.top();
                s.pop();
            }
            s.pop();
            break;
        default:
            if(isdigit(infix[i]))
            {
                temp=temp+infix[i];
            }
            else
            {
                if((s.top()=='(')||(s.top()!='('&&Priority(infix[i],s_priority)>Priority(s.top(),s_priority)))
                {
                    s.push(infix[i]);
                }
                else
                {
                    while(Priority(infix[i],s_priority)<=Priority(s.top(),s_priority))
                    {
                        temp=temp+s.top();
                        s.pop();
                    }
                    s.push(infix[i]);
                }
            }
            break;
        }
    }
    while(!s.empty())
    {
        temp=temp+s.top();
        s.pop();
    }
    //cout<<temp<<endl;
    return temp;
}
double SufCount(string &suffix)
{
    stack<char>s;
    double x,y,z;
    for(int i=0;suffix[i]!='#';i++)
    {
        if(suffix[i]>='0'&&suffix[i]<='9')
        {
            s.push(suffix[i]-'0');
        }
        else
        {
            x=s.top();
            s.pop();
            y=s.top();
            s.pop();
            z=Calculate(y,x,suffix[i]);
            s.push(z);
        }
    }
    return z;

程运行截图

 

收获,心得: 再一次对命令行进行操作,之前很少做这方面的题,所以当被问到命令行时候,一点都不了解具体的使用方法以及它的表达形式。在编程语言中有一些不常用容易忽略掉的知识点,需要让我引起重视,用的少不应该是忘记的理由。

 

 

 (2)花费时间较长,收获最大的事件:

既然是两个人的事情,说明两个人结对编程不能太过于依赖对方,要更加仔细认真的去做,可能我们习惯了一个人对两个人感觉有点别扭,慢慢适应这也是今后工作要走的路;

开始在语言的选择方向出现了较大的分歧,我最终决定还是使用C++去实现此次程序;

结对编程中双方要做到同步,不断地提高默契,这样可以省下在因为不默契上犯错的时间;

 

在编程时,我和魏新同学发现在实现运算式时,是一个难点,上网查资料,最后将程序实现了,在这点最大的收获是,结对编程能起到督促作用; 

在分析程序时,互相理解错了对方的意思,导致大量的时间被浪费,敲了很多无用的代码,通过这次结对编程,掌握了基本的技巧,还有要提高自己的表达能力

要求二:给出照片1张,包括结对的2位同学、工作地点、计算机,可选项包括其他能表达结对编程工作经历的物品或场景。

工作地点:光华公寓A411房间

计算机:笔记本一台

照片:

 

要求三:

代码地址:https://e.coding.net/yangtianyu/szysuan.git

 

posted @ 2019-09-24 19:19  杨天宇102954  阅读(199)  评论(0编辑  收藏  举报