基本思想:使用getline函数从TXT文件中依次读出中缀表达式,将其转为后缀表达式后计算结果,并与用户结果比对。

整数、分数、小数的处理:将小数和整数都视为默认分母为1的分数.建立分数类,在中缀转换成后缀时将整数和小数转换为分数.

class Fenshu
{
private:
int fz;
int fm;
public:
int getfz(){
return fz;
}
int getfm(){
return fm;
}
void setfz(int FZ){
fz=FZ;
}
void setfm(int FM){
if(FM!=)
fm=FM;
else
cout<<"分母不能为0\n";
}
Fenshu(){
fz=-;
fm=-;
}
Fenshu(int a,int b){
fz=a;
if(b!=)
fm=b;
else cout<<"分母不能为0\n";
} int gcd(int a, int b)//求最大公约数
{
if(b == )
return a;
return gcd(b, a % b);
} void yuefen(){//约分
int Gcd=;
Gcd=gcd(fz,fm);
//cout<<"GCD:"<<Gcd<<endl;
fz=fz/Gcd;
fm=fm/Gcd;
// cout<<"results:";show();//test
} Fenshu operator+(Fenshu F)
{
return Fenshu(fz*F.fm+F.fz*fm,fm*F.fm);
}
Fenshu operator-(Fenshu F)
{
return Fenshu(fz*F.fm-F.fz*fm,fm*F.fm);
}
Fenshu operator*(Fenshu F)
{
return Fenshu(fz*F.fz,fm*F.fm);
}
Fenshu operator/(Fenshu F)
{
return Fenshu(fz*F.fm,fm*F.fz);
}
void show(){
cout<<fz<<"/"<<fm<<endl;
}
};

关于求最大公约数所使用的辗转相除法在上一篇博文中已经写过。为了之后代码书写方便,使用了重载。

中缀转换成后缀的处理:使用栈作为数据结构.

template <class ElemType> class MyStack
{
public:
const static int MAXSIZE =;
ElemType data[MAXSIZE];
int top;//栈顶脚标 public:
void init(); // 初始化栈
bool empty(); // 判断栈是否为空
ElemType gettop(); // 读取栈顶元素(不出)
void push(ElemType x); // 进栈
ElemType pop(); // 出栈
};

遇到的问题:

1.分数类定义是分子和分母作为int型变量,题目中出现的小数不能运算;

分析:要将小数转换成可存进分数的整数,小数点后每有一位,分子分母同乘10,

// 将数字字符串转变成相应的数字
Fenshu read_number(char str[],int *i)
{
Fenshu x(,);
int k = ;
while(str[*i] >='' && str[*i]<='') // 处理整数部分
{
x.setfz(x.getfz()*+(str[*i]-'') );
(*i)++;
} if(str[*i]=='.') // 处理小数部分
{
(*i)++;
while(str[*i] >= ''&&str[*i] <='')
{
x.setfz(x.getfz()*+(str[*i]-''));
x.setfm(x.getfm()*);
(*i)++;
k++;
}
}
return x;
}

2.对于存在负号'-'的题目提示栈为空;

分析:负号与减号的字符同为'-',导致在中缀转后缀时负号与减号进行了相同的操作(弹出两个栈顶的操作数)导致操作数错误操作;

解决方法:找出作为负号使用的'-',转换时替换成别的符号写入后缀表达式.计算后缀表达式时,将该符号后的数字作为0的减数压入栈

//修正负号的场合
if (pre[i]=='-') // 负号使用场合
{
if(pre[i-]<'' || pre[i-]>'' || pre[i-]=='(' || i==)
{
post[j++]='_';
i++;
continue;
}
}

