20190919-6 四则运算试题生成,结对

作业要求详情:https://edu.cnblogs.com/campus/nenu/2019fall/homework/7631

结对成员:彭思雨

要求1 参考《构建之法》第4章两人合作,结对编程上述功能,要求每人发布随笔1篇 (代码是共同完成的,博客是分别完成的)。

(1) 给出每个功能的重点、难点、编程收获。

功能一:

重点:除数为零以及分数除不尽问题。

难点:一开始写程序主要考虑除数不能为零,可是题目又要求是生成随机数,这点我和我队友不知道怎么处理。

编程收获:第一次使用的java,可是发现后面功能越大,java越难完成整个程序功能。后来改选用Python。一开始我队友建议用Python,我其实比较抵触,因为我没有学过这门语言,在暑假只是稍微了解一点。而且这周任务比较重,自己能力又有限,所以不像去接触一门新的语言,可是越到后面后面功能java越难完成,所以就尝试着学习python,我相信语言都是相通的。突然发现python真的好强大,语言简洁,功能齐全强大,基本都是调用函数就可以了,不需要自己写方法,这次逼着自己学习一门新语言,虽然现在还不太熟悉,可是总算开启学习python之路,。

功能二:

重点:判断括号匹配。

难点:括号匹配好好几种,先一个表达式里可以先有括号,在数字运算符,也可以先有加减乘除,在有括号,括号也可以在中间。

编程收获:此次代码是参考往届学长的,我们这个括号匹配不好,参考学长代码,感觉学长的代码简洁易懂,要是在java中,括号匹配就要用到栈,后缀表达式得出结果,而在python中不需要那么复杂,括号一共分为三种情况,左括号,右括号,还有就是没有括号,而不是两种情况,一开始就是想的两种情况,但是表达式有的不合理。收获到了,原来括号不能只有两种。

def _f4(self):
        from random import randint as r  #直接导入randint函数,更名为r
        from random import uniform as ru  #直接导入uniform函数,更名为ru,用于生成指定范围内的随机浮点数
        from fractions import Fraction as f  #直接导入fractions函数,更名为f
        ops = ['+', '-', '*', '/']  #存储操作符
        kuohao = ['(', '', ')']  #存储括号
        left1 = r(0, 1)
        left2 = r(0, 1)
        left3 = r(0, 1)
        right1 = r(1, 2)
        right2 = r(1, 2)
        right3 = r(1, 2)
        if left1 == 0:
            left2 = 1
            left3 = 1
            if right1 == 2:
                right2 = 1
                right3 = 1
            else:
                right2 = 2
                right3 = 1
        else:
            if left2 == 0:
                left3 = 1
                right1 = 1
                if right2 == 2:
                    right3 = 1
                else:
                    right3 = 2
            else:
                left3 = 0
                right1 = 1
                right2 = 1
                right3 = 2
        add_1 = ru(0, 1)
        add_1 = f(add_1).limit_denominator(10)#限制最大分母值,小数变分数
        add_2 = ru(0, 1)
        add_2 = f(add_2).limit_denominator(10)
        add_3 = r(1, 10)
        add_4 = r(1, 10)
        ops1 = r(0, 2)
        ops2 = r(0, 3)
        ops3 = r(0, 3)
        eq = kuohao[left1] + str(add_1) + ops[ops1] + kuohao[left2] + str(add_2) +kuohao[right1] + ops[ops2] + kuohao[left3] + str(add_3) + kuohao[right2] +  ops[ops3] + str(add_4) + kuohao[right3]
             
        return (eq)

  

            for i in range(20):     #输出20道题,分别判断输入结果与正确答案是否相同,按要求输出
                _eq = f4()._f4()
                print(_eq, "=")
                _ans_right = f4()._f4_answer(eq = _eq) 
                _ans = input("?")
                if _ans == _ans_right:
                    print("答对啦,你真是个天才!")
                    yes = yes+ 1
                else:
                    print("再想想吧,答案似乎是", _ans_right, "喔!")
                    no= no + 1
            print("你一共答对", yes, "道题,共20道题。")
        except:
            print("输入有误")
        return (0)

  

 

功能三:

