//Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  //一个能处理四则运算的程序,实现语言C++,支持嵌套括号,可以处理实数,源码见下面:
#include<iostream>
#include <stdio.h>
#include <string.h> #include<cmath>
using namespace std;
const int MAX=; class Input
{
public:
Input()
{
for( int i = ;i < MAX;i++ )
Str_input[i] = '\0';
}
char Str_input[MAX];
}in; class Output
{
public:
Output()
{
result = ;
}
void getRes( double res )
{
result = res;
}
double printRes()
{
// cout<<"这个表达式的结果为:"<<result<<endl;
return result;
}
private:
double result;
}; template <class Type>
class STACK{ //定义栈类
private:
Type base[MAX];
int Size;
public:
STACK(){Size=;};
void push(Type a) //入栈
{
base[Size]=a;
Size++;
}
Type pop() //出栈
{
return base[--Size];
}
int size()
{
return Size;
}
}; class Calculate_Cla
{
public:
bool IsData(char);
bool IsSym(char);
int IsPar(char);
bool Check(char *);
int setPri(char); //判断符号的优先极别
double ToData(char*); //把字符串转化为数值
double Call(double,double,char); //具体按符号计算
int GetMatch(char* buffer,int pos); //利用栈找到匹配的括号
void Opr( STACK<char>&, STACK<double>&, int& ); //利用栈计算
double Calculate(char*, double& ); //字符串的读入及调配 };
bool Calculate_Cla::IsData(char ch) //判断输入计算的数字是否为0-9 添加科学计数法e
{
return ((ch>=''&&ch<='')||ch=='.'||ch=='e')?true:false;//添加科学计数法e
}
bool Calculate_Cla::IsSym(char ch) //判断是否输入非法运算符
{
return (ch=='+'||ch=='-'||ch=='*'||ch=='/')?true:false;
}
int Calculate_Cla::IsPar(char ch) //判断是否'()'
{
if(ch=='(')
return ;
if(ch==')')
return -;
return ;
}
bool Calculate_Cla::Check(char *ch)//检验小数点个数,>1报错 l
{
int a=;
for(int i=;i<strlen(ch);i++)
if(ch[i]=='.')
a++;
if(a>)
return false;
return true;
}
int Calculate_Cla::setPri(char ch) //符号的优先极别
{
switch(ch)
{
case '+':
return ;
case '-':
return ;
case '*':
return ;
case '/':
return ;
default:
return -;
}
}
double Calculate_Cla::ToData(char* ch) //将数字转化为数值
{
int i,j,k,sumn=;
double sum=0.0,p=0.0,q=0.0;
int summ=;//科学计数法所表示的数据e
if(!Check(ch)) return 0.0;
for(i=;i<strlen(ch);i++) //读入整数部分
{
if(ch[i]!='.')
sumn=sumn*+(ch[i]-'');
else break;
}
if(strchr(ch, 'e')!=NULL)//判断是否为科学计数法e
{/////////
if(i<strlen(ch))
for(j=i+;j<strlen(ch);j++) //小数部分,到e为止
{
if(ch[j]!='e')
sum=sum*+(ch[j]-'');
else break;
}
sum /= pow(10.0,(double)(strlen(ch)--i)); //有错
if(ch[j]=='e'&&j<strlen(ch))
{
// if(ch[j]!='\0') //科学计数法部分e
for(k=j+;k<=j+;k++)
summ=summ*+(ch[k]-'');// ch[j]的ascii码减去0的ascii码
if(ch[j+]=='-')
{
double p=(sum+sumn)/pow(,summ);
return ((sum+sumn)/pow(,summ)); //返回值
}
if(ch[j+]=='+')
{
double q=(sum+sumn)*pow(,summ);
return ((sum+sumn)*pow(,summ));
}
}
}/////////////////
else if(strchr(ch, 'e')==NULL)//如果不含科学计数法e
{
if(i<strlen(ch))
for(j=i+;j<strlen(ch);j++) //小数部分
sum=sum*+(ch[j]-'');
sum /= pow(10.0,(double)(strlen(ch)--i));
return (sum+sumn); //返回值
}
}
double Calculate_Cla::Call(double sum,double data,char ch)
{
double ans=0.0;
switch(ch)
{
case '+':
ans=sum+data;
break;
case '-':
ans=sum-data;
break;
case '*':
ans=sum*data;
break;
case '/':
if( data!=0.0 )
ans=sum/data;
else
{
cout<<"程序出现除0错误,终止!\n";
system("pause");
exit();
}
break;
default:ans=0.0;
break;
}
return ans;
}
int Calculate_Cla::GetMatch(char* buffer,int pos) //利用栈找到匹配的括号
{
STACK<char> Temp;
int i;
for(i=pos;i<strlen(buffer);i++)
{
if(IsPar(buffer[i])==)//左括号l
Temp.push('');
if(IsPar(buffer[i])==-)//右括号l
{
Temp.pop();//出栈l
if(Temp.size()==) return i;
}
}
return -;
}
void Calculate_Cla::Opr(STACK<char>& symbol,STACK<double>& data,int& mark)//运算符操作l
{
double sum;
while(symbol.size()!=)//运算符栈大小不为0,l
{
char tem=symbol.pop();//出栈l
int temp=setPri(tem);//优先级l
symbol.push(tem);//入栈l
if(temp<mark)
break;
else
{
sum=Call(data.pop(),data.pop(),symbol.pop());
data.push(sum);
}
}
}
double Calculate_Cla::Calculate(char* buffer,double& sum) //字符串读入和各个函数调配
{
STACK<double> data;
STACK<char> symbol;
double ans;
char temp[MAX];
int ct=,mark=,tp=;
data.push(sum);//入栈l
while(ct<=strlen(buffer))
{
if(IsData(buffer[ct])) //如果是数字或小数点
{
while( ct < strlen(buffer) && IsData(buffer[ct]) )
{
temp[tp++]=buffer[ct++];
}
if(temp[tp-]=='e')
{
for(int k=;k<=;k++)
temp[tp++]=buffer[ct++];
temp[tp]='\0';
}
else temp[tp]='\0';
tp=; //读到非数字也非小数为止
ans=ToData(temp); //把读到的字符串转化为数
data.push(ans); //将数字存入栈中l if(ct==strlen(buffer)) //已经独到字符串末尾
{
mark=;
Opr(symbol,data,mark); //计算
sum=data.pop(); //此时data栈中还剩一个数据,即是结果
return sum; //返回结果
}
else
{
int mark=setPri(buffer[ct]);
Opr(symbol,data,mark); //计算
}
}
else if(IsSym(buffer[ct])&&buffer[ct-]!='e') //如果是运算符且不为指数部分
symbol.push(buffer[ct++]); //运算符入symbol栈
else
{
char BF[];int k=; //如果都不是,则只能是括号
while( IsPar( buffer[ct] )!= && ct <= strlen(buffer) )
BF[k++] = buffer[ct++];
BF[k]='\0';
if(IsPar(buffer[ct])==) //一旦读到左括号,寻找它匹配的右括号
{
int i,j;
char Temp[];
for(i=ct+,j=;i<GetMatch(buffer,ct);i++,j++)
Temp[j]=buffer[i]; //把这对括号中的字符串存入Temp
Temp[j]='\0';
data.push(Calculate(Temp,sum)); //递归调用Calculate直到没有括号
//然后开始计算,值层层返回最后将最终结果放入data栈
ct+=(strlen(Temp)+); //跳过已经处理完的字符
if(ct+==strlen(buffer)) //这里考虑字符串以括号结尾的情况
{
mark=;
Opr(symbol,data,mark);
sum=data.pop();
return sum;
}
else
{
mark=setPri(buffer[ct+]); //不是的话继续计算
Opr(symbol,data,mark);
}
ct++; //读入下一个字符
}
}
}
return .;
} class CheckStr
{
public:
static int check( char *str )
{
int i;
STACK<char> Temp;
for( i = ;i < strlen(str);i++ )
{
char t = str[i];
if( !( (int(str[i]) <= && int(str[i]) >= ) || str[i]=='(' || str[i]==')' || str[i]=='*'
|| str[i]=='+' || str[i]=='-' || str[i]=='/' || str[i]=='.'||str[i]=='e') ) //检测是否含有非法字符 添加科学计数法e
return ;
else if( str[i]=='(' )
Temp.push('');
else if( str[i]==')' )
{
if( Temp.size()<= ) //检测括号是否匹配,右括号是否过多
return ;
else
Temp.pop();
}
}
if( Temp.size()!= ) //检测括号是否匹配,左括号是否过多
return ;
return ;
}
}; double function(char*Str_input)//Str_input代入equation[][]
{
double sum=0.0;
cout.precision(); Calculate_Cla cl;
Output out; while()
{
Str_input;//输入模块
int res = CheckStr::check(Str_input); //判断模块 in.Str_input
if( res == )
break;
else if( res == )
cout<<"输入字符串括号不匹配,请重新输入:\n";
else if( res == )
cout<<"输入字符串有非法字符,请重新输入:\n";
else
{}
}
out.getRes( cl.Calculate(Str_input,sum) ); //计算模块
// out.printRes(); //输出模块
system("pause");
// return 0;
return out.printRes();
}
void main()
{
char *fun="12.3e-001+(-4.56e+002)";
// char *fun="1.23+(-456)";
double C=function(fun);
cout<<"这个表达式的结果为:"<<C<<endl;
}

c++四则运算代码的更多相关文章

  1. c++ 高精度 加减乘除 四则运算 代码实现

    很久以前写的啦 记得写了好久好久一直卡在特例的数据上面 想起都心塞 那时候变量和数组的取名对我来说简直是个大难题啊 完全乱来 abcdef就一路排下来 自己看的时候都搞不懂分别代表什么 好在后来英语学 ...

  2. 结队编程-基于gui的四则运算生成器

    成员:卢少锐 201421123027.刘存201421033023 coding.net地址 1.需求分析:除了实现四则运算的功能外,还添加了计时器功能和语言选择功能 2.程序设计:这次作业是基于上 ...

  3. 关于Java第一次实验的对课后问题自己的理解--验证码实现及其四则运算

    问题一.对于课上ppt中EnumTest所提出的的问题进行解答 将这段代码放到文件中进行运行后发现 1.对应的Size中不同元素的并不是同一个对象 2.以其中一个枚举类型s来说,不是原始数据,即他们都 ...

  4. 20145206邹京儒《Java程序设计》实验报告一:Java开发环境的熟悉(Windows+IDEA)

    20145206<Java程序设计>实验报告一:Java开发环境的熟悉(Windows+IDEA) 实验内容及步骤 1.使用JDK编译.运行简单的Java程序: 建立实验目录: 在IDEA ...

  5. 封装自己的Ajax框架

    Ajax技术就是利用javascript和xml实现异步交互的功能. 首先先来介绍一下Ajax相关知识点 一.Ajax对象的创建 1.创建Ajax对象的方式 a.第一种方式是针对IE浏览器 b.第二种 ...

  6. Java基础学习笔记十四 常用API之基本类型包装类

    基本类型包装类 Java中有8种基本的数据类型,可是这些数据是基本数据,想对其进行复杂操作,变的很难.怎么办呢?在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们 ...

  7. 实验一 Java开发环境的熟悉(Linux + Idea) 20175301李锦然

    https://gitee.com/ShengHuoZaiDaXue/20175301.git 实验一 Java开发环境的熟悉(Linux + Idea) 实验内容 1.使用JDK编译.运行简单的Ja ...

  8. 第二次作业-熟悉git

    GIT地址 https://github.com/gentlemanzq/yunsuanhomework GIT用户名  gentlemanzq 学号后五位  62320 博客地址 https://w ...

  9. C++Primer第五版——习题答案详解(八)

    习题答案目录:https://www.cnblogs.com/Mered1th/p/10485695.html 第9章 顺序容器 练习9.1 a.list,需要按字典序插入,可能插入位置在中间 b.d ...

随机推荐

  1. win7安装ruby on rails

    开发机:win7 旗舰版 - 64位 1,安装ruby,下载rubyinstaller-2.0.0-p451.exe 下载地址:http://rubyinstaller.org/downloads/ ...

  2. Unity3D——窗体介绍

    这是本人第一次的Unity的博客,主要还是依据雨松MOMO的视频来进行的,由于感觉视频比較直观,对于入门比較快,再加上自己有对应的编程基础,如今看书的话效率不高,所以先看几个视频了解一下大体的流程,感 ...

  3. poj 1012 Joseph (约瑟夫问题)

    Joseph Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 47657   Accepted: 17949 Descript ...

  4. shell 中条件判断

    if 中的 -z 到 -d 的意思 2011-09-05 10:30 [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真. [  ...

  5. Java 编程的动态性,第3部分: 应用反射--转载

    在 上个月的文章中,我介绍了Java Reflection API,并简要地讲述了它的一些基本功能.我还仔细研究了反射的性能,并且在文章的最后给出了一些指导方针,告诉读者在一个应用程序中何时应该使用反 ...

  6. [转] 使用Spring Boot和Gradle创建项目

    Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的 ...

  7. [Android]android.graphics.Camera实现图像的旋转、缩放,配合Matrix实现图像的倾斜

    android.graphics.Camera可以对图像执行一些比较复杂的操作,诸如旋转与绽放,与Matrix可实现图像的倾斜. 个人总结Camera与Matrix的一些区别如下: Camera的ro ...

  8. js上拉加载、下拉刷新的插件

    之前在网上找那种下拉刷新,上拉加载的插件,有一款IScroll,但是用起来太麻烦,于是就自己写了款,但依赖于jquery.js,bug肯定有,希望评论提出. js: /* 简洁的下拉刷新,上拉加载插件 ...

  9. Managing linux Shell Jobs

    Managing Shell Jobs   When moving jobs between the foreground and background, it may be useful to ha ...

  10. 人工智能2:智能Agent

    一.Agent基本定义 基于理性行为的Agent是本书人工智能方法的核心.Agent由传感器.执行器两个重要元件组成,具有与环境交互的能力,其能力是通过分析感知序列,经过Agent函数映射到相应的行动 ...