用C++写一个数学表达式计算程序

用C++写一个数学表达式计算程序,第1张

编译原理的东西,对字符串的解析,还有定义好表达式的数据结构。

表达式是一种树状结构,表达式可以是最小的原子表达式(只有一个常量或者一个变量),也可以是由一个运算符和若干个子表达式组成的复合表达式,它的子表达式可以是元子表达式也可以是复合表达式。

我之前写过一个表达式类,可以运算,但是表达式的化简没有写好,效率低下。。。

下面是头文件,如果感兴趣可以向我索取剩下的代码:

#pragma once

#include "assert.h"

#include <vector>

using namespace std

#define ConstantE 2.71828182845904523536 //自然对数e

#define ConstantPai 3.14159265358979323846 //圆周率π

#define InfinitePlus 1.0e308 //正无穷

#define InfiniteNegative -1.0e308 //负无穷

#define OperatorParam 5//运算符允许的最大参数个数(也就是运算符的目数)

#define MaxExpressionTextParam 200 //表达式的“传文本参数”构造函数允许最大的字符串

enum ExpressionType //表达式类型

{

//每个枚举值所表示的含义必须一层层增大,即上一个枚举值是下一个枚举值的子集,但ExpressionType_unknown不是它上面枚举值的包含集

ExpressionType_plus=1, //正数(大于0的数)

ExpressionType_Unzero, //非零数

ExpressionType_num,//实数

ExpressionType_constant, //常数(包括复数)

//以上几个其实是常量

ExpressionType_unknown, //变量

//以上几个其实就是元子表达式,而下面的是表达式(包括元子表达式和复合表达式)

ExpressionType_expression, //表达式

}

enum ConstantType //常数类型

{

ConstantType_num=1,//实数数字

ConstantType_e, //自然数e

ConstantType_pai,//圆周率π

ConstantType_j, //虚数的j

}

struct Constant //常数

{

ConstantType eConstantType //常数类型(可以表达实数部分c,虚数部分1*j,也可以表达1*e和1*π)

long double fValue //数值(ejπ时无意义)

}

class Expression

struct UnKnown //变量

{

//基本属性

unsigned int nID //变量编号

//公式匹配

ExpressionType eExpressionType_Request //匹配时该变量允许的类型(属性需求)

Expression* pExpression //匹配上时,该变量指代的表达式(一个指针,不需要自己释放)

}

enum OperatorType //大部分运算符(暂时最大只出现双目运算)

{

OperatorType_Null=-1, //空运算符

OperatorType_add=0,//+(加)-----2目

OperatorType_sub,//-(减)-----2目

OperatorType_multi,//*(乘)-----2目

OperatorType_divide, ///(除)-----2目

OperatorType_abs,//||(绝对值)-----1目

OperatorType_inverse, //-(相反数)-----1目

OperatorType_factorial, //!(阶乘) -----1目

OperatorType_exponent, //^(指数)-----2目,参数1是底数

OperatorType_log,//log(对数,^逆运算)-----2目,参数1是底数

OperatorType_lg,//lg(10为底的对数)-----1目

OperatorType_ln,//ln(e为底的对数)-----1目

OperatorType_sin,//sin(正弦,对边比斜边)-----1目

OperatorType_cos,//cos(余弦,邻边比斜边)-----1目

OperatorType_tan,//tan(正切,对边比邻边)-----1目

OperatorType_cot,//cot(余切,邻边比对边)-----1目

OperatorType_sec,//sec(正割,斜边比邻边)-----1目

OperatorType_scs,//scs(余割,斜边比对边)-----1目

OperatorType_arcsin, //arcsin(sin逆运算)-----1目

OperatorType_arccos, //arccos(cos逆运算)-----1目

OperatorType_arctan, //arctan(tan逆运算)-----1目

OperatorType_arccot, //arccot(cot逆运算)-----1目

OperatorType_arcsec, //arcsec(sec逆运算)-----1目

OperatorType_arcscs, //arcscs(scs逆运算)-----1目

OperatorType_step,//ε单位阶跃函数-----1目,参数1是时间t(从0变到1,然后一直不变)

OperatorType_lash,//δ单位冲激函数-----1目,参数1是时间t(脉冲,瞬间变到无穷大,又瞬间回到0)

OperatorType_differ, //△(微分)-----2目(表达式,求微的未知数)

OperatorType_integral, //∫(积分)-----1目(表达式,求积的未知数)

}

struct OperatorProperty//运算符的属性(至少一目,最多允许十目),此结构只在(表达式和文本之间的转换)中使用