重点:输入字符是否合法判断。

难点:输入字符是否合法这分好几种情况,因为情况较多,所以考虑不全成为一个难点。

编程收获:我们对输入的字符进行了是否正整数,是否是字符、小数、负数不合法情况进行判断。

功能四:

重点:支持分数出题和运算。

难点:支持分数运算。

编程收获:对分数运算,这个是在第一个功能的基础上修改的,学到了可以直接在自己定义的变量后面点方法。

def _f4_integer_parser(self,x):
        _p = "题目数量必须是  正整数。"
        try:
            x = int(x)
            if x >= 0:
                for i in range(x):
                    _eq = f4()._f4()
                    _right = f4()._f4_answer(eq = _eq)
                    _eq = _eq + "="
                    print(_eq.ljust(40), _right)#方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符串。如果指定的长度小于原字符串的长度则返回原字符串。
            else:
                print(_p)
        except:
            print(_p)
        return(0) 

 

(2)给出结对编程的体会。

在结对编程前,我已经知道会有结对编程,一开始特别期待,可是后期天气变凉,我的热情也随着天气变淡了,在本次编程中,前几天,我和我的队友都是自己先想自己的,在构思,想着等想好在讨论,可是两天过去了,发现一点进展都没有,后来周六我和队友一起去食堂,一起讨论,一个上午把构思撸清楚,然后我们采用java来编程,上午过去了,真的发现两个人在一起,比一个人在一起效率高,因为一个人遇到问题,很难发现自己的问题在那里,而且好多细节都发现不了,自己编程代码错误率非常高,可是有队友可以降低代码错误率。而且在遇到自己掌握不太好的知识,而队友这块好,可以互补。而且自己平时写代码是写给自己看的,代码也不规范,可是有队友,就要尽量把代码写的让队友可以看懂,队友也会提出自己代码不规范,以后自己就会注意到这点,在以后的代码编程里,会更加严格要求自己,在这里,非常感觉杨老师,给了我这次机会,让我可以知道自己的不足,也非常感谢队友,纠正我的错误,同时我也意识到了自己编程能力差,还需要多多练习,虽然在结对作业中,我们有过争论,有个不愉快,但最终我们把整个工作一起做完,发现在工作的争执都是不可避免的,但是这也是一种成长。

(3) 至少5项在编码、争论、复审等活动中花费时间较长,给你较大收获的事件。 (10分)

1.编程语言选择:

一开始我主张用java,因为c太麻烦,我对python不熟悉,而队友主张用C,因为她java不太熟悉,在一番争执,我们做了功能分析,一开始都C和java都可以,但是在分析到第三个功能,我们俩就感觉难度越来越大,班里的同学建议用python,我们最终选择了Python.

2.括号匹配:

本来要用java的,可是在括号匹配这里,由于栈这块知识以及忘得差不多,所以放弃了。然后我们在网上搜索资料,正好看到有往届学长得代码,用0、1、2代替左括号,没有括号,右括号这三种情况,但是这块代码不多,理解起来还是比较困难得。

3.代码改善:

在第一个功能完成后,我们就在改善功能,一直在调bug ,总是会有好多Bug,各种问题,一个标点找了好好时间。

4.除数为0情况:

一开始没有考虑除数为零情况,所以运行总是有错误,这个问题真得不知道怎么办,除数不可以为零但是被除数可以为零,最后发现python 中可以限定随机数范围。

5.调用函数:

因为不熟悉Python,所以一开始看了好多Python函数,在代码中调用函数,都是一边编程一边查函数,这个时间也是非常耗时的。

 6代码规范:

因为Python和其他语言还不太一样,在编写代码时,总是在一行语句完成时多加一个分号,在定义新的变量时,也是经常给出类型,看来这原有的习惯需要多注意。

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

编程地点:一食堂二楼。

计算机:杨萍电脑。

可选项:学习区。

 

 要求3 使用coding.net做版本控制。checkin 前要求清理 临时文件、可执行程序,通常执行 build-clean可以达到效果。(25分)

源代码地址:https://e.coding.net/SpringSun/sizeyunsuan.git

原文地址:https://www.cnblogs.com/ping2yingshi/p/11575047.html