欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-24 22:48:30
本文实例为大家分享了c++实现四则混合运算的计算器,供大家参考,具体内容如下计算器是带括号的四则运算实际上利用的是栈后进先出的原则转换思想:#define _crt_secure_no_warning...

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

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

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

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");
}

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

相关标签: C++ 计算器