C++實現(xiàn)四則混合運算計算器
更新時間:2020年11月25日 13:16:31 作者:persistence_s
這篇文章主要為大家詳細介紹了C++實現(xiàn)四則混合運算計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C++實現(xiàn)四則混合運算的計算器,供大家參考,具體內(nèi)容如下
計算器是帶括號的四則運算實際上利用的是棧后進先出的原則


轉(zhuǎn)換思想:

#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] =
{ // 運算符優(yōu)先級表
// '+' '-' '*' '/' '(' ')' '#'
/*'+'*/{ '>', '>', '<', '<', '<', '>', '>' },
/*'-'*/{ '>', '>', '<', '<', '<', '>', '>' },
/*'*'*/{ '>', '>', '>', '>', '<', '>', '>' },
/*'/'*/{ '>', '>', '>', '>', '<', '>', '>' },
/*'('*/{ '<', '<', '<', '<', '<', '=', '< ' },
/*')'*/{ '>', '>', '>', '>', ' ', '>', '>' },
/*'#'*/{ '<', '<', '<', '<', '<', '> ', '=' },
};
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) //優(yōu)先級比較
{
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[]) //中綴表達式轉(zhuǎn)換后綴表達式
{
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')//讀取一個數(shù)字串
{
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("表達式結(jié)果為:%s=", exp);
printf("%g\n", EvaluateExpression(postexp));
break;
}
else
if (Error(exp))
{
printf("您輸入的表達式有誤!\n");
goto sr;//goto語句在循環(huán)體里進行跳轉(zhuǎn)
}
case'b':
clear();
break;
case'c':
Quit();
break;
}
}
system("pause");
}
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
帶你用C語言實現(xiàn)strtok和字符串分割函數(shù)
下面小編就為大家?guī)硪黄猚語言中字符串分割函數(shù)及實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2021-09-09
利用C語言模擬實現(xiàn)qsort,strcpy,strcat,strcmp函數(shù)
這篇文章主要為大家詳細介紹了如何通過C語言模擬實現(xiàn)qsort(采用冒泡的方式),strcpy,strcat,strcmp等函數(shù),文中的示例代碼講解詳細,感興趣的可以了解一下2022-11-11

