Boost.Spirit——60行代码实现一个计算器

合集下载

软件代做:利用Python编写一个行业专用的小计算器

软件代做:利用Python编写一个行业专用的小计算器

软件代做:利⽤Python编写⼀个⾏业专⽤的⼩计算器前⾔:本⽂讲述的是如何利⽤python编程制作⼀个适⽤于指定⾏业的计算器,⽅便计算结果,涵盖的知识点由Python编写GUI界⾯程序,利⽤爬⾍采集实时的汇率数据,将Python⽂件打包成可以单独运⾏的exe⽂件。

⾸先,分析我们的需求,编写⼀个适⽤于指定⾏业的计算器,这⾥我们⽤到的计算公式很简单,就是淘宝提供的⾦⽯定价公式,如下图所⽰淘宝定价计算器这⾥可以看到这个计算公式还是蛮简单的,对于Python来说也就是⼀⾏代码的事,那么我们就开始着⼿写代码,⾸先搭建我们的页⾯布局,这⾥我们采⽤的是tkinter,这个框架在画GUI⽅⾯还是很简单⽅便的,⾸先给⼤家展⽰下我的最终布局,如下图所⽰最终样式其实也不是很好看,不过我已经尽我所能去美化了,其实功能很简单,就是⼏个输⼊框,两个按钮,点击计算按钮,获取输⼊框中的值,通过Python代码计算结果,最后将计算结果写⼊指定的输⼊框中,关于tkinter的组件介绍,可以⾃⾏百度,我这⾥就直接上代码了class Application():def __init__(self):super().__init__()self.createUI()def createUI(self):self.ft = tf.Font(family='微软雅⿊', size=18,weight=tf.BOLD)self.ft1 = tf.Font(family='微软雅⿊', size=12)self.fm = tk.Frame(self)bel = bel(self.fm,text="计算结果:",font=self.ft)bel.pack(side=tk.LEFT)self.fm_new1 = tk.Frame(self.fm)bel0 = bel(self.fm_new1,text="⼈民币:",font=self.ft1)bel0.pack(side=tk.LEFT)self.entry0 = tk.Entry(self.fm_new1,font=self.ft1)self.entry0.pack(side=tk.LEFT)bel11 = bel(self.fm_new1,text="美元:",font=self.ft1)bel11.pack(side=tk.LEFT)self.entry11 = tk.Entry(self.fm_new1,font=self.ft1)self.entry11.pack(side=tk.LEFT)self.fm_new1.pack(side=tk.TOP,padx=5, pady=10)self.fm_new2 = tk.Frame(self.fm)bel12 = bel(self.fm_new2,text="新加坡币:",font=self.ft1)bel12.pack(side=tk.LEFT)self.entry12 = tk.Entry(self.fm_new2,font=self.ft1)self.entry12.pack(side=tk.LEFT)bel13 = bel(self.fm_new2,text="⽇元:",font=self.ft1)bel13.pack(side=tk.LEFT)self.entry13 = tk.Entry(self.fm_new2,font=self.ft1)self.entry13.pack(side=tk.LEFT)self.fm_new2.pack(side=tk.TOP,padx=5, pady=10)self.fm.pack(side=tk.TOP,padx=5, pady=10)self.fm1 = tk.Frame(self)bel1 = bel(self.fm1,text="⾦重:",font=self.ft1)bel1.pack(side=tk.LEFT,padx=10, pady=10)self.entry1 = tk.Entry(self.fm1,font=self.ft1)self.entry1.pack(side=tk.LEFT,padx=5, pady=10)bel10 = bel(self.fm1,text="浮动⽐率:",font=self.ft1)bel10.pack(side=tk.LEFT,padx=10, pady=10)self.entry10 = tk.Entry(self.fm1,font=self.ft1)self.entry10.pack(side=tk.LEFT,anchor=tk.W,padx=5, pady=10)self.fm1.pack(side=tk.TOP,padx=5, pady=5)self.fm2 = tk.Frame(self)bel2 = bel(self.fm2,text="⾦价:",font=self.ft1)bel2.pack(side=tk.LEFT,padx=10, pady=10)self.entry2 = tk.Entry(self.fm2,font=self.ft1)self.entry2.pack(side=tk.LEFT,padx=5, pady=10)be3 = bel(self.fm2,text="14K/18K:",font=self.ft1)be3.pack(side=tk.LEFT,padx=10, pady=10)self.entry3 = tk.Entry(self.fm2,font=self.ft1)self.entry3.pack(side=tk.LEFT,padx=5, pady=10)self.fm2.pack(side=tk.TOP,padx=5, pady=5)self.fm3 = tk.Frame(self)bel4 = bel(self.fm3,text="主⽯重:",font=self.ft1)bel4.pack(side=tk.LEFT,padx=10, pady=10)self.entry4 = tk.Entry(self.fm3,font=self.ft1)self.entry4.pack(side=tk.LEFT,padx=5, pady=10)bel5 = bel(self.fm3,text="价格:",font=self.ft1)bel5.pack(side=tk.LEFT,padx=10, pady=10)self.entry5 = tk.Entry(self.fm3,font=self.ft1)self.entry5.pack(side=tk.LEFT,padx=5, pady=10)self.fm3.pack(side=tk.TOP,padx=5, pady=5)self.fm4 = tk.Frame(self)bel6 = bel(self.fm4,text="副⽯重:",font=self.ft1)bel6.pack(side=tk.LEFT,padx=10, pady=10)self.entry6 = tk.Entry(self.fm4,font=self.ft1)self.entry6.pack(side=tk.LEFT,padx=5, pady=10)be7 = bel(self.fm4,text="价格:",font=self.ft1)be7.pack(side=tk.LEFT,padx=10, pady=10)self.entry7 = tk.Entry(self.fm4,font=self.ft1)self.entry7.pack(side=tk.LEFT,padx=5, pady=10)self.fm4.pack(side=tk.TOP,padx=5, pady=5)self.fm5 = tk.Frame(self)bel8 = bel(self.fm5,text="⼯费:",font=self.ft1)bel8.pack(side=tk.LEFT,padx=10, pady=10)self.entry8 = tk.Entry(self.fm5,font=self.ft1)self.entry8.pack(side=tk.LEFT,padx=5, pady=10)be9 = bel(self.fm5,text="设计费:",font=self.ft1)be9.pack(side=tk.LEFT,padx=5, pady=10)self.entry9 = tk.Entry(self.fm5,font=self.ft1)self.entry9.pack(side=tk.LEFT,padx=10, pady=10)self.fm5.pack(side=tk.TOP,padx=5, pady=5)self.fm6 = tk.Frame(self)self.selectButton = tk.Button(self.fm6, text="重置", command=self.selectFile,font=self.ft1)self.selectButton.pack(side=tk.LEFT,padx=10, pady=10)self.startButton = tk.Button(self.fm6, text="计算", command=lambda :self.thread_it(self.startAction),font=self.ft1)self.startButton.pack(side=tk.LEFT,padx=10, pady=10)self.fm6.pack(side=tk.TOP,padx=5, pady=5)self.title("我的计算器")#窗⼝⼤⼩width ,height= 600, 500#窗⼝居中显⽰self.geometry('%dx%d+%d+%d' % (width,height,(self.winfo_screenwidth() - width ) / 2, (self.winfo_screenheight() - height) / 2))#窗⼝最⼤值self.maxsize(600, 500)#窗⼝最⼩值self.minsize(300,200)self.entry0.insert('end',0)self.entry1.insert('end',0)self.entry2.insert('end',0)self.entry3.insert('end',0)self.entry4.insert('end',0)self.entry5.insert('end',0)self.entry6.insert('end',0)self.entry7.insert('end',0)self.entry8.insert('end',150)self.entry9.insert('end',50)self.entry10.insert('end',1.25)self.entry11.insert('end',0)self.entry12.insert('end',0)self.entry13.insert('end',0)说实话这段代码写的很随意,变量命名很随意,因为很多都是重复的东西,这⾥⼤致讲⼀下,⾸先是创建定义⼀个类继承⾃tkinter,这就相当于整个对象就是⼀个窗体了,之后就在这个窗体中进⾏布局,这⾥我们采⽤的是pack布局,说⽩了就是浮动布局,就是按照⼀⾏或者⼀列依次排列组件,这⾥就是利⽤Frame组件⽣成了⼏⾏的布局,然后在每个Frame⾥排列我们的标签和输⼊框,其中包含的⼀些细节就是组件的字体,组件之间的间距之类,完成了布局这⼀步之后,我们需要给按钮绑定事件,就是点击按钮触发什么操作,这⾥我们有两个按钮。

