20183423 实验二《Python程序设计》实验报告

------------恢复内容开始------------

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

课程:《Python程序设计》
班级: 201834
姓名: 刘子毅
学号: 20183423
实验教师:王志强
实验日期:2020年4月13日
必修/选修: 公选课

## 1.实验内容

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

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

## 2. 实验过程及结果
代码:

  

# coding:utf-8
'''
文件名:实验二计算器.py
作者:20183423

注:可能括号多了程序会卡
'''
import re
import math


class FourFundementalRules(): # 四 则 运 算 (英文是百度的,我的English is poor)

_message_ = '''
这是一个四则运算的类,不能计算带括号的内容。
'''

def __init__(self, expression):
self.expression = expression

def addition(self, expression): # 将传入的两个数相加
data = expression.split('+')
return str(float(data[0]) + float(data[1]))

def substraction(self, expression): # 将传入的两个数相减
if expression.startswith('-'): # 可能为负数
data = expression[1:].split('-', 1)
data[0] = '-' + data[0]
else:
data = expression.split('-', 1)
return str(float(data[0]) - float(data[1]))

def multiplication(self, expression): # 将传入的两个数相乘
data = expression.split('*')
return str(float(data[0]) * float(data[1]))

def division(self, expression): # 将传入的两个数相除
data = expression.split('/')
return str(float(data[0]) / float(data[1]))

def calculation(self, expression): ##一步步计算表达式的值
expression = expression.group()
if '+' in expression:
return self.addition(expression)
if '-' in expression:
return self.substraction(expression)
if '*' in expression:
return self.multiplication(expression)
if '/' in expression:
return self.division(expression)

def priority(self, expression): # 运算中乘除法优先级比加减法高
pattern_higher = re.compile('(\d+\.?\d*(\*|\/)+\-?\d+\.?\d*)') # 利用正则表达式提取高优先级运算的项
pattern_lower = re.compile('(\-?\d+\.?\d*(\+|\-)+\d+\.?\d*)') # 提取低优先级运算
if re.search(pattern_higher, expression): # 将项送入四则运算的方法中,进行递归,直到得到只有一个值的字符串返回结果
expression = re.sub(pattern_higher, self.calculation, expression) # 这是乘除
return self.priority(expression)
elif re.search(pattern_lower, expression):
expression = re.sub(pattern_lower, self.calculation, expression) # 这是加减
return self.priority(expression)
else:
new_expr = expression
return new_expr


def calculateBracket(expression): # 通过递归的方式来消除括号里的内容
createnewclass = FourFundementalRules(expression) # 创建类
if '(' in expression or ')' in expression: # 如果有括号,执行内容
_1st_RBracket = expression.find(')') # 定位右括号
_1st_LBracket = 0
for i in range(_1st_RBracket):
if expression[_1st_RBracket - i] == '(': # 找到离定位的右括号最近的左括号
_1st_LBracket = _1st_RBracket - i
break
bracket_expression = expression[_1st_LBracket:_1st_RBracket + 1] # 将这个括号和里面的算式分离出来
delete_left_bracket = bracket_expression.lstrip('(')
delete_all_bracket = delete_left_bracket.rstrip(')') # 去括号
tempStr = createnewclass.priority(delete_all_bracket) # 进行计算
new_expression = expression.replace(bracket_expression, tempStr)
return calculateBracket(new_expression) # 递归,直到无括号进入到else返回结果
else: # 如果无括号直接调用四则运算的方法
result = createnewclass.priority(expression)
return result


# 菜单
menu = '''

1.基本四则运算
2.模运算
3.角度制→弧度制
4.弧度制→角度制
0.E X I T
'''
print(menu)
# 循环运行的程序
while (1):
choice = input('你选:')
if choice == '1':
expression = input('输入需要计算的四则运算表达式,如:8*((32+12)-(77-34))+33,输入EXIT退出' + '\n')
result = calculateBracket(expression)
print(result)
elif choice == '2':
num0 = int(input('被模的数:'))
num1 = int(input('模数:'))
print('结果为:', num0 // num1, '余:', math.fmod(num0, num1))
elif choice == '3':
deg = float(input('输入角度:'))
print(math.radians(deg))
elif choice == '4':
rad = float(input('输入弧度:'))
print(math.degrees(rad))
elif choice == '0':
break # 跳出循环,结束程序
else:
print('无此选项!')

 

 

 

## 3. 实验过程中遇到的问题和解决过程
- 问题1:如何判断加减乘除的符号
- 问题1解决方案:通过判断输入的符号来进行相应的运算。
- 问题2:如何进行其他的运算
- 问题2解决方案:通过一个循环判断用户输入的判断数,如果判断数为0,那么就停止循环,如果是其他,就进行相应的运算。
- ...


## 其他(感悟、思考等)

    这次实验让我熟悉了一遍Python语言的灵活性,我在编写这段代码的时候,将已学过的C语言的知识结合其中,并且进行了对应的拓展,有了明显的提升。

## 参考资料

-  [《Java程序设计与数据结构教程(第二版)》](https://book.douban.com/subject/26851579/)

-  [《Java程序设计与数据结构教程(第二版)》学习指导](http://www.cnblogs.com/rocedu/p/5182332.html)

------------恢复内容结束------------

posted @ 2020-04-20 22:39  南瓜瓜的马车  阅读(185)  评论(0编辑  收藏  举报