//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. motan源码分析六:客户端与服务器的通信层分析

    本章将分析motan的序列化和底层通信相关部分的代码. 1.在上一章中,有一个getrefers的操作,来获取所有服务器的引用,每个服务器的引用都是由DefaultRpcReferer来创建的 pub ...

  2. Android中自定义Activity和Dialog的位置大小背景和透明度等

    1.自定义Activity显示样式 先在res/values下建colors.xml文件,写入: view plainprint? 1. <?xml version="1.0" ...

  3. Target runtime Apache Tomcat v6.0 is not defined. phyy Unknown Faceted Project Problem

    Description Resource Path Location TypeTarget runtime Apache Tomcat v6.0 is not defined. phyy Unknow ...

  4. 配置本地yum源的方法

    配置本地yum源的方法 1. 挂载光驱 如果是上传iso镜像到服务器上,则直接挂载iso镜像即可: #mount -o loop -t iso9660 /xxxx.iso /挂载目录 开机自动加载#v ...

  5. LA 6448 Credit Card Payment

      [题目] 你的信用卡目前欠M元,每月的汇率是R,每月的利息要四舍五入为小数点后两位,你每月还B元,问多少月能还清. 输入 先是T代表测试数据组数 接下来T行,每行有三个实数,R,M,B每个实数小数 ...

  6. sql循环遍历

    <sql id="Example_Where_Clause" > <!-- WARNING - @mbggenerated This element is aut ...

  7. Phonegap 版本minSdkVersion为8的时候的自动更新与升级

    清单文件中: <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8"/> ...

  8. sql server语句

    一.基础1.说明:创建数据库CREATE DATABASE 数据库名2.说明:删除数据库drop database 数据库名3.说明:备份sql server--- 创建 备份数据的 deviceUS ...

  9. ASP.net关于C#代码与javaScript函数的相互调用

    C#代码与javaScript函数的相互调用 问:1.如何在JavaScript访问C#函数?2.如何在JavaScript访问C#变量?3.如何在C#中访问JavaScript的已有变量?4.如何在 ...

  10. maven自动下载jar包

    只需要修改pom文件即可.需要哪个jar包,在pom中就配置哪个(还包括手动向仓库中添加) 例如 http://blog.csdn.net/beyondlpf/article/details/8592 ...