C++实现四则混合运算计算器

本文实例为大家分享了C++实现四则混合运算的计算器,供大家参考,具体内容如下

计算器是带括号的四则运算实际上利用的是栈后进先出的原则

转换思想:

#define _CRT_SECURE_NO_WARNINGS 1
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#define maxsize 1024
typedef struct
{
 float data[maxsize];
 int top;
}Stack1;
void Initstack1(Stack1 *S)
{
 S = (Stack1*)malloc(sizeof(Stack1));
 S->top = -1;
}
int Push1(Stack1 *S, float ch)
{
 if (S->top == maxsize - 1)
  return 0;
 else
 {
  S->top++;
  S->data[S->top] = ch;
  return 1;
 }
}//入栈Push
int Pop1(Stack1 *S, float ch)
{
 if (S->top == -1)
  printf("栈上溢出!\n");
 else
  ch = S->data[S->top];
 S->top--;
 return 1;
}//出栈
typedef struct
{
 char data[maxsize];
 int top;
}Stack2;
void Initstack2(Stack2 *S)
{
 S = (Stack2*)malloc(sizeof(Stack2));
 S->top = -1;
}
int Push2(Stack2 *S, char ch)
{
 if (S->top == maxsize - 1)
  return 0;
 else
 {
  S->top++;
  S->data[S->top] = ch;
  return 1;
 }
}//入栈Push
int Pop2(Stack2 *S, char ch)
{
 if (S->top == -1)
  printf("栈上溢出!\n");
 else
  ch = S->data[S->top];
 S->top--;
 return 1;
}//出栈
int Comop(char ch) //判断是否是运算符
{
 switch (ch)
 {
 case'+':
 case'-':
 case'*':
 case'/':
 case'(':
 case')':
 case'#':
  return 1;
 default:
  return 0;
 }
}//判断ch是否为运算符
char Prior[7][7] =
{ // 运算符优先级表
   // '+' '-' '*' '/' '(' ')' '#'
 /*'+'*/{ '>', '>', '<', '<', '<', '>', '>' },
 /*'-'*/{ '>', '>', '<', '<', '<', '>', '>' },
 /*'*'*/{ '>', '>', '>', '>', '<', '>', '>' },
 /*'/'*/{ '>', '>', '>', '>', '<', '>', '>' },
 /*'('*/{ '<', '<', '<', '<', '<', '=', '< ' },
 /*')'*/{ '>', '>', '>', '>', ' ', '>', '>' },
 /*'#'*/{ '<', '<', '<', '<', '<', '> ', '=' },
};
int Opid(char op1)
{
 switch (op1)
 {
 case'+':return 0;
 case'-':return 1;
 case'*':return 2;
 case'/':return 3;
 case'(':return 4;
 case')':return 5;
 case'#':return 6;
 default:return -123456;
 }
}
char Precede(char op1, char op2) //优先级比较
{
 int a, b;
 a = Opid(op1); b = Opid(op2);
 return(Prior[a][b]);
}
float Operation(float a, char op, float b)
{
 switch (op)
 {
 case '+':
  return b + a;
 case '-':
  return b - a;
 case '*':
  return b * a;
 case '/':
  return b / a;
 default:
  return -123456;
 }
}
void CreateExpression(char *exp)
{

 if (exp == NULL)
 {
  exit(1);
 }
 scanf("%s", exp);
}
void TransmitExpression(char *exp, char postexp[]) //中缀表达式转换后缀表达式
{
 Stack2 FZ;
 Initstack2(&FZ);
 int i = 0;
 char x;
 FZ.top = -1;
 Push2(&FZ, '#');
 FZ.data[FZ.top] = '#';
 while (*exp != '\0')
 {
  if (!Comop(*exp))
  {
   while (*exp >= '0'&&*exp <= '9')//读取一个数字串
   {
    postexp[i++] = *exp;
    exp++;
   }
   postexp[i++] = '#';
  }
  else
   switch (Precede(FZ.data[FZ.top], *exp))
  {
   case'<':
    Push2(&FZ, *exp);
    exp++;
    break;
   case'=':
    x = FZ.data[FZ.top];
    Pop2(&FZ, x);
    exp++;
    break;
   case'>':
    postexp[i++] = FZ.data[FZ.top];
    x = FZ.data[FZ.top];
    Pop2(&FZ, x);
    break;
  }
 }
 while (FZ.data[FZ.top] != '#')
 {
  postexp[i++] = FZ.data[FZ.top];
  x = FZ.data[FZ.top];
  Pop2(&FZ, x);
 }
 postexp[i] = '\0';
}
float EvaluateExpression(char *postexp) //后缀表达式的计算
{
 Stack1 SZ;
 Initstack1(&SZ);
 float a, b, d;
 SZ.top = -1;
 while (*postexp != '\0')
 {
  switch (*postexp)
  {
  case'+':
  case'-':
  case'*':
  case'/':
   a = SZ.data[SZ.top];
   Pop1(&SZ, a);
   b = SZ.data[SZ.top];
   Pop1(&SZ, b);
   Push1(&SZ, Operation(a, *postexp, b));
   break;
  default:
   d = 0;
   while (*postexp >= '0'&&*postexp <= '9')
   {
    d = 10 * d + *postexp - '0';
    postexp++;
   }
   Push1(&SZ, d);
   SZ.data[SZ.top] = d;

   break;
  }
  postexp++;
 }
 return(SZ.data[SZ.top]);
}
int Error(char *exp) //错误表达式判断
{
 int i = 0;
 while (exp[i] != '\0')
 {
  if (
   ((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i + 1] == ')'))
   || ((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i - 1] == '('))
   || (exp[i] == ')'&&exp[i + 1] == '(')
   || (exp[i] == '('&&exp[i + 1] == ')')
   || ((exp[i] == ')') && exp[i + 1] >= '0'&&exp[i + 1] <= '9')
   || (exp[i] >= '0'&&exp[i] <= '9'&&exp[i + 1] == '(')
   || (exp[0] == '+' || exp[0] == '-' || exp[0] == '*' || exp[0] == '/' || exp[0] == ')')
   || ((exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') && (exp[i + 1] == '+' || exp[i + 1] == '-' || exp[i + 1] == '*' || exp[i + 1] == '/'))
   || (exp[i] == '/'&&exp[i + 1] == '0')
   )
   return 1;
  else
  if (exp[i] == '\0')
   return 0;
  i++;
 }
 return 0;
}
void menu()
{
 printf("\t\t--------------------------------------------\n");
 printf("\t\t|     计算器     |\n");
 printf("\t\t|    ----------------   |\n");
 printf("\t\t|    |    |   |\n");
 printf("\t\t|    ----------------   |\n");
 printf("\t\t|    1 2 3 +    |\n");
 printf("\t\t|    4 5 6 -    |\n");
 printf("\t\t|    7 8 9 *    |\n");
 printf("\t\t|    0 ( ) /    |\n");
 printf("\t\t--------------------------------------------\n");
 printf("\t\t 请输入你要进行的操作:\n");
 printf("\t\t a表达式求值 b清空 c退出\n");
}
void clear()
{
 system("cls");
 menu();
}
void Quit()
{
 system("cls");
 exit(1);
}
void main()
{
 char c;
 char exp[maxsize];
 char postexp[maxsize] = { 0 };
 menu();
 while (1)
 {
  scanf("%c", &c);
  switch (c)
  {
  case 'a':
  sr :
   printf("请输入要计算的表达式:\n");
   CreateExpression(exp);
   if (!Error(exp))
   {
    TransmitExpression(exp, postexp);
    printf("后缀表达式为:%s\n", postexp);
    printf("表达式结果为:%s=", exp);
    printf("%g\n", EvaluateExpression(postexp));
    break;
   }
   else
   if (Error(exp))
   {
    printf("您输入的表达式有误!\n");
    goto sr;//goto语句在循环体里进行跳转
   }
  case'b':
   clear();
   break;
  case'c':
   Quit();
   break;
  }
 }
 system("pause");
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++实现 vector 的四则运算

    这里假设 vector 的运算定义为对操作数 vector 中相同位置的元素进行运算,最后得到一个新的 vector.具体来说就是,假如 vector<int> d1{1, 2, 3}, d2{4, 5, 6};则, v1 + v2 等于 {5, 7, 9}.实现这样的运算看起来并不是很难,一个非常直观的做法如下所示: vector<int> operator+(const vector<int>& v1, const vector<int>&

  • C++实现四则运算器(无括号)

    本文实例为大家分享了C++实现无括号的四则运算器的具体代码,供大家参考,具体内容如下 完成度更高的带括号版本可以看C++实现四则运算器(带括号) 对于无括号的计算器,实现起来比较容易,下面让我们一步步实现. 举例 首先明确需要实现怎样的程序,对于无括号的计算器,大概做成这样就可以了: 52+34*3-4/2= 分析 对于例子中的表达式,由于乘除运算的优先级高于加减运算,我们不能直接从左到右进行.但四则运算的规则是从左到右,先乘除后加减,对于优先级相同的运算符还是可以从左到右运算的. ​ 因此我们

  • C++实现正整数的四则运算表达式

    本文实例为大家分享了C++正整数的四则运算表达式的具体代码,供大家参考,具体内容如下 设计程序,用户输入一个正整数的四则运算表达式的字符串,输出相应的运算结果. (假设每个字符串表达式只有一个运算符,且是合法的) 如: 输入字符串23+54,则输出77,如果是整数除法,只需输出商即可. #include <iostream> #include <cstdio> using namespace std; int main() { int i, j, k, len = 0, lenf

  • C++实现四则运算器(带括号)

    本文实例为大家分享了C++实现四则运算器的具体代码,供大家参考,具体内容如下 基本分析可以看另一篇文章:C++实现四则运算器(无括号) 栈的实现 //stack.h #ifndef STACK_H #define STACK_H #include<iostream> class stack_int { private: int* bottom; //栈底 int* top; //栈顶 unsigned int capacity;//栈容量 unsigned int size; //栈大小 pu

  • C++实现四则混合运算计算器

    本文实例为大家分享了C++实现四则混合运算的计算器,供大家参考,具体内容如下 计算器是带括号的四则运算实际上利用的是栈后进先出的原则 转换思想: #define _CRT_SECURE_NO_WARNINGS 1 #include"stdio.h" #include"stdlib.h" #include"string.h" #define maxsize 1024 typedef struct { float data[maxsize]; int

  • Java实现四则混合运算代码示例

    使用栈来实现,可以处理运算优先级. 使用自然四则运算表达式即可,如:4+(3*(3-1)+2)/2.无需把表达式先转换为逆波兰等形式. package com.joshua.cal; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; im

  • java图形化界面实现简单混合运算计算器的示例代码

    写了好几天了终于写完了这个四则运算计算器,总代码放在后面 截图如下: 首先是布局都比较简单,最上面的一个框是总的输出框, 第二个框是每次输入的数字显示在框内, 对于每一个按钮都增加监听器, 对于数字按钮:当长度大于8的 或者等号已经出现之后就不再处理按钮事件 if(e.getSource().equals(button1)) { s=numberText.getText(); //数字长度大于8或者等号已出现 if(s.length()>8 || equalbook == 1) { } else

  • JavaScript实现计算器的四则运算功能

    目录 一.需求 + 最终实现 1. 需求 2. 说明:利用了字符串(split.replace)和数组(splice)的方法. 3. 代码实现 二.实现步骤 1. 版本一:实现基础加减乘除 2. 版本二:实现高位数的运算 3. 支持多次的运算 三.思考 后端思维 前端思维 结束 一.需求 + 最终实现 注:只是前端实现 1. 需求 需求来源是因为有一个做嵌入式 C/C++的基友做了一个远程计算器. 需求是要求支持输入一个四则混合运算公式的字符串,返回计算后的结果. 想看看用 C/C++封装过的

  • Python利用正则表达式实现计算器算法思路解析

    (1)不使用eval()等系统自带的计算方法 (2)实现四则混合运算.括号优先级解析 思路: 1.字符串预处理,将所有空格去除 2.判断是否存在括号运算,若存在进行第3步,若不存在则直接进入第4步 3.利用正则表达式获取最底层括号内的四则运算表达式 4.将四则运算表达式进行预处理:表达式开头有负数时,在表达式前加上一个0 5.利用re.split().re.findall()方法,通过加减符号,对四则运算进行拆分为乘除运算式和数字,并保留对应的位置下标. 6.利用re.split().re.fi

  • JavaScript实现简单网页版计算器

    背景 由于我又被分进了一个新的项目组,该项目需要用js,因为我没接触过,所以领导准备给我一周时间学习,没错,实现一个简单的支持四则混合运算的计算器就是作业,所以有了这篇文章 故,这篇文章主要重点就不在html和css了,毕竟我也只是略懂皮毛,并未深究过 实现效果 最终展现的页面如下图,当鼠标点击按键时,按键会变色,可以进行四则混合运算 上面一行显示计算式,当按下"="时,显示计算结果 用到的技术 计算器的页面是使用html的table绘制的 按键的大小,颜色,鼠标悬浮变色是用css设置

  • Java 中执行动态表达式语句前中后缀Ognl、SpEL、Groovy、Jexl3

    目录 Ognl.SpEL.Groovy.Jexl3 一.前中后缀简单描述 1.前缀.中缀.后缀表达式(逆波兰表达式) 2.中缀表达式 3.后缀表达式 4.前缀表达式 二.OGNL 三.SpEL 四.Jexl/Jexl3 五.Groovy 六.扩展 Ognl.SpEL.Groovy.Jexl3 在一些规则集或者工作流项目中,经常会遇到动态解析表达式并执行得出结果的功能. 规则引擎是一种嵌入在应用程序中的组件,它可以将业务规则从业务代码中剥离出来,使用预先定义好的语义规范来实现这些剥离出来的业务规则

  • 探索PowerShell (二) PowerShell的基本操作

    PowerShell控制台 打开PowerShell,显示如下界面: 命令提示符前缀为: PS C:\Users\MaRui> PS的意思为正在运行PowerShell中,而C:则是我的主目录驱动器号,不同机器会有所不同. 最最最基本的操作与cmd.dos.sh等相同. cmdlet命令 虽然有超过一百条新的PowerShell命令需要去学习,但是,与大多数命令行界面一样,PowerShell命令已经被标准化.它使用"动词-名词"的命名形式作为一个cmdlet命令.该标准大大降低

  • 浅谈junit4单元测试高级用法

    Junit单元测试框架是Java程序开发必备的测试利器,现在最常用的就是Junit4了,在Junit4中所有的测试用例都使用了注解的形式,这比Junit3更加灵活与方便.之前在公司的关于单元测试的培训课程中,讲师仅仅讲述了Junit4的基本的与生命周期相关的注解的使用,主要包括@BeforeClass.@Before.@Test.@After.@AfterClass这些注解,这些在应付普通简单的单元测试已经足够,然而有很多更加复杂且也会经常遇到的测试需求依靠这些生命周期注解并不能完成!因此这篇分

  • Java编程用栈来求解汉诺塔问题的代码实例(非递归)

    [题目] 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须经过中间.求当塔有N层的时候,打印最优移动过程和最优移动总步数. [解答] 上一篇用的是递归的方法解决这个问题,这里我们用栈来模拟汉诺塔的三个塔,也就是不用递归的方法 原理是这样的:修改后的汉诺塔问题不能让任何塔从左直接移动到右,也不能从右直接移动到左,而是要经过中间,也就是说,实际上能做的动作,只有四个:左->中,中->左,中->右,右->中 用栈

随机推荐