4常量表达式计算器



#include
<iostream>

#include
<cstdlib>

#include
<cctype>
//字符串判定

 

using
namespace
std;

const
int
MAX = 1024;

double
operation(char
*str);

char *
extract(char
*str,
int &index)

{

   
char *pstr(nullptr);//处理字符串

   
int
num(0);//记录一下多少对括号

   
int
bufindex(index);//记录下标

 

   
do

   
{

       
switch (*(str
+ index))

       
{

       
case
')':

           
if (0 ==
num)

           
{

               
++index;

               
pstr =
new
char[index
- bufindex];

               
if (!pstr)

               
{

                   
throw 
"malloc fail";

               
}

               
//拷贝字符串

               
strncpy_s(pstr,
index -
bufindex,
str +
bufindex,
index -
bufindex - 1);

               
return
pstr;

           
}

           
else

           
{

               
num--;

           
}

           
break;

       
case
'(':

           
num++;

           
break;

       
}

   
} while (*(str
+ index++) !=
'\0');

   
throw 
"errorfail";

}

 

//获得计算表达是中字符串的数字

double
getNum(char
*str,
int &index)

{

   
double
value(0.0);

 

   
if (*(str
+ index) ==
'(')

   
{

       
char *substr(nullptr);

       
substr =
extract(str,
++index);

 

       
value =
operation(substr);

       
delete[]
substr;

 

       
return
value;

   
}

 

   
if (!isdigit(*(str
+ index)))

   
{

       
char
error[30] =
"geterror";

       
throw
error;

   
}

 

   
//判断数值是否是数值

   
while (isdigit(*(str
+ index)))

   
{

       
value = 10 *
value + (*(str
+ index++) -
'0');

   
}

   
//带有小数点时不做处理

   
if (*(str
+ index) !=
'.')

   
{

       
return
value;

   
}

   
else

   
{

       
double
decimals(1.0);
//定义一个小数

       
while (isdigit(*(str
+ (++index))))

       
{

           
decimals /= 10;

           
value =
value + (*(str
+ index) -
'0') *
decimals;

       
}

       
return
value;

   
}

}

 

double
term(char
*str,
int &
index)

{

   
double
value(0.0);

   
value =
getNum(str,
index);//获取数据

   
while (1)

   
{

       
if (*(str+index)
== '*')

       
{

           
//乘除法

           
value *=
getNum(str,
++index);

       
}

       
else
if (*(str
+ index) ==
'/')

       
{

           
value /=
getNum(str,
++index);

       
}

       
else

       
{

           
break;

       
}

   
}

   
return
value;

}

 

double
operation(char
*str)

{

   
double
value(0.0);

   
int
index(0);

   
value +=
term(str,
index);

   
for (;;)

   
{

       
switch (*(str
+ (index++)))

       
{

       
case
'\0':

           
return
value;

           
break;

       
case
'+':

           
value +=
term(str,index);

           
break;

       
case
'-':

           
value -=
term(str,
index);

           
break;

       
default:

           
break;

       
}

   
}

}

 

void
removeBlankSpace(char
*str)

{

   
int
i(0);

   
int
j(0);

   
//*(str + i) = *(str + j++) :通过这种方式循环获得字符串中的每个字符

   
//下面的意思是获得字符不是'\0',也就是说没有到达字符串末尾

   
//下面的方式是把不是空格的字符赋值给*(str+i)

   
while ((*(str
+ i) = *(str
+ j++))!=
'\0')

   
{

       
if (*(str+i)
!= ' ')

       
{

           
i++;

       
}

   
}

   
//两个下标轮替,往前移动,链表的算法一样,循环向前挖

}

 

void
main()

{

   
char
str[MAX]
= { 0 };

   
cout <<
"请输入表达式";

   
cin.getline(str,
MAX);

   
cout <<
"\n" <<
str <<
endl;

 

   
//去除空格

   
removeBlankSpace(str);

 

   
cout <<
str <<
endl;

 

   
cout <<
operation(str)
<< endl;

 

   
cin.get();

}

运行结果:

时间: 2024-09-21 08:17:31

4常量表达式计算器的相关文章

Java编译器对于String常量表达式的优化

首先把问题摆出来,先看这个代码 String a = "ab"; String b = "a" + "b"; System.out.println((a == b)); 打印结果会是什么?类似这样的问题,有人考过我,我也拿来考过别人(蛮好玩的,大家也可以拿来问人玩),一般答案会是以下几种: 1.true "a" + "b" 的结果就是"ab",这样a,b都是"ab"了

对象-求 后缀表达式计算器代码及设计思想 本人小白 求大神

