《关于我大一夏季学期python大作业写了一个计算器这件事》

用python写一个简单的科学计算器

这是我在这里写的第二篇帖子,就稍微长一点吧。

人在老家,初学python,水平有限,加上这几天玩光遇,python大作业只能尽力写到下面的水平,写得比较匆忙,希望大家不要嫌弃。大家可以拿去修改完善,添加一些新功能,比如角度与弧度的替换,求阶乘之类的功能。

虽然代码有点多,但是很多代码都是类似的,最后实现的基本和我手机上自带的计算器差不多,除了不能直接在文本框上进行数据修改,已经一些功能例如阶乘按我的思路编写有些困难之外,别的目前看来没出大问题www

具体编写思路就是用一个字符串和列表接受输入并显示,使人可读,另一个字符串和列表将输入以python可读的方式记录,最后用eval()转换成表达式由python替我们计算,这就不需要考虑数学运算的优先级了。

编写程序中还有一点需要考虑的就是乘号×的省略问题,数学上可以省略,但计算机就要考虑具体情况。

之前我说没有阶乘这个功能,主要是n!的结合性与其他运算是相反的,比如x^y运算,用"**("运算就可以实现与其他代码运算的结合性一致,就不会出错。大家可以试着修改改进。

因为是我的大作业,需要体现学习成果,主要还是往课上知识靠,应该不会太难懂。

第二次写帖子,也不懂那么多,就不放运行结果了,麻烦,大家可以复制粘贴康康。

不多说直接上代码!

简易科学计算器代码