TXT四则运算计算器的更多相关文章

  1. TXT四则运算计算器 后日谈

    经过了软件工程第一个个人项目——<<四则运算器>>的开发后,对软件开发有了新的认识.题目中并没有明确说明对小数和负数是否应该提供支持.在第一个项目结束后,第二个项目则是针对上一 ...

  2. 利用ANTLR4实现一个简单的四则运算计算器

    利用ANTLR4实现一个简单的四则运算计算器 ANTLR4介绍 ANTLR能够自动地帮助你完成词法分析和语法分析的工作, 免去了手写去写词法分析器和语法分析器的麻烦 它是基于LL(k)的, 以递归下降 ...

  3. java 24 - 8 GUI之创建四则运算计算器(未校验版)

    这个是用NetBeans软件制作的,因为这个软件制作GUI任务比较方便 通过拖拽控件生成的窗体:(红色的名称是更改后的控件名称) 拉拽好布局后,要进行的步骤: A:更改想要进行操作的控件的名称(右键控 ...

  4. 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

    在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...

  5. php实现一个简单的四则运算计算器

    php实现一个简单的四则运算计算器(还不支持括号的优先级).利用栈这种数据结构来计算表达式很赞. 这里可以使用栈的结构,由于php的数组“天然”就有栈的特性,这里直接就利用了数组.当然可以使用栈结构写 ...

  6. Object-C,四则运算计算器

    下面是是一个比较复杂的类. 定义一个四则运算计算器Caculator的接口和实现. 在main函数中,让用户输入四则运算表达式,比如a+b,a-b. 最后,在控制台输出结果. 用到的语法:接口.类的定 ...

  7. 【实践】js实现简易的四则运算计算器

    最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 & ...

  8. mfc基于对话框的简单四则运算计算器

    1.①创建mfc对话框窗口,对话框中所有控件都delete. ②绘制界面,按键都button,显示区域edit control,计算器名字用static text. ③所有控件ID改成语义化ID(可不 ...

  9. MIPS汇编程序设计——四则运算计算器

    实验目的 运用简单的MIPS实现一个能够整数加减乘除的计算器,同时使自己更加熟悉这些指令吧 MIPS代码 #sample example 'a small calculater’ # data sec ...

随机推荐

  1. android 数字键盘制作

    //布局相关<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android ...

  2. VMware Workstation 11序列号一枚

    VMware Workstation 11序列号: 1F04Z-6D111-7Z029-AV0Q4-3AEH8

  3. 挖潜无极限———数据挖掘技术与应用热点扫描[ZZ]

    “我们把世界看成数学,并且把你也看成数学”——用这句话来说明数据挖掘技术的复合性和应用的广泛性似乎再好不过.如今,虽然一些行业在应用这一技术上仍然缺乏足够的主动,但一个不能阻挡的趋势是:已经有越来越多 ...

  4. WPF DataBinding之我见

    原创,转载请注明出处:WPF DataBinding之我见 一.DataBinding介绍   数据绑定是在应用程序 UI 与业务逻辑之间建立连接的过程. 如果绑定具有正确设置并且数据提供正确通知,则 ...

  5. 头一回发博客,来分享个有关C++类型萃取的编写技巧

    废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...

  6. Java包详解

    背景: 在java中要求文件名和类名相同,所以如果把多个类放在一起,就可能出现文件名冲突 所以用包来解决,一个包中可以包含多个类 包是java提供的一种用于区别类的名字空间的机制,是类的组织方式,是一 ...

  7. python操作memcache

            48.python 操作memcached                  Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存 ...

  8. linux下svn客户端报错Cannot negotiate authentication mechanism的解决方法

    svn客户端报错Cannot negotiate authentication mechanism的解决方法: 问题出现的原因之一: 因为SVN服务器配置了saslauthd服务用来实现与ldap的对 ...

  9. [R]django的HTTPREQUEST对象

    django的HTTPREQUEST对象 via Django使用request和response对象 当请求一张页面时,Django把请求的metadata数据包装成一个HttpRequest对象, ...

  10. 关于sql server 代理(已禁用代理xp)

    由于有数据库在恢复,导致计划不能执行,先操作如下: 关闭数据库的服务..然后把数据库文件剪切出来.然后在起服务.进入SqlSever删除数据库.因为文件已经剪切走了.所以不会删除文件.再把数据库拷到M ...