如何用Python实现一个简单的计算器

如何用Python实现一个简单的计算器

如何用Python实现一个简单的计算器Python是一种高级编程语言,它的简洁语法和丰富的内置函数使它非常适合用来实现各种应用程序,包括简单的计算器。

在这篇文章中,我将向您展示如何使用Python编写一个简单的计算器。

首先,我们需要了解计算器的基本功能。

一个简单的计算器通常具有加法、减法、乘法和除法等基本运算。

因此,我们需要编写函数来执行这些运算。

接下来,我们需要编写一个循环,使得用户可以重复使用计算器,直到他们选择退出。

下面是一个实现上述功能的示例代码:```pythondef add(x, y):"""加法运算"""return x + ydef subtract(x, y):"""减法运算"""return x - ydef multiply(x, y):"""乘法运算"""return x * ydef divide(x, y):"""除法运算"""return x / ywhile True:print("选择您想要执行的操作:") print("1.加法")print("2.减法")print("3.乘法")print("4.除法")print("5.退出")choice = input("输入您的选择(1/2/3/4/5): ")if choice == '5':print("感谢使用计算器!再见!")breaknum1 = float(input("输入第一个数字: "))num2 = float(input("输入第二个数字: "))if choice == '1':print(num1, "+", num2, "=", add(num1, num2))elif choice == '2':print(num1, "-", num2, "=", subtract(num1, num2)) elif choice == '3':print(num1, "*", num2, "=", multiply(num1, num2)) elif choice == '4':if num2 == 0:print("错误:除数不能为0!")else:print(num1, "/", num2, "=", divide(num1, num2))else:print("无效的输入,请重新选择!")```在这段代码中,我们首先定义了四个函数来执行加法、减法、乘法和除法运算。

自动计算boost的表格

自动计算boost的表格

自动计算boost的表格
摘要:
一、引言
二、什么是Boost
三、自动计算Boost的表格
1.表格的创建
2.表格的自动计算功能
3.表格的应用场景
四、总结
正文:
自动计算Boost的表格在数据分析、统计学、金融等领域具有广泛的应用。

Boost是一种集成学习方法,通过加权训练数据的方式,逐步构建多个弱学习器,从而提高模型的预测性能。

为了更好地理解和使用Boost,本文将介绍自动计算Boost的表格。

首先,我们需要创建一个包含特征和权重的表格。

表格的列包括特征名称、特征值、权重等。

在这个表格中,每一行代表一个样本,每一列代表一个特征。

通过对表格进行操作,我们可以实现自动计算Boost的功能。

表格的自动计算功能主要体现在对特征值和权重的计算上。

通过对特征值进行加权平均计算,我们可以得到每个特征的权重。

这些权重将用于构建Boost模型,从而提高模型的预测性能。

自动计算Boost的表格在实际应用中具有很大的价值。

例如,在金融领
域,我们可以通过表格中的数据来预测股票的价格走势。

在医疗领域,我们可以通过表格中的数据来预测病人的病情。

在市场营销领域,我们可以通过表格中的数据来预测客户的需求。

总之,自动计算Boost的表格是一种非常有用的工具,可以帮助我们更好地理解和使用Boost方法。

如何使用Python编写一个简单的计算器

如何使用Python编写一个简单的计算器

如何使用Python编写一个简单的计算器前言:计算器是我们日常生活中经常使用的工具,它可以对数字进行各种运算。

现在,我们将介绍如何使用Python编写一个简单的计算器,以帮助我们更好地理解计算器的原理和实现。

一、了解计算器的基本功能在开始编写计算器之前,我们需要了解计算器的基本功能。

一个基本计算器通常具有加减乘除四则运算功能,并能够处理小数和负数。

同时,还可以实现一些其他常见的数学函数,例如开方、平方、取余等。

二、准备编程环境在编写计算器之前,我们需要准备好Python的编程环境。

首先,需要安装Python解释器。

你可以从Python官方网站下载适合你的操作系统的Python解释器,并按照官方提供的安装指南进行安装。

三、编写计算器的基本功能1. 实现加法功能首先,我们需要编写一个函数来实现加法功能。

以下是一个简单的加法函数的代码示例:```pythondef add(num1, num2):return num1 + num2```2. 实现减法功能接下来,我们可以编写一个函数来实现减法功能。