问题描述 求 后缀表达式计算器代码及设计思想 本人小白 求大神 后缀表达式计算器 目的:后缀表达式不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则, 要求:实现一个简单的后缀表达式计算器.假定表达式里的基本数值为实数,可用的运算符包括+,-,*,/,^,其中的 ^ 表示求幂运算. ①假定输入表达式里的数和运算符之间都有空格,这样可以简化输入的处理: ②输入的算术表达式以分号为结束符.计算器应该能输入并计算一系列表达式,遇到一行的第

c++-关于常量表达式的新手问题

问题描述 关于常量表达式的新手问题 各位前辈,我最近在自学C++prime5,里面有一段关于常量表达式的概念把我搞混了 里面有这么一段关于常量表达式的定义: 常量表达式是指值不会改变并且在编译的过程中就能得到结果的表达式.显然,字面值属于常量表达式.... 然后书上关于字面值得解释是这样的: 字面值类型一般比较简单,值也显而易见,容易得到,就把他们称为"字面值"类型.算术类型,引用和指针都属于字面值类. 那我这样定义: int a=42; 这个变量a 属于字面值类型吧?那它不就是一个常

剖析C++中的常量表达式与省略号的相关作用_C 语言

C++ 常量表达式常量值是指不会更改的值.C + + 提供了两个关键字,它们使你能够表达不打算修改对象的意图,还可让你实现该意图. C++ 需要常量表达式(计算结果为常量的表达式)以便声明: 数组边界 case 语句中的选择器 位域长度规范 枚举初始值设定项 常量表达式中合法的唯一操作数是: 文本 枚举常量 声明为使用常量表达式初始化的常量的值 sizeof 表达式 必须将非整型常量(显式或隐式)转换为常量表达式中合法的整型.因此,以下代码是合法的: const double Size = 11

表达式计算器

1+2/3*(4-6)*6/8+9*2 = ? #include <stdio.h> #include <stdlib.h> #define MAXSIZE 32 typedef struct{ int data[MAXSIZE];//数据段 int top;//栈指针 }sqstack; sqstack *sqstack_create() { sqstack *sq; sq = malloc(sizeof(*sq)); if(sq == NULL ) { return NULL;

表达式计算器错误 CXX0017

错误消息 未找到符号无法找到表达式中指定的符号. 该错误可能的原因之一是符号名中大小写不匹配.因为 C 和 C++ 都是区分大小写的语言,所以必须完全按照源中定义的符号名大小写给定符号名. 试图在调试期间为了监视变量而转换此变量的类型时可发生该错误.typedef 声明类型的新名称,但不定义新类型.在调试器中试图进行的类型转换需要已定义类型名. 该错误与 CAN0017 相同. 通过使用下面可能的解决方案进行修复确保已在程序中将要使用该符号的地方声明了该符号. 使用实际类型名而不是 typede

c/c++ 函数、常量、指针和数组的关系梳理

压力才有动力,15年中旬就要准备实习,学习复习学习复习学习复习学习复习--无限循环中,好记性不如烂笔头--从数组开始,为主干. c 的array由一系列的类型相同的元素构成,数组声明包括数组元素个数和类型,c 中的数组参数是引用形式传参(传址调用),而常量标量是按值传递. //[]方括号表示声明的是数组,里面的数字表明了数组包含的元素数目 int states[50];//声明50个整数的数组 double code[365];//声明365个浮点数的数组 char chr[20];//声明20

MYSQL表达式求值和MYSQL类型转换

    2.4 表达式求值和类型转换    MySQL允许编写包括常量.函数调用和表列引用的表达式.这些值可利用不同类型的运算符进行组合,诸如算术运算符或比较运算符.表达式的项可用圆括号来分组.表达式在SELECT 语句的列选择列表和WHERE 子句中出现得最为频繁,如下所示:    所选择的每列给出了一个表达式,如WHERE 子句中所示的那样.表达式也出现在DELETE 和UPDATE语句的WHERE 子句中,以及出现在INSERT 语句的VALUES( ) 子句中.    在MySQL遇到一

Oracle8i基于规则的优化机制对表达式的处理

oracle|优化      ORACLE优化器在任何可能的时候都会对表达式进行评估,并且把特定的语法结构转换成等价的结构,这么做的原因是:·         要么结果表达式能够比源表达式具有更快的速度 ·         要么源表达式只是结果表达式的一个等价语义结构 不同的SQL结构有时具有同样的操作(例如:= ANY (subquery) and IN (subquery)),ORACLE会把他们映射到一个单一的语义结构. 下面将讨论优化器如何评估优化如下的情况和表达式:常量 LIKE 操作