TXT四则运算计算器

基本思想:使用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!=0)
            fm=FM;
        else
            cout<<"分母不能为0\n";
        }
         Fenshu(){
        fz=-1;
        fm=-1;
        }
         Fenshu(int a,int b){
        fz=a;
        if(b!=0)
            fm=b;
        else cout<<"分母不能为0\n";
        }

         int gcd(int a, int b)//求最大公约数
        {
            if(b == 0)
                return a;
            return gcd(b, a % b);
        }

         void yuefen(){//约分
             int Gcd=1;
            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 =100;
    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(0,1);
    int k = 0;
    while(str[*i] >=‘0‘ && str[*i]<=‘9‘)  // 处理整数部分
    {
        x.setfz(x.getfz()*10+(str[*i]-‘0‘) );
        (*i)++;
    }

    if(str[*i]==‘.‘) // 处理小数部分
    {
        (*i)++;
        while(str[*i] >= ‘0‘&&str[*i] <=‘9‘)
        {
            x.setfz(x.getfz()*10+(str[*i]-‘0‘));
            x.setfm(x.getfm()*10);
            (*i)++;
            k++;
        }
    }
    return x;
}

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

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

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

//修正负号的场合
             if (pre[i]==‘-‘)    // 负号使用场合
            {
                if(pre[i-1]<‘0‘ || pre[i-1]>‘9‘ || pre[i-1]==‘(‘ || i==0)
                {
                    post[j++]=‘_‘;
                    i++;
                    continue;
                }
            }
时间: 2024-10-10 12:30:20

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

十进制四则运算计算器代码,输入为字符串

转发个严蔚敏老师的<数据结构及应用算法教程>里的十进制四则运算计算器代码,实习生笔试遇到过不会写,特此做个记录. ************************** 文件:calculator.c ************************** #define NonEmpty 0#define PLUS -1 // '+'#define MINUS -2 // '-'#define ASTERISK -3 // '*' #define SLANT -4 // '/'#define M

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

在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #define SIZE 1000 //表达式的单个元素所使用的结构体 typedef struct elem { int num = 0; //若元素存储操作数则num为该操作数 char oper = '='; //若元素存储操作符则oper为该操作符 bool IsNum = false; //用于

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

最近看了一个大神推荐的某公司面试程序员的js 面试题,题目是用js 做一个计算器于是跟着大神的思想自己做了一下 ps:功能还没有完善好毕竟自己还是一只菜鸟还在不断学习中. 闲话不多说先上css代码 <style type="text/css"> *{ padding: 0px; margin: 0px; border: 0px; } .wrapper{ border: 5px solid #000; width: 300px; height: 400px; margin:

逆波兰算法,实现一个四则运算计算器

计算器分两步实现: 1.将常规表达式(中缀表达式)处理成后缀表达式. 2.计算后缀表达式. 第一步:  中缀如:1+(2*3)-4/2,转化为后缀123*+42/- . 规则:从左往右遍历中缀表达式,如果是数字,就直接拿出来,如果是符号,那么判断优先级,如果当前符号(包括右括号)的优先级不大于栈顶符号的优先级,那么依次出栈,直到优先级不满足(如果是右括号,那么直到出栈到左括号,后缀表达式里不需要左右括号),然后把该符号入栈.优先级高的直接入栈.如此直到搞定. 第二步: 计算后缀表达式. 规则:从

【Visual Basic】纯代码不拖控件,利用动态生成控件的方式完成一个简单的四则运算计算器

vb6是一个典型的拖控件加代码的编程代表,因此也一直被认为难登大雅之堂,但是,在vb6中可以完全纯粹地使用代码控制这个窗体与窗体的控件.这样生成出来的控件位置摆放精确无比,无须拖好控件之后,再利用工具栏的"格式"菜单慢慢地调整大小.这种方式的确定是声明一个控件要耗费大量的代码,但其实Java中的Swing,HTML+CSS排放控件,比这好不了多少. 当然,比vc6中mfc的代码简单了不少,具体见<[mfc]基本对话框程序--加法器>(点击打开链接) 一.基本目标 利用纯粹代

JS做一个四则运算计算器

用JS做一个简单的网页计算器如上图所示,只进行简单的加减乘除运算 <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>计数器</title></head><body>    <input type="text" name="text"

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

实验目的 运用简单的MIPS实现一个能够整数加减乘除的计算器,同时使自己更加熟悉这些指令吧 MIPS代码 #https://blog.csdn.net/oncoding/article/details/4346531 #sample example 'a small calculater' # data section .data value: .word 0, 0, 0 ,0 ,0 # 0: first num ,4 : second num , 8 : operation , 12:resu

简单四则运算计算器

#include<stdio.h> void print(void) { printf("*************************\n"); printf("*****1:add 2:sub*******\n"); printf("*****3:mul 4:div*******\n"); printf("*************************\n"); } int add(int x,int

简单的四则运算计算器

<span style="font-size:24px;">#include<stdio.h> void print_menu() { printf("*********************\n"); printf("***1.add 2.sub***\n"); printf("***3.mul 4.div***\n"); printf("*********************\n&q