以下是一个简单的减法函数的代码示例:```pythondef subtract(num1, num2):return num1 - num2```3. 实现乘法功能然后,我们可以编写一个函数来实现乘法功能。

以下是一个简单的乘法函数的代码示例:```pythondef multiply(num1, num2):return num1 * num2```4. 实现除法功能最后,我们可以编写一个函数来实现除法功能。

以下是一个简单的除法函数的代码示例:```pythondef divide(num1, num2):return num1 / num2```四、完善计算器功能在上述代码的基础上,我们可以继续完善计算器的功能,使其更加实用。

1. 处理小数和负数为了能够处理小数,我们可以使用浮点数进行计算。

同时,我们还可以使用负数来实现减法和乘法的功能。

学习如何用Python编写简单的计算器

学习如何用Python编写简单的计算器

学习如何用Python编写简单的计算器计算器是我们日常生活中常用的工具之一,它可以帮助我们进行基本的数学运算。

在今天的文章中,我将向大家介绍如何使用Python编写一个简单的计算器。

首先,我们需要了解一些基本的Python概念和语法。

Python是一种高级编程语言,它简单易懂,并且有着广泛的应用领域。

为了编写这个计算器,我们将使用Python的基本运算符和控制流语句。

首先,我们需要创建一个函数来执行计算操作。

我们可以命名为"calculator"。

这个函数将接受用户输入的运算符号和两个数字,并返回计算结果。

```pythondef calculator(operator, num1, num2):```接下来,我们需要使用条件语句来判断运算符号,并执行相应的计算操作。

Python中的条件语句有if、elif和else。

我们可以使用多个elif语句来判断不同的运算符号。

```pythonif(operator == '+'):result = num1 + num2elif(operator == '-'):result = num1 - num2elif(operator == '*'):result = num1 * num2elif(operator == '/'):result = num1 / num2else:result = "Invalid operator"```在以上代码中,我们使用了加法、减法、乘法和除法运算符执行相应的计算操作。

如果用户输入的运算符不是其中之一,我们将返回一个错误提示。

最后,我们需要在函数中添加返回语句,以便函数返回计算结果。

```pythonreturn result```现在,我们已经完成了计算器函数的编写。

接下来,我们可以编写代码来调用这个函数并进行测试。

如何用Python实现一个简单的计算器

如何用Python实现一个简单的计算器

如何用Python实现一个简单的计算器使用Python实现一个简单的计算器可以通过编写一个简单的交互式命令行程序来实现。

在这篇文章中,我将介绍如何使用Python编写一个基本的计算器,实现基本的加减乘除操作,并且添加一些额外的功能,比如括号、平方、开方等。

整篇文章将分为以下部分:介绍计算器的基本功能、计算器的实现步骤、实现过程中遇到的问题以及如何优化代码。

首先,让我们来介绍计算器的基本功能。

一个基本的计算器应该能够进行加法、减法、乘法和除法运算,同时应该支持括号、乘方、开方等操作。

在实现计算器的过程中,我们将会使用Python的基本数学运算库,比如math库来实现这些功能。

接下来,让我们来介绍计算器的实现步骤。

首先,我们需要定义一个函数来解析用户输入的表达式,并将其转换成计算机能够理解的形式。

然后,我们需要定义一个函数来对这个表达式进行计算,并返回计算结果。

在实现过程中,我们还需要考虑到一些特殊情况,比如用户输入错误的表达式、除数为0等情况。

在实现过程中,我们可能会遇到一些问题,比如如何处理用户输入的字符串、如何解析表达式、如何处理括号、如何转换后缀表达式等问题。

在这篇文章中,我将介绍如何解决这些问题,并给出一些实用的代码片段。

最后,让我们来谈谈如何优化代码。

在实现一个计算器的过程中,我们可能会遇到一些性能上的问题,比如计算速度慢、内存占用大等问题。

在这篇文章中,我将介绍一些优化代码的方法,比如使用缓存、减少不必要的计算、使用更高效的算法等方法。

总之,通过本文的阐述,您将学会如何使用Python编写一个简单的计算器,实现基本的加减乘除操作,并且添加一些额外的功能,比如括号、平方、开方等。

希望本文能够对您有所帮助。

首先,让我们定义一些基本的运算函数,比如加法、减法、乘法和除法。

这些函数将接收两个参数,然后返回计算结果。

我们还可以定义一些额外的辅助函数,比如求平方、开方等等。

接下来,我们需要定义一个函数来解析用户输入的表达式,并将其转换成计算机能够理解的形式。

用Python编写简单的计算器

用Python编写简单的计算器

用Python编写简单的计算器在计算机编程中,计算器是一种非常基础而常用的工具。

通过Python编写一个简单的计算器程序,可以让我们更好地理解和应用基本计算的原理和方法。

本文将详细介绍如何使用Python来实现一个简单的计算器。

一、概述计算器是一种用于进行数值计算的工具,通常包括基本的算术运算(加法、减法、乘法、除法)和一些常用函数(如开方、取余等)。

而使用Python编写计算器程序,则可以通过编写算法和控制语句,实现这些计算功能。

二、编写计算器的基本框架1. 引入所需的库在Python编写计算器程序时,我们需要引入Python的一个内置数学库math。

通过使用该库中的函数和常量,我们可以方便地进行各种数学运算。

```pythonimport math```2. 定义计算器的主函数我们可以使用一个主函数来实现计算器的主要功能。

在主函数中,我们可以通过接收用户的输入来判断所需进行的计算操作,并输出计算结果。

```pythondef calculator():# 代码实现```3. 接收用户输入为了让计算器可以接收用户的输入,我们可以使用input()函数。

例如,我们可以提示用户输入需要进行的计算操作,然后将用户输入的数据存储在变量中。

```pythonoperation = input("请选择需要进行的计算操作:")```4. 实现不同的计算功能根据用户输入的操作类型,我们可以使用if语句或者switch语句来实现不同的计算功能。

通过调用math库中的函数,我们可以方便地实现常见的数学运算。

```pythonif operation == "+":# 代码实现加法计算elif operation == "-":# 代码实现减法计算elif operation == "*":# 代码实现乘法计算elif operation == "/":# 代码实现除法计算# 其他计算功能的实现```5. 输出计算结果根据计算的结果,我们可以使用print()函数将结果输出给用户。

从零开始的程序编辑项目创建一个简单的计算器

从零开始的程序编辑项目创建一个简单的计算器

从零开始的程序编辑项目创建一个简单的计算器从零开始的程序编辑项目:创建一个简单的计算器计算器是我们日常生活中常见的工具,无论是进行简单的加减乘除运算还是复杂的科学计算,它都能满足我们的需求。

