zoukankan      html  css  js  c++  java
  • 作业要求 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

  • 相关阅读:
    每天一道LeetCode--141.Linked List Cycle(链表环问题)
    每天一道LeetCode--119.Pascal's Triangle II(杨辉三角)
    每天一道LeetCode--118. Pascal's Triangle(杨辉三角)
    CF1277D Let's Play the Words?
    CF1281B Azamon Web Services
    CF1197D Yet Another Subarray Problem
    CF1237D Balanced Playlist
    CF1239A Ivan the Fool and the Probability Theory
    CF1223D Sequence Sorting
    CF1228D Complete Tripartite
  • 原文地址:https://www.cnblogs.com/yty0726/p/11576613.html
Copyright © 2011-2022 走看看