1. 程式人生 > 程式設計 >C++實現四則混合運算計算器

C++實現四則混合運算計算器

本文例項為大家分享了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");
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。