在本文中,我将教您从零开始创建一个简单的计算器程序,以便您可以在计算机上方便地进行各种计算。

第一步:项目规划在开始编写代码之前,我们需要先规划项目的结构和功能。

对于这个简单的计算器,我们需要实现以下功能:输入两个数字,选择运算符(加、减、乘、除),然后得到结果。

第二步:创建用户界面在这个项目中,我们可以使用Python编程语言和Tkinter库来创建用户界面。

Tkinter是Python的标准GUI开发库,它提供了创建窗口、按钮和文本框等基本组件的功能。

首先,导入Tkinter库:```pythonimport tkinter as tk```然后,创建一个名为"Calculator"的窗口:```pythonwindow = ()window.title("计算器")```接下来,我们可以在窗口中添加两个文本框用于输入数字,一个标签用于显示结果,并在窗口底部创建四个按钮用于选择运算符(加、减、乘、除)。

```pythonnum1_entry = tk.Entry(window)num1_entry.pack()num2_entry = tk.Entry(window)num2_entry.pack()result_label = bel(window, text="结果:")result_label.pack()add_button = tk.Button(window, text="+")add_button.pack(side="left")subtract_button = tk.Button(window, text="-")subtract_button.pack(side="left")multiply_button = tk.Button(window, text="×")multiply_button.pack(side="left")divide_button = tk.Button(window, text="÷")divide_button.pack(side="left")```最后,我们需要添加一个按钮,当用户点击时,调用计算函数并显示结果。

用python实现一个简单计算器(完整DEMO)

用python实现一个简单计算器(完整DEMO)

⽤python实现⼀个简单计算器(完整DEMO)⼀、功能⽬标⽤户输⼊⼀个类似 1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2)) 这样的表达式,假设表达式⾥⾯除了包含空格、'+'、'-'、'*'、'/'和括号再⽆其他特殊符号,然后⾃⼰动⼿写代码解析其中的表达式,实现加减乘除,最后得出的结果与真实的计算机所算的结果必须⼀致。

⼆、解题思路1、为了分开运算符和数字,因此把输⼊的字符串格式转换为列表的格式进⾏处理,这样⼦就可以按位进⾏处理了2、实现功能的核⼼点在于括号、乘除、加减的优先级排序,因此我们先想办法⼀层⼀层的去括号,即从最⾥层的括号开始计算,然后去掉第⼀层括号,然后⼀直继续这个过程,最后得到⼀个没有括号的列表,再进⾏计算得出结果3、去括号⽅式:最内层的括号内的表达式就可以当做⼀个⽆括号表达式,通过先运算出乘除,再运算出加减得出整个括号内的值,⽤这个结果值整体替换括号内的内容即实现了去⼀层括号,然后通过递归去除所有的括号4、去除乘除号⽅式:见 remove_multiplication_division(eq) 函数部分5、去除加减号⽅式:见 remove_plus_minus(eq) 函数部分三、函数说明1、主函数def caculator(eq):format_list = eq_format(eq) # 把字符串变成格式化列表形式s_eq = simplify(format_list) # 去括号,得到⽆括号的⼀个格式化列表ans = calculate(s_eq) # 计算最终结果if len(ans) == 2: # 判断最终结果为正数还是负数ans = -float(ans[1])else:ans = float(ans[0])return ans2、eq_format( )函数def eq_format(eq):''':param eq: 输⼊的算式字符串:return: 格式化以后的列表,如['60','+','7','*','8']'''format_list = re.findall('[\d\.]+|\(|\+|\-|\*|\/|\)',eq)return format_list2.1 这个函数的作⽤是把输⼊的算式通过re模块,⽤正则表达式把算术符号和数字分开。

计算器c语言代码

计算器c语言代码

计算器c语言代码计算器C语言代码计算器是一种常见的工具,用于进行数值计算和数学运算。

计算器通常具有基本的四则运算功能,可以执行加法、减法、乘法和除法运算,同时还可以进行其他高级计算,比如开方、求幂、取余等。

在本文中,我们将介绍如何使用C语言编写一个简单的计算器。

我们需要定义计算器的基本功能。

我们可以使用函数来实现不同的计算操作。

下面是一个示例代码,实现了加法、减法、乘法和除法四种功能:```c#include <stdio.h>// 加法函数double add(double a, double b) {return a + b;}// 减法函数double subtract(double a, double b) {return a - b;}// 乘法函数double multiply(double a, double b) { return a * b;}// 除法函数double divide(double a, double b) { if (b == 0) {printf("除数不能为零!\n"); return 0;}return a / b;}int main() {double num1, num2;char operator;printf("请输入两个操作数:");scanf("%lf %lf", &num1, &num2); printf("请输入操作符:");scanf(" %c", &operator);switch (operator) {case '+':printf("结果:%lf\n", add(num1, num2));break;case '-':printf("结果:%lf\n", subtract(num1, num2));break;case '*':printf("结果:%lf\n", multiply(num1, num2));break;case '/':printf("结果:%lf\n", divide(num1, num2));break;default:printf("无效的操作符!\n");break;}return 0;}```在上面的代码中,我们使用了四个函数来实现不同的计算操作。

怎样用Visual-Studio制作小型计算器PPT课件

怎样用Visual-Studio制作小型计算器PPT课件
找到 Text 属性,把 form1 改为:小型计算器:
拖入控件。在软件左侧或者在视图里找到【工具
2021/3/12
4
箱】,我们要使用里面的控件:分别修改标签 label, button 的属性框下 Text 的值,如下图:
添加运算符号。点击窗体里 bBox 属性框,右键点 击打开【编辑框】,在编辑框里输入下面的字符,最后 确定:
2021/3/12
10
this.textBox3.Text=Result; break; case"/": Result=(num1/num2).ToString();
2021/3/12
11
this.textBox3.Text=Result; break; default: break;
2021/3/12
怎样用 VisualStudio 制作小型计算器
y2a3d 计算器在线计算 /
2021/3/12
1
使用 VisualStudio 可以制作出很多软件,今天我 们使用 VisualStudio 制止小型计算器,制作成功后可 以把自己制作计算器放在桌面上供自己使用;更可以 根据自己的需求制作各种各样的计算器。我们今天制 作简单的计算器,复杂的可以在简单的基础上开发。
2021/3/12
5
现在我们开始编写事件。双击【计算】按钮,在 privatevoidbutton1_Click(objectsender,EventArg se){}在{}里面输入下面的代码:
Doublenum1=Convert.ToDouble(this.textBox1. Text.ToString());
2021/3/12
16
可以把 DeBug 里的 MyStudentSys.exe 文件拖出来 供自己使用。MyStudentSys.exe 就是可执行文件,这 样小型计算器就制作出来了,放在桌面什么时间都可 以使用了。