{

OperatorType eOperatorType //运算符类型

unsigned int nCountParam //运算符需要的参数个数(几目),0个参数表示无运算符号

char strRule[10] //运算符文本书写规则,当元素是[0,9]时表示使用第几个参数,

//而当是其它时表示该运算符表达式中用到的特别字符。比如积分写成"∫0d1",写成数组方式就是('∫','0,','d','1'),

//注意文本书写方式中不允许出现小数点字符'.',以免增加分析的难度。

//另外,参数的数字编号也必须是从0开始按顺序递增,因为它指代了是第几个参数。

ExpressionType* peExpressionTypeArray_Request//每个参数的表达式限制,默认都是ExpressionType_expression,

//但微积分中的最后一个参数要求是个未知数,数组大小是nCountParam

char** ppstrTextParam //每个元素是运算符规则文本匹配时参数对应的实际文本

int nSite //已匹配到运算符文本书写规则的哪个位置

}

class OperatorRule

struct Expression

{

//表达式基本属性

string strText//表达式的文本表示,下面是数据表示

//元子表达式(最精简的表达式,是常数或者变量,两者最多只有一个为非NULL)

Constant* pConstant //常量

UnKnown* pUnknown //变量

//复合表达式(子表达式的个数取决于运算符的目数)

OperatorType eOperatorType //运算符类型(为了提高运算效率,使用多个变量替代数组的方式)

Expression* pExpressionSub1//运算符使用到的子表达式1,复合表达式时必须非NULL(因为任何运算符至少需要一个参数)

Expression* pExpressionSub2//运算符使用到的子表达式2,复合表达式时可能为NULL(单目运算符没第二个参数)

//Expression* pExpressionSub3//超过双目时继续填写变量

}

struct OperatorRule //运算法则

{

//运算法则可分为“消元法则”(也可称为“优化法则”)和“普通法则”,另外还有“拉普拉式变换法则”。

//左表达式的树深度大于或者等于右表达式的。

//“消元法则”是指此法则可以有效地减少未知数的,也就是右表达式的未知数是左表达式的未知数的子集。

//“普通法则”则无法消去未知数的个数。

//“拉普拉式变换法则”的左边表达式是象函数,右边是原函数。

//“消元法则”和“拉普拉式变换法则”只允许从左边推导出右边,而“普通法则”则可以左右互相推导。

Expression* pExpression_Left//法则的左边表达式

Expression* pExpression_Right//法则的右边表达式

}

Prewitt算子程序:

clc

clear all

close all

A = imread('tig.jpg') %读入图像

imshow(A)title('原图')

y_mask = [-1 -1 -10 0 01 1 1] %建立Y方向的模板

x_mask = y_mask' %建立X方向的模板

I = im2double(A) %将图像数据转化为双精度

dx = imfilter(I, x_mask) %计算X方向的梯度分量

dy = imfilter(I, y_mask) %计算Y方向的梯度分量

grad = sqrt(dx.*dx + dy.*dy) %计算梯度

grad = mat2gray(grad) %将梯度矩阵转换为灰度图像

level = graythresh(grad) %计算灰度阈值

BW = im2bw(grad,level) %用阈值分割梯度图像

figure, imshow(BW) %显示分割后的图像即边缘图像

title('Prewitt')

代码如下:

public class Test {

public static int add(int a,int b){

return a+b

}

public static void main(String args[]){

Scanner scanner = new Scanner(System.in)

System.out.println("请输入第一个数")

int a = scanner.nextInt()

System.out.println("请输入第二个数")

int b = scanner.nextInt()

System.out.println("和为:"+add(a,b))

}

}

扩展资料

运算符

运算符是一些特殊的符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面。

1、赋值运算符

赋值运算符以符号“=”表示,它是一个二元运算符(对两个 *** 作数作处理),其功能是将右方 *** 作数所含的值赋给左方的 *** 作数。

例如:

1  int a = 100

2、算术运算符

运算符说明  :

“+” 加  ;“-”\t减  ;“*”\t乘 ;  “/”除 ; “%”\t取余数

3、自增和自减运算符

自增和自减是单目运算符,可以放在 *** 作元之前,也可以放在 *** 作元之后。 *** 作元必须是一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增1或减1。放在 *** 作元前面的自增、自减运算符,会先将变量的值加1或减1,然后再使该变量参与表达式的运算。放在 *** 作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后再将该变量的值加1或减1。

例如:

假设a=5

1  b=++a//先将a的值加1,然后赋值给b,此时a的值为6,b的值为6

2  b=a++//先将a的值赋值给b,再将a的值变为6,此时a的值为6,b的值为5

4、比较运算符

比较运算符属于二元运算符,用于程序中的变量之间,变量和自变量之间以及其他类型的信息之间的比较。比较运算符的运算结果是boolean型。当运算符对应的关系成立时,运算的结果为true,否则为false。比较运算符共有6个,通常作为判断的依据用于条件语句中。

运算符说明:

">"比较左方是否大于右方

"<" 比较左方是否小于右方

"=="比较左方是否等于右方

">= "比较左方是否大于等于右方

"<= "比较左方是否小于等于右方

"!= "比较左方是否不等于右方

参考链接:Java(计算机编程语言)_百度百科


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/12080811.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存