from tkinter import messagebox,Menu,Tk,Frame,LEFT,TOP,Button,Text,END,RIGHT
from math import *
class Math:
    def __init__(self):#图形界面,简单朴素
        self.s=' '
        self.ssize=[]
        self.r=''
        self.rsize=[]
        self.res=''
        self.root=Tk()
        self.root.title("数学计算器")
        self.frm=Frame(self.root)
        self.root.geometry('400x340')
        self.frm.pack()
        self.menux=Menu(self.root)
        self.m1=Menu(self.menux,tearoff=0)
        self.menux.add_cascade(label='关于',menu=self.m1)
        self.m1.add_command(label='作者',command=self.writer)
        self.m1.add_command(label='计算器',command=self.calculator)
        self.m1.add_separator()
        self.m1.add_command(label='退出',command=self.root.quit)
        self.root.config(menu=self.menux)
        self.frm_M=Frame(self.frm)    
        self.t_show=Text(self.frm_M, width=30, height=5, font =('Verdana',15))
        self.t_show.pack()
        self.frm_M.pack(side=TOP)
        self.frm_R=Frame(self.frm)
        self.t_showr=Text(self.frm_R, width=30, height=1, font =('Verdana',15))
        self.t_showr.pack()
        self.frm_R.pack(side=TOP)
        self.frm_S0=Frame(self.frm)
        self.frm_S0zuo=Frame(self.frm_S0)
        self.frm_S1=Frame(self.frm_S0zuo)
        Button(self.frm_S1,text="C", width=5, height=1,command=self.clear, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S1,text="+", width=5, height=1,command=self.addx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S1,text="-", width=5, height=1,command=self.subx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S1,text="×", width=5, height=1,command=self.mulx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S1,text="÷", width=5, height=1,command=self.divx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S1,text="←", width=5, height=1,command=self.deletex, font=('Arial', 10)).pack(side=LEFT)
        self.frm_S1.pack(side=TOP)
        self.frm_S2=Frame(self.frm_S0zuo)
        Button(self.frm_S2,text="(", width=5, height=1,command=self.numberzuo, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S2,text=")", width=5, height=1,command=self.numberyou, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S2,text="x²", width=5, height=1,command=self.x2, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S2,text="x³", width=5, height=1,command=self.x3, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S2,text="x^y", width=5, height=1,command=self.xy, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S2,text="1/x", width=5, height=1,command=self.daoshu, font=('Arial', 10)).pack(side=LEFT)
        self.frm_S2.pack(side=TOP)
        self.frm_S0zuo.pack(side=LEFT)
        self.frm_S0you=Frame(self.frm_S0)
        Button(self.frm_S0you,text="=", width=5, height=3,command=self.resultx, font=('Arial', 10)).pack(side=RIGHT)
        self.frm_S0you.pack(side=LEFT)
        self.frm_S0.pack(side=TOP)
        self.frm_S3=Frame(self.frm)
        Button(self.frm_S3,text="π", width=5, height=1,command=self.numberpi, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S3,text="sin", width=5, height=1,command=self.sinx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S3,text="cos", width=5, height=1,command=self.cosx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S3,text="tan", width=5, height=1,command=self.tanx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S3,text="e", width=5, height=1,command=self.numbere, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S3,text="ln", width=5, height=1,command=self.lnx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S3,text="log", width=5, height=1,command=self.logx, font=('Arial', 10)).pack(side=LEFT)
        self.frm_S3.pack(side=TOP)
        self.frm_S4=Frame(self.frm)
        Button(self.frm_S4,text="√ ̄", width=5, height=1,command=self.kai_2_fang, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S4,text="arcsin", width=5, height=1,command=self.arcsinx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S4,text="arccos", width=5, height=1,command=self.arccosx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S4,text="arctan", width=5, height=1,command=self.arctanx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S4,text="n√ ̄", width=5, height=1,command=self.kai_n_fang, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S4,text="e^x", width=5, height=1,command=self._ex, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S4,text="10^x", width=5, height=1,command=self._10x, font=('Arial', 10)).pack(side=LEFT)
        self.frm_S4.pack(side=TOP)
        self.frm_S5=Frame(self.frm)
        Button(self.frm_S5,text="1", width=5, height=1,command=self.number1, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S5,text="2", width=5, height=1,command=self.number2, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S5,text="3", width=5, height=1,command=self.number3, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S5,text="4", width=5, height=1,command=self.number4, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S5,text="5", width=5, height=1,command=self.number5, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S5,text="6", width=5, height=1,command=self.number6, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S5,text="%", width=5, height=1,command=self.numberpercent, font=('Arial', 10)).pack(side=LEFT)
        self.frm_S5.pack(side=TOP)
        self.frm_S6=Frame(self.frm)
        Button(self.frm_S6,text="7", width=5, height=1,command=self.number7, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S6,text="8", width=5, height=1,command=self.number8, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S6,text="9", width=5, height=1,command=self.number9, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S6,text="0", width=5, height=1,command=self.number0, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S6,text="INT", width=5, height=1,command=self.intx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S6,text="|x|", width=5, height=1,command=self.absx, font=('Arial', 10)).pack(side=LEFT)
        Button(self.frm_S6,text=".", width=5, height=1,command=self.numberpoint, font=('Arial', 10)).pack(side=LEFT)
        self.frm_S6.pack(side=TOP)
        self.root.mainloop()
    def writer(self):
        messagebox.showinfo(title='关于作者',message='他是个好人!❤')
    def calculator(self):
        messagebox.showinfo(title='关于计算器',message='已实现作者的预期目标✌,有待优化升级✍')
    def number1(self):#输入1
        if self.s[-1] in ')eπ':
            self.r=self.r+'*1'
            self.rsize.append(2)
        else:
            self.r=self.r+'1'
            self.rsize.append(1)
        self.s=self.s+'1'
        self.ssize.append(1)
        self.show()
    def number2(self):#输入2
        if self.s[-1] in ')eπ':
            self.r=self.r+'*2'
            self.rsize.append(2)
        else:
            self.r=self.r+'2'
            self.rsize.append(1)
        self.s=self.s+'2'
        self.ssize.append(1)
        self.show()
    def number3(self):#输入3
        if self.s[-1] in ')eπ':
            self.r=self.r+'*3'
            self.rsize.append(2)
        else:
            self.r=self.r+'3'
            self.rsize.append(1)
        self.s=self.s+'3'
        self.ssize.append(1)
        self.show()
    def number4(self):#输入4
        if self.s[-1] in ')eπ':
            self.r=self.r+'*4'
            self.rsize.append(2)
        else:
            self.r=self.r+'4'
            self.rsize.append(1)
        self.s=self.s+'4'
        self.ssize.append(1)
        self.show()
    def number5(self):#输入5
        if self.s[-1] in ')eπ':
            self.r=self.r+'*5'
            self.rsize.append(2)
        else:
            self.r=self.r+'5'
            self.rsize.append(1)
        self.s=self.s+'5'
        self.ssize.append(1)
        self.show()
    def number6(self):#输入6
        if self.s[-1] in ')eπ':
            self.r=self.r+'*6'
            self.rsize.append(2)
        else:
            self.r=self.r+'6'
            self.rsize.append(1)
        self.s=self.s+'6'
        self.ssize.append(1)
        self.show()
    def number7(self):#输入7
        if self.s[-1] in ')eπ':
            self.r=self.r+'*7'
            self.rsize.append(2)
        else:
            self.r=self.r+'7'
            self.rsize.append(1)
        self.s=self.s+'7'
        self.ssize.append(1)
        self.show()
    def number8(self):#输入8
        if self.s[-1] in ')eπ':
            self.r=self.r+'*8'
            self.rsize.append(2)
        else:
            self.r=self.r+'8'
            self.rsize.append(1)
        self.s=self.s+'8'
        self.ssize.append(1)
        self.show()
    def number9(self):#输入9
        if self.s[-1] in ')eπ':
            self.r=self.r+'*9'
            self.rsize.append(2)
        else:
            self.r=self.r+'9'
            self.rsize.append(1)
        self.s=self.s+'9'
        self.ssize.append(1)
        self.show()
    def number0(self):#输入0
        if self.s[-1] in ')eπ':
            self.r=self.r+'*0'
            self.rsize.append(2)
        else:
            self.r=self.r+'0'
            self.rsize.append(1)
        self.s=self.s+'0'
        self.ssize.append(1)
        self.show()
    def numberpoint(self):#输入小数点.
        self.s=self.s+'.'
        self.r=self.r+'.'
        self.ssize.append(1)
        self.rsize.append(1)
        self.show()
    def numberpercent(self):#输入百分号%
        self.s=self.s+'%'
        self.r=self.r+'/100'
        self.ssize.append(1)
        self.rsize.append(4)
        self.show()
    def clear(self):#清除
        self.s=' '
        self.r=''
        self.ssize.clear()
        self.rsize.clear()
        self.t_showr.delete(0.0,END)
        self.show()
    def resultx(self):#得出结果
        count1=self.r.count('(')
        count2=self.r.count(')')
        n=count1-count2
        self.r=self.r+')'*n
        try:
            self.res=str(round(eval(self.r),8))
        except:
            self.t_showr.delete(0.0,END)
            self.t_showr.insert('insert','错误')
        else:
            self.t_showr.delete(0.0,END)
            self.t_showr.insert('insert','='+self.res)
            self.show()
        finally:
            if n>0:
                self.r=self.r[:-n]
    def numbere(self):#输入e
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*e'
            self.rsize.append(2)
        else:
            self.r=self.r+'e'
            self.rsize.append(1)
        self.s=self.s+'e'
        self.ssize.append(1)
        self.show()
    def numberpi(self):#输入π
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*pi'
            self.rsize.append(3)
        else:
            self.r=self.r+'pi'
            self.rsize.append(2)
        self.s=self.s+'π'
        self.ssize.append(1)
        self.show()
    def addx(self):#选择+
        self.s=self.s+'+'
        self.r=self.r+'+'
        self.ssize.append(1)
        self.rsize.append(1)
        self.show()
    def subx(self):#选择-
        self.s=self.s+'-'
        self.r=self.r+'-'
        self.ssize.append(1)
        self.rsize.append(1)
        self.show()
    def mulx(self):#选择×
        self.s=self.s+'×'
        self.r=self.r+'*'
        self.ssize.append(1)
        self.rsize.append(1)
        self.show()
    def divx(self):#选择÷
        self.s=self.s+'÷'
        self.r=self.r+'/'
        self.ssize.append(1)
        self.rsize.append(1)
        self.show()
    def numberzuo(self):#输入(
        self.s=self.s+'('
        self.r=self.r+'('
        self.ssize.append(1)
        self.rsize.append(1)
        self.show()
    def numberyou(self):#输入)
        self.s=self.s+')'
        self.r=self.r+')'
        self.ssize.append(1)
        self.rsize.append(1)
        self.show()
    def deletex(self):#选择删
        if len(self.ssize)!=0:
            n=self.ssize[-1]
            self.s=self.s[:-n]
            self.ssize.pop(-1)
        if len(self.rsize)!=0:
            m=self.rsize[-1]
            self.r=self.r[:-m]
            self.rsize.pop(-1)
        self.show()
    def sinx(self):#选择sin
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*sin('
            self.rsize.append(5)
        else:
            self.r=self.r+'sin('
            self.rsize.append(4)
        self.s=self.s+'sin('
        self.ssize.append(4)
        self.show()
    def cosx(self):#选择cos
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*cos('
            self.rsize.append(5)
        else:
            self.r=self.r+'cos('
            self.rsize.append(4)
        self.s=self.s+'cos('    
        self.ssize.append(4)
        self.show()
    def tanx(self):#选择tan
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*tan('
            self.rsize.append(5)
        else:
            self.r=self.r+'tan('
            self.rsize.append(4)
        self.s=self.s+'tan('
        self.ssize.append(4)
        self.show()
    def arcsinx(self):#选择arcsin
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*asin('
            self.rsize.append(6)
        else:
            self.r=self.r+'asin('
            self.rsize.append(5)
        self.s=self.s+'arcsin('
        self.ssize.append(7)
        self.show()
    def arccosx(self):#选择arccos
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*acos('
            self.rsize.append(6)
        else:
            self.r=self.r+'acos('
            self.rsize.append(5)
        self.s=self.s+'arccos('
        self.ssize.append(7)
        self.show()
    def arctanx(self):#选择arctan
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*atan('
            self.rsize.append(6)
        else:
            self.r=self.r+'atan('
            self.rsize.append(5)
        self.s=self.s+'arctan('
        self.ssize.append(7)
        self.show()
    def lnx(self):#选择ln
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*log('
            self.rsize.append(5)
        else:
            self.r=self.r+'log('
            self.rsize.append(4)
        self.s=self.s+'ln('
        self.ssize.append(3)
        self.show()
    def logx(self):#选择log
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*log10('
            self.rsize.append(7)
        else:
            self.r=self.r+'log10('
            self.rsize.append(6)
        self.s=self.s+'log('
        self.ssize.append(4)
        self.show()
    def x2(self):#选择x^2
        self.s=self.s+'^(2)'
        self.r=self.r+'**2'
        self.ssize.append(4)
        self.rsize.append(3)
        self.show()
    def x3(self):#选择x^3
        self.s=self.s+'^(3)'
        self.r=self.r+'**3'
        self.ssize.append(4)
        self.rsize.append(3)
        self.show()
    def xy(self):#选择x^y
        self.s=self.s+'^('
        self.r=self.r+'**('
        self.ssize.append(2)
        self.rsize.append(3)
        self.show()
    def _ex(self):#选择e^x
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*e**('
            self.rsize.append(5)
        else:
            self.r=self.r+'e**('
            self.rsize.append(4)
        self.s=self.s+'e^('
        self.ssize.append(3)
        self.show()
    def _10x(self):#选择10^x
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*10**('
            self.rsize.append(6)
        else:
            self.r=self.r+'10**('
            self.rsize.append(5)
        self.s=self.s+'10^('
        self.ssize.append(4)
        self.show()
    def daoshu(self):#选择1/x
        self.s=self.s+'^(-1)'
        self.r=self.r+'**(-1)'
        self.ssize.append(5)
        self.rsize.append(6)
        self.show()
    def kai_2_fang(self):#开根号
        if '0'<=self.s[-1]<='9' or self.s[-1] in ')eπ':
            self.r=self.r+'*sqrt('
            self.rsize.append(6)
        else:
            self.r=self.r+'sqrt('
            self.rsize.append(5)
        self.s=self.s+'√'
        self.ssize.append(1)
        self.show()
    def kai_n_fang(self):#开n次根号
        self.s=self.s+'^(1÷'
        self.r=self.r+'**(1/'
        self.ssize.append(4)
        self.rsize.append(5)   
        self.show()
    def intx(self):#结果取整
        tempx=round(eval(self.res),0)
        self.t_showr.delete(0.0,END)
        self.t_showr.insert('insert','='+str(int(tempx)))
    def absx(self):#结果取绝对值
        tempx=eval(self.res)
        self.t_showr.delete(0.0,END)
        self.t_showr.insert('insert','='+str(abs(tempx)))
    def show(self):#表达式展示
        self.t_show.delete(0.0,END)
        self.t_show.insert('insert',self.s)
if __name__ == "__main__":
    m=Math()

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值