20193417 2019-2020-2 《Python程序设计》实验二报告

20193417 2019-2020-2 《Python程序设计》实验二报告

  • 课程:《Python程序设计》

  • 班级:1934

  • 姓名:段恺宇

  • 学号:20193417

  • 实验教师:王志强

  • 实验日期:2020年4月11日

  • 必修/选修: 公选课

1. 实验内容

  • 设计并完成一个完整的应用程序,完成加减乘除模等运算,功能多多益善。

  • 考核基本语法、判定语句、循环语句、逻辑运算等知识点

2. 实验过程及结果

1. 过程

1.首先建立一个用于计算的Cal()类,并在其中定义好储存运算结果的属性result,用于加减乘除、平方、n次方、取倒数、取百分号、清零的方法

 

 

 

2.定义变量ult_result作为对象,利用while True死循环进行多次运算,让用户通过数字指定运算操作符,并通过if-else语句判断用户要求的运算

 

 

 

 

3.当用户输入字符时,利用break语句跳出循环,结束计算

 

源代码:

#定义计算类
class Cal:
 result = 0
 def plus(self, num1):    #加法
     self.result += num1
     print('=',self.result)

 def minus(self, num1):    #减法
     self.result -= num1 
     print('=',self.result)
 def times(self, num1):    #乘法
     self.result *= num1 
     print('=',self.result)
 def devide(self, num1):    #除法 
     try:
         self.result /= num1 
     except:
         print("MathError!")             #不能除以零
         self.result = 0
     print('=',self.result)
 
 def square(self, num1):       #平方 
     self.result = pow(num1,2)
     print('=',self.result)
 def nth_power(self, num1, num2):    #n次方
     self.result = pow(num1 , num2)
     print('=',self.result)
 def reciprocal(self, num1):     #取倒数
     self.result = 1 / num1
     print('=',self.result)
 def percent_sign(self, num1):    #百分号
     self.result = num1 * 0.01
     print('=',self.result)
 def clear(self):                  #清除数据
     self.result = 0
     print('0')

opr = {1:'+',2:'-',3: '*',4: '÷',5: 'x²',6: 'x^n',7: '1/x',8: '%',9: 'CLEAR','p': '()'}     #用户输入代号,如何立刻返回对应符号
numget1 = float(input('计算开始\n'))
ult_result = Cal()
ult_result.result = numget1
while True:
 print('='*20,"\n1. +\t2. -\t3. *\n4. ÷\t5. x²\t6. x^n\n7. 1/x\t8. %\t9. CLEAR\n'p':()\n",'='*20)
 try:
     signget1 = int(input())
     print(ult_result.result,opr[signget1])
     if 1<=signget1<= 4:
         numget2 = input()
         if numget2 == 'p':                           #如果输入括号的情况
             print('()')
             num_emptybox = ult_result.result          #将原值储存
             sign_emptybox = signget1                    #将原操作符储存
             ult_result.result = float(input())
             print('='*20,"\n1. +\t2. -\t3. *\n4. ÷\t5. x²\t6. x^n\n7. 1/x\t8. %\t9. CLEAR\n'p':()\n",'='*20)
             signget1 = int(input())
             print(ult_result.result,opr[signget1])
             if (1<=signget1) and (signget1 <= 4):
                 numget2 = float(input())
             if signget1 == 1 :
                 print(ult_result.result,'+',numget2)
                 ult_result.plus(numget2)
             elif signget1 == 2:
                 print(ult_result.result,'-',numget2)
                 ult_result.minus(numget2)
             elif signget1 == 3:
                 print(ult_result.result,'x',numget2)
                 ult_result.times(numget2)
             elif signget1 == 4:
                 print(ult_result.result,'÷',numget2)
                 ult_result.devide(numget2)
             elif signget1 == 5:
                 ult_result.square(ult_result.result)
             elif signget1 == 6:
                 nth = float(input("n = "))
                 ult_result.nth_power(ult_result.result,nth)
             elif signget1 == 7:
                 ult_result.reciprocal(ult_result.result)
             elif signget1 == 8:
                 ult_result.percent_sign(ult_result.result)
             num2_emptybox = ult_result.result       ##将新值储存
             ult_result.result = num_emptybox        ##将原值重新调用
             signget1 = sign_emptybox                #将原操作符重新调用
             numget2 =num2_emptybox                  ##将新值调用
         numget2 = float(numget2)
     if signget1 == 1 :
         print(ult_result.result,'+',numget2)
         ult_result.plus(numget2)       
     elif signget1 == 2:
         print(ult_result.result,'-',numget2)
         ult_result.minus(numget2)
     elif signget1 == 3:
         print(ult_result.result,'x',numget2)
         ult_result.times(numget2)
     elif signget1 == 4:
         print(ult_result.result,'÷',numget2)
         ult_result.devide(numget2)
     elif signget1 == 5:
         ult_result.square(ult_result.result)
     elif signget1 == 6:
         nth = float(input("n = "))
         ult_result.nth_power(ult_result.result, nth)
     elif signget1 == 7:
         ult_result.reciprocal(ult_result.result)
     elif signget1 == 8:
         ult_result.percent_sign(ult_result.result)
     elif signget1 == 9:
         ult_result.clear()
         continue
 except :
     print('计算结束')    
     break

