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多行,而且运行终端可以生成可视窗口,十分之高级。想学,可惜自己水平有限,看不懂他的程序,只能自己编写低端版计算器程序。知道自己的技不如人后才感觉还要多多努力学习。