自己写的计算器(加减乘除)代码

自己写的计算器(加减乘除)代码

⾃⼰写的计算器(加减乘除)代码⾸先是Calculator计算器类package zydCalr;public class Calculator {public double addition(double number1, double number2) {return number1+number2;}public double subtraction(double number1, double number2) {return number1-number2;}public double multiplication(double number1, double number2) {return number1*number2;}public double divsition(double number1, double number2) {return number1/number2;}}接下来是Execute运⾏类package zydCalr;import java.util.Scanner;public class Execution {public double execute(String str){String expression = str + "+1";// 初始化开始//char[] Cexpression = expression.toCharArray();// 创建运算器Calculator calculator = new Calculator();// 数值列表double[] numbers = new double[30];int numbersindex = 0;// 转型列表char[] sub = new char[30];// 数值下标位置int count = 0;// 符号列表char[] symbols = new char[10];int symbolsindex = 0;// temp1是数值列表上⼀个数值,temp2是当前的数值double temp1 = 0, temp2 = 0;;// 符号char symbol = 0;int flag = 1;// 初始化结束// 第⼀次遍历for (int i = 0; i < expression.length(); i++) {if (Cexpression[i] >= '0' && sub[i] <= '9') {sub[count++] = Cexpression[i];} else {// 字符串转型doubletemp2 = transition(sub,count);// 当flag=2时进⾏运算if (flag == 2) {flag = 1;// 获取数值列表前⼀个数值;temp1 = numbers[numbersindex - 1];// 判断symbol乘法还是除法,成功是乘法,失败为除法if (decide(symbol)==1) {temp2 = calculator.multiplication(temp1, temp2);} else {temp2 = calculator.divsition(temp1, temp2);}// 覆盖前⼀个数值numbersindex--;}// temp2存⼊数值列表numbers[numbersindex++] = temp2;// 获取符号symbol = Cexpression[i];// 转型数值下标位置清零count = 0;// 判断是否⼤于flag,flag=2,不⼤于则加⼊到符号列表if (judge(symbol) > flag) {flag = 2;} else {// 加⼊到符号列表symbols[symbolsindex++] = symbol;}}}double temp = numbers[0];count = 0;for (int i = 1; i < numbers.length; i++) {if (symbols[count] == '+') {temp += numbers[i];count++;} else if (symbols[count] == '-') {temp -= numbers[i];count++;}}return temp;}private static int judge(char symbol) {if (symbol == '+') {return 1;} else if (symbol == '-') {return 1;} else if (symbol == '*') {return 2;} else if (symbol == '/') {return 2;}return 0;}private static int decide(char symbol) {if (symbol == '*') {return 1;} else if (symbol == '/') {return 2;}return 2;}private static int transition(char[] sub1,int count) {int temp = 0;for (int i = 0; i < count; i++) {if (sub1[i] >= '0' && sub1[i] <= '9') {temp = temp * 10;temp += (sub1[i] - '0');}}return temp;}}产⽣表达式类package zydCalr;import java.util.Random;public class ProductionExpression {//⽣成数值public static String producerNumber() {int number = (int) (Math.random() * 50);return String.valueOf(number);}//⽣成数值public static String producerOpreator() {int number = (int) (Math.random() * 4);String[] operator = { "+", "-", "*", "/" };return operator[number];}//产⽣public static String producer(int i) {StringBuilder sb = new StringBuilder();int flag = (int) (Math.random() * 5);if(flag==1){sb.append("-");}sb.append(producerNumber());while (i > 0) {sb.append(producerOpreator());sb.append(producerNumber());i--;}return sb.toString();}//产⽣表达式public static String producerExpression() {int lenght = (int) (Math.random() * 5);if (lenght % 2 == 0) {lenght++;}String expression = producer(lenght);return expression;}}⽣产者类package zydCalr;import java.util.ArrayList;import java.util.List;public class Producer implements Runnable {static final int MAXQUEUE = 5;private List<String> messages = new ArrayList<String>(); private ProductionExpression pe=new ProductionExpression(); @Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {putMessage();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}private synchronized void putMessage() {while (messages.size() >= MAXQUEUE) {try {wait();} catch (InterruptedException e) {e.printStackTrace();}}//⽣成表达式messages.add(pe.producerExpression());notify();}public synchronized String getMessage() {while (messages.size() == 0) {try {notify();wait();} catch (InterruptedException e) {e.printStackTrace();}}String message = (String) messages.remove(0);notify();return message;}}消费者类package zydCalr;public class Consumer implements Runnable {Producer producer;Consumer(Producer producer) {this.producer = producer;}public void run() {while (true) {System.out.println("-------------开始⼀组表达式处理-------------");String message = producer.getMessage();System.out.println("⽣成表达式:" + message);Execution exe=new Execution();System.out.printf("处理结果:"+"%.2f\n",exe.execute(message));try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {Producer producer = new Producer();new Thread(producer).start();Consumer consumer = new Consumer(producer);new Thread(consumer).start();}}代码还是很简单的,主要有两个列表,⼀个列表存数值,⼀个列表存符号,如果符号是乘法或者除法,则把当前的数值和数值列表最后的数值相乘或相除,然后覆盖到数字列表的最后,如果不是,则存⼊数值列表的最后,符号列表添加当前的减法或者乘法,最后我发现许多细节的东西没有处理。

基于Bootstrap和JavaScript技术设计与实现简易Web计算器

基于Bootstrap和JavaScript技术设计与实现简易Web计算器

基于Bootstrap和JavaScript技术设计与实现简易Web计算器赖佳星(海南健康管理职业技术学院海南澄迈571900)摘要:HTML技术已经成为移动互联时代中前端开发的重要技术之一,高职院校为了适应新时代的需求,开设相应的前端开发课程非常必要。

该文使用Bootstrap框架实现了简易计算器的主体结构设计,并使用CSS3层叠样式表对计算器的外观进行了相应的美化;使用JavaScript脚本实现了计算器的加、减、乘、除、退格和清零操作。

通过该实例可以让高职学生较好地体会前端开发中各项技术的综合使用。

关键词:HTML JavaScript Bootstrap Web计算器中图分类号:TP312文献标识码:A文章编号:1672-3791(2022)01(a)-0013-04 Design and Implementation of Simple Web Calculator Based onBootstrap and JavaScript TechnologyLAI Jiaxing(Hainan Health Management College,Chengmai,Hainan Province,571900China)Abstract:HTML technology has become one of the important front-end development technologies in the mobile internet era.In order to adapt to the needs of the new era,it is very necessary for higher vocational colleges to set up corresponding front-end development courses.This article uses the Bootstrap framework to implement the main structure design of a simple calculator,and CSS3cascading style sheet is used to beautify the appearance of the cal‐culator;JavaScript script is used to realize the addition,subtraction,multiplication,division,backspace and zero clearing operations of the calculator.Through this example,higher vocational students can better understand the comprehensive use of various technologies in front-end development.Key Words:HTML;JavaScript;Bootstrap;Web calculator近年来,随着移动互联网的不断发展、电脑和手机等电子设备的迅速普及,微信用户数量也在不断增加。

androidstudio实现计算器

androidstudio实现计算器

androidstudio实现计算器本⽂实例为⼤家分享了android studio实现计算器的具体代码,供⼤家参考,具体内容如下效果图:资源⽂件:color.xml<?xml version="1.0" encoding="utf-8"?><resources><color name="colorPrimary">#3F51B5</color><color name="colorPrimaryDark">#303F9F</color><color name="colorAccent">#FF4081</color><color name="white">#FFFFFF</color><color name="black">#000000</color><color name="zi">#FFFFFF</color><color name="gray">#BEBEBE</color><color name="green">#9AFF9A</color><color name="littlegreen">#F0FFFF</color></resources>white.xml设置input text的填充⾊为⽩⾊<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="/apk/res/android"><corners android:radius="5dp"/><solidandroid:color="@color/white"/></shape>selector.xml点击按钮时产⽣阴影效果<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="/apk/res/android"><item android:drawable="@color/littlegreen"android:state_pressed="true"/><item android:drawable="@color/white" /></selector>equeal.xml同理,等号的阴影效果<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="/apk/res/android"><item android:drawable="@color/white"android:state_pressed="true"/><item android:drawable="@color/littlegreen" /></selector>布局⽂件<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@drawable/jisuanqi"tools:context="com.example.administrator.calculate.MainActivity"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:paddingLeft="20dp"android:paddingRight="20dp"android:paddingTop="20dp"><EditTextandroid:id="@+id/input"android:layout_width="fill_parent"android:layout_height="60dp"android:background="@drawable/white"android:editable="false"android:gravity="right|bottom"/></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:orientation="horizontal"android:gravity="center"><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="C"android:background="@drawable/selector"android:gravity="center"android:textSize="25sp"android:id="@+id/clear"/><Buttonandroid:layout_width="65dp"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="23sp"android:id="@+id/delete"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="×"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/cheng"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="÷"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/clu"/></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:orientation="horizontal"android:gravity="center"><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="7"android:background="@drawable/selector" android:gravity="center"android:textSize="25sp"android:id="@+id/num7"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="8"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/num8"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="9"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/num9"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="-"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/charjian"/></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:orientation="horizontal"android:gravity="center"><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="4"android:background="@drawable/selector" android:gravity="center"android:textSize="25sp"android:id="@+id/num4"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="5"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/num5"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="6"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:id="@+id/num6"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="+"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/charadd"/></LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:gravity="center_horizontal"android:layout_marginTop="10dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:background="@drawable/selector" android:text="1"android:gravity="center"android:textSize="25sp"android:id="@+id/num1"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="2"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/num2"/><Buttonandroid:layout_width="65dp"android:layout_height="65dp"android:text="3"android:background="@drawable/selector" android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/num3"/></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_marginTop="10dp"><Buttonandroid:id="@+id/num0"android:layout_width="140dp"android:layout_height="65dp"android:text="0"android:background="@drawable/selector" android:gravity="center"android:textSize="25sp" /><Buttonandroid:id="@+id/dian"android:layout_width="65dp"android:layout_height="65dp"android:layout_marginLeft="10dp"android:background="@drawable/selector" android:gravity="center"android:text="."android:textSize="25sp" /></LinearLayout></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><Buttonandroid:layout_width="65dp"android:layout_height="140dp"android:text="="android:background="@drawable/equal"android:gravity="center"android:layout_marginLeft="10dp"android:textSize="25sp"android:id="@+id/equai"/></LinearLayout></LinearLayout></LinearLayout>package com.example.administrator.calculate;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.Toast;import butterknife.BindView;import butterknife.ButterKnife;import butterknife.OnClick;public class MainActivity extends AppCompatActivity {@BindView(R.id.input)EditText input;@BindView(R.id.clear)Button clear;@BindView(R.id.delete)Button delete;@BindView(R.id.cheng)Button cheng;@BindView(R.id.clu)Button chu;@BindView(R.id.num7)Button num7;@BindView(R.id.num8)Button num8;@BindView(R.id.num9)Button num9;@BindView(R.id.charjian)Button charjian;@BindView(R.id.num4)Button num4;@BindView(R.id.num5)Button num5;@BindView(R.id.num6)Button num6;@BindView(R.id.charadd)Button charadd;@BindView(R.id.num1)Button num1;@BindView(R.id.num2)Button num2;@BindView(R.id.num3)Button num3;@BindView(R.id.num0)Button num0;@BindView(R.id.dian)Button dian;@BindView(R.id.equai)Button equal;private String ss="";private boolean fu=false;private boolean num=false;private boolean point=false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);ButterKnife.bind(this);}@OnClick({R.id.clear, R.id.delete, R.id.cheng, R.id.clu, R.id.num7, R.id.num8, R.id.num9, R.id.charjian, R.id.num4, R.id.num5, R.id.num6, R.id.charadd, R.id.num1, R.id.num2, R.id.num3, R.id.num0, R.id.dian, R.id.equai}) public void onViewClicked(View view) {switch (view.getId()) {case R.id.clear:{ss="";input.setText(ss);}break;case R.id.delete:{if(ss.indexOf(" ")==ss.length()-3){ss= ss.substring(0,ss.length() - 2);}if(ss.length()>0){ss= ss.substring(0,ss.length() - 1);}input.setText(ss);}break;case R.id.cheng:{if(ss.length()==0){break;}if(ss.contains(" ")){if(ss.indexOf(" ")==ss.length()-3||ss.indexOf(" ")==ss.length()-2||ss.indexOf(" ")==ss.length()-1) break;getResult();}fu=true;ss+=" × ";input.setText(ss);}break;case R.id.clu:{if(ss.length()==0)if(ss.contains(" ")){if(ss.indexOf(" ")==ss.length()-3||ss.indexOf(" ")==ss.length()-2||ss.indexOf(" ")==ss.length()-1) break; getResult();}fu=true;ss+=" ÷ ";input.setText(ss);}break;case R.id.num7:{ss+="7";input.setText(ss);}break;case R.id.num8:{ss+="8";input.setText(ss);}break;case R.id.num9:{ss+="9";input.setText(ss);}break;case R.id.charjian:{if(ss.length()==0){break;}if(ss.contains(" ")){if(ss.indexOf(" ")==ss.length()-3||ss.indexOf(" ")==ss.length()-2||ss.indexOf(" ")==ss.length()-1) break; getResult();}fu=true;ss+=" - ";input.setText(ss);}break;case R.id.num4:{ss+="4";input.setText(ss);}break;case R.id.num5:{ss+="5";input.setText(ss);}break;case R.id.num6:{ss+="6";input.setText(ss);}break;case R.id.charadd:{if(ss.length()==0){break;}if(ss.contains(" ")){if(ss.indexOf(" ")==ss.length()-3||ss.indexOf(" ")==ss.length()-2||ss.indexOf(" ")==ss.length()-1) break; getResult();}fu=true;ss+=" + ";input.setText(ss);}break;case R.id.num1:{ss+="1";input.setText(ss);}break;case R.id.num2:{ss+="2";input.setText(ss);}break;case R.id.num3:{ss+="3";input.setText(ss);}break;case R.id.num0:{ss+="0";input.setText(ss);}break;case R.id.dian:{if(ss.length()==0||ss.indexOf(" ")==ss.length()-3||stIndexOf(".")>ss.indexOf(" ")){break;ss+=".";input.setText(ss);}}break;case R.id.equai:getResult();break;}}private void getResult(){double result=0;if(ss==null||ss.equals("")) return;if(!ss.contains(" ")) return;String s1=ss.substring(0,ss.indexOf(" "));String op=ss.substring(ss.indexOf(" ")+1,ss.indexOf(" ")+2);String s2=ss.substring(ss.indexOf(" ")+3);if(!s1.equals("")&&!s2.equals("")){double d1=Double.parseDouble(s1);double d2=Double.parseDouble(s2 );switch (op){case "+": result=d1+d2;break;case "-": result=d1-d2;break;case "×": result=d1*d2;break;case "÷":{if(d2==0){Toast.makeText(this, "不能除以零", Toast.LENGTH_SHORT).show();break;}result=d1/d2*1.0;}break;}int r = (int) result;if(r==result){input.setText(""+r);ss=""+r;}else{input.setText(result+"");ss=""+result;}}}}在AndroidManifest.xml⽂件中activity 后⾯添加android:theme=”@style/Theme.AppCompat.DayNight.NoActionBar”以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

Boost学习之语法解析器--Spirit

Boost学习之语法解析器--Spirit

Boost学习之语法解析器--SpiritBoost.Spirit能使我们轻松地编写出⼀个简单脚本的语法解析器,它巧妙利⽤了元编程并重载了⼤量的C++操作符使得我们能够在C++⾥直接使⽤类似EBNF的语法构造出⼀个完整的语法解析器(同时也把C++弄得⾯⽬全⾮-_-)。

关于EBNF的内容⼤家可以到⽹上或书店⾥找:EBNF基本形式<符号> ::= <表达式> 或 <符号> = <表达式>表达式⾥常⽤的操作符有:1. | 分隔符,表⽰由它分隔的某⼀个⼦表达式都可供选择2. * 重复,和正则表达式⾥的*类似,表⽰它之前的⼦表达式可重复多次3. - 排除,不允许出现跟在它后⾯的那个⼦表达式4. , 串接,连接左右⼦表达式5. ; 终⽌符,⼀条规则定义结束6. '' 字符串7. "" 字符串8. (...) 分组,就是平时括号的功能啦,改变优先级⽤的。

9. (*...*) 注释10. [...] 可选,综括号内的⼦表达式允许出现或不出现11. {...} 重复,⼤括号内的⼦表达式可以多次出现12. ?...? 特殊字符,由ISO定义的⼀些特殊字例如:只允许赋值的简单编程语⾔可以⽤ EBNF 定义为:1. (* a simple program in EBNF ? Wikipedia *)2. program = 'PROGRAM' , white space , identifier , white space ,3. 'BEGIN' , white space ,4. { assignment , ";" , white space } ,5. 'END.' ;6. identifier = alphabetic character , [ { alphabetic character | digit } ] ;7. number = [ "-" ] , digit , [ { digit } ] ;8. string = '"' , { all characters ? '"' } , '"' ;9. assignment = identifier , ":=" , ( number | identifier | string ) ;10. alphabetic character = "A"|"B"|"C"|"D"|"E"|"F"|"G"|"H"|"I"|"J"|"K"|"L"|"M"|"N"|"O"|"P"|"Q"|"R"|"S"|"T"|"U"|"V"|"W"|"X"|"Y"|"Z" ;11. digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" ;12. white space = ? white space characters ? ;13. all characters = ? all visible characters ? ;⼀个语法上正确的程序:1. PROGRAM DEMO12. BEGIN3. A0:=3;4. B:=45;5. H:=-100023;6. C:=A;7. D123:=B34A;8. BABOON:=GIRAFFE;9. TEXT:="Hello world!";10. END.这个语⾔可以轻易的扩展上控制流,算术表达式和输⼊/输出指令。

基于Visual-Basic的编程实现一个计算器

基于Visual-Basic的编程实现一个计算器

第1章绪论1.1课题简介1.1.1课程设计题目基于Visual Basic的计算器的制作1.1.2课题要求基于Visual Basic的编程实现一个计算器软件,要求计算器能够实现:加法、减法、乘法、除法、乘方、立方、正弦、余弦、正切、余切、开平方等功能。

而且还要实现计算器界面有一个与系统时间同步的时钟。

要求界面简单美观,操作简单方便,类似于我们一直在用的计算器。

1.1.3课题工作内容1、掌握一些程序设计算法的分析,学会使用控件数组;2、掌握VB程序的编写方法,学会VB函数的调用;3、学会应用软件界面的设计和界面的布局、美化;4、学会编写与系统时间同步的时钟;5、撰写课程设计报告。

1.2系统分析1.2.1开发背景计算机已经成为我们学习和工作的得力助手:今天,计算机的价格已经十分低廉,性能却有了长足的进步。

它已经被应用于许多领域,计算机之所以如此流行的原因主要有以下几个方面:1,计算机可以代替人工进行许多繁杂的劳动;2,计算机可以节省许多资源;3,计算机可以大大的提高人们的工作效率;4,计算机可以使敏感文档更加安全等。

第2章开发环境及实现技术2.1开发环境硬件系统:奔腾166MX以上CPU、32M以上内存、1G以上硬盘、光驱。

软件系统:Windows 98/ME/2000/XP、Visual Basic 6.0中文版。

2.2开发工具简介2.2.1总体介绍微软公司的Visual Basic 6.0是Windows应用程序开发工具,是目前最为广泛的、易学易用的面向对象的开发工具。

Visual Basic提供了大量的控件,这些控件可用于设计界面和实现各种功能,减少了编程人员的工作量,也简化了界面设计过程,从而有效的提高了应用程序的运行效率和可靠性。

故而,实现本系统VB 是一个相对较好的选择。

Access2000 就是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。

Access 的优点在于它能使用数据表示图或自定义窗体收集信息。

静态文本分析,spirit和其他(一)

静态文本分析,spirit和其他(一)

静态⽂本分析,spirit和其他(⼀)最近⼯作中要⽤到⼀些静态⽂本分析的功能, ⼤体说来就是按照内部定义的格式解析⼀个配置⽂件.以前也做过类似的⼯作, 当时想当然直接⽤win32 API读取INI⽂件.当然项⽬是完成了,⽽时隔⼏年之后, ⼜要⽤到类似的功能, 有什么其他解决⽅案呢.这⾥不得不提到和.具体的定义实在不是三⾔两语能讲得清楚的, 不过好在我们有wiki.基本上, 我们定义⾃⼰的配置⽂件格式, 相当于定义了⾃⼰的⽂法.⽽在应⽤中, 按照我们事先定义好的⽂法来解析并读取这些配置⽂件, 也就完成了这⼀循环.忘记在哪⾥看到这么⼀句话"C++程序员都是脑⼒劳动的施虐者和受虐者", 所以我们有了Boost. ⽽我们的boost::spirit, 帮我们提供了⼀个绝好的定义DSL的⼯具.从这篇⽂章开始, 我会⽤⼀个个的⼩例⼦来逐渐引⼊spirit, 最后实现并超过原有的需求.很多例⼦以及源代码都是来在⽹络, 包括但不限于(, , 等等)<⼀> 计算器这是Spirit的作者推荐的快速开始的例⼦,废话少说, 主要的代码如下(稍微做了些修改)struct CalculatorParser : public grammar<CalculatorParser>{template<typename ScannerType>struct definition{definition(const CalculatorParser & c){factor = real_p[& push_real]| '(' >> expression >> ')'| ('-' >> factor[&do_neg])| ('+' >> factor);term = factor >>*(('*' >> factor[Calculator<multiplies<double> >()])| ('/' >> factor[Calculator<divides<double> >()]));expression = term >>*(('+' >> term[Calculator<plus<double> >()])| ('-' >> term[Calculator<minus<double> >()])) >>ch_p(';');}rule<ScannerType> expression, term, factor;rule<ScannerType> const&start() const{return expression;}};};⽂法的核⼼就定义在expression, term, factor中了factor是基本单元, 在满⾜real_p的时候(即factor是个real variable), 执⾏push_real(函数指针)⽽factor也可以是括号内的表达式, 负数或显式指定的正数term在做乘除运算⽽expression则是在做加减运算,同时整个表达式以";"作为结束符以上我们就定义了⼀个⾮常简单的EBNF,如何,⽅便吧使⽤时,直接parse即可parse_info<> info = parse("1+2;", CalculatorParser());以上, 我们简单接触了EBNF, 可以看出了,要想解析⾃定义的格式, 使⽤spirit是⾮常⽅便的⼀件事下⼀篇, 我们会来看⼀个稍微复杂些的例⼦, 并⽤到更多的功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(ch_p('/') >> F)[bind(&CalStack<std::divides<Type> >, ref(sValueStack))]
));
F = (ch_p('(') >> E >> ch_p(')')) |
(*space_p >> real_p[bind(&stack<Type>::push, ref(sValueStack), _1)] >> *space_p);
Boost.Spirit——60行代码实现一个计算器
Boost.Spirit,利用递归下降法进行文法解析,可以解析LL(1)文法。
从编译原理的角度,LL(1)文法的描述能力比正则表达式要强,因此Boost.Spirit也是可以处理正则表达式的。
缺陷:Boost.Spirit采用模板来实现,虽然可以较高的运行效率,但无法在程序运行之时动态的产生一个解析器。因此一个用字符串表示的正则表达式,是无法用Boost.Spirit解析的。
利用Boost.Spirit实现的计算器代码如下。支持四则运算和括号。支持空格。
程序中还使用了Boost.Bind库和Boost.Function库。
#include <stack>
#include <string>
#include <cassert>
#include <iostream>
using boost::spirit::rule;
using boost::spirit::ch_p;
using boost::spirit::real_p;
using boost::spirit::space_p;
using boost::bind;
}
}
int main() {
std::string input;
while( std::getline(std::cin, input) ) {
eval(input.c_str());
}
}
代码在Visual Studio 2008 + Boost 1.36.0编译通过。
#include <functional>
#include <boost/bind.hpp>
#include <boost/spirit.hpp>
template <typename op>
void CalStack(std::stack<double>& values) {
assert(values.size() >= 2);
(ch_p('-') >> T)[bind(&CalStack<std::minus<Type> >, ref(sValueStack))]
));
T = (F >> *(
(ch_p('*') >> F)[bind(&CalStack<std::multiplies<Type> >, ref(sValueStack))] |
using boost::ref;
using std::stack;
typedef double Type;
stack<Type> sValueStack;
// E ::= T ( (+T) | (-T) )*
// T ::= F ( (*F) | (/F) )*
// F ::= ('(' E ')') | 浮点数
rule<> E, F, T;
E = (T >> *(
(ch_p('+') >> T)[bind(&CalStack<std::plus<Type> >, ref(sValueStack))] |
if (parse(expr, E).full) {
assert(sValueStack.size() == 1);
std::cout << sValueStack.top() << std::endl;
} else {
std::cout << "计算过程中遇到错误" << std::endl;
double op2 = values.top();
values.pop();
double op1 = values.top();
values.pop();
values.pl(const char* expr) {
相关文档
最新文档