2. 结果

1.以1 + 2 = 3 为例

 

 

2.以3 x (5 - 2)= 9为例

 

 

3.以 5³ + 1/5 = 125.2 为例

 

 

 


3. 实验过程中遇到的问题和解决过程

  • 问题1:除法中0不能为除数,否则会报错,如何设置报错机制?

    • 问题1解决方案:利用try/except语句,提示“MathError!”

  • 问题2:用户在指定完操作符后,如何迅速返回对应的符号?

    • 问题2解决方案:利用字典,将1~9、‘p'设为索引值,将运算符“+”、“-”等等设置为对应的值,将用户输入的指定数字用做索引值,读取并输出字典对应的内容

      opr = {1:'+',2:'-',3: '*',4: '÷',5: 'x²',6: 'x^n',7: '1/x',8: '%',9: 'CLEAR','p': '()'}
      signget1 = int(input())
      print(ult_result.result,opr[signget1])
      

        

  • 问题3:要赋予用户使用括号的权利,如何操作?

    • 问题3解决方案:使用字符’p'作为括号的指定符号,当用户输入第二个运算数字的时候,用if语句判断用户是否输入了p

      if numget2 == 'p':                           #如果输入括号的情况
            print('()')
      

        

       

      若使用括号,则之前输入的运算数字(已储存到ult_result.result当中)以及运算符指定数字 signget1 应该用新的“容器”—num_emptybox、sign_emptybox储存起来,在执行完括号里的内容之后重新调用

      num_emptybox = ult_result.result          #将原值储存
      sign_emptybox = signget1                    #将原操作符储存
      #省略括号内运算过程
      num2_emptybox = ult_result.result       ##将新值储存
      ult_result.result = num_emptybox        ##将原值重新调用
      signget1 = sign_emptybox                #将原操作符重新调用
      numget2 =num2_emptybox                  ##将新值调用
      

        

其他(感悟、思考等)

编写一个计算器的代码比想象中的要复杂的多,在代码行数很多的情况下,要时刻注意查看代码是否有错误,否则在运行的时候出错很难查错,因此debug的使用也至关重要。我编写的程序还有很多可以改进的地方,比如在多次运用if-else语句判断用户要进选用什么运算符时,可以设置一个函数专门有这样的功能,以秉持编程界“DRY”(Don't repeat yourself)的精神。

在网上看了看大神写的计算器程序,达300多行,而且运行终端可以生成可视窗口,十分之高级。想学,可惜自己水平有限,看不懂他的程序,只能自己编写低端版计算器程序。知道自己的技不如人后才感觉还要多多努力学习。


参考资料

posted on 2020-04-15 22:59  DuKeYu  阅读(175)  评论(0编辑  收藏  举报