• 作业要求 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("答对啦,你真是个天才!
    ");
                }
                else
                {
                    printf("再想想吧,答案似乎是%.1f喔!
    ",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

  • 相关阅读:
    Map容器家族(LinkedHashMap源码详解)
    树篇3-平衡二叉查找树之红黑树
    树篇2-平衡二叉查找树之AVL树
    树篇1-二叉查找树
    Map容器家族(HashMap源码详解)
    位运算符的基本使用和注意事项
    android中获取屏幕的信息
    获取activity的根视图
    初来咋到,请多指教
    linux死机解决办法
  • 原文地址:https://www.cnblogs.com/yty0726/p/11576613.html
Copyright © 2020-2023  润新知