C++實(shí)現(xiàn)四則混合運(yùn)算計(jì)算器
本文實(shí)例為大家分享了C++實(shí)現(xiàn)四則混合運(yùn)算的計(jì)算器,供大家參考,具體內(nèi)容如下
計(jì)算器是帶括號(hào)的四則運(yùn)算實(shí)際上利用的是棧后進(jìn)先出的原則


轉(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) //判斷是否是運(yùn)算符
{
switch (ch)
{
case'+':
case'-':
case'*':
case'/':
case'(':
case')':
case'#':
return 1;
default:
return 0;
}
}//判斷ch是否為運(yùn)算符
char Prior[7][7] =
{ // 運(yùn)算符優(yōu)先級(jí)表
// '+' '-' '*' '/' '(' ')' '#'
/*'+'*/{ '>', '>', '<', '<', '<', '>', '>' },
/*'-'*/{ '>', '>', '<', '<', '<', '>', '>' },
/*'*'*/{ '>', '>', '>', '>', '<', '>', '>' },
/*'/'*/{ '>', '>', '>', '>', '<', '>', '>' },
/*'('*/{ '<', '<', '<', '<', '<', '=', '< ' },
/*')'*/{ '>', '>', '>', '>', ' ', '>', '>' },
/*'#'*/{ '<', '<', '<', '<', '<', '> ', '=' },
};
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)先級(jí)比較
{
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[]) //中綴表達(dá)式轉(zhuǎn)換后綴表達(dá)式
{
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')//讀取一個(gè)數(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) //后綴表達(dá)式的計(jì)算
{
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) //錯(cuò)誤表達(dá)式判斷
{
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| 計(jì)算器 |\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 請(qǐng)輸入你要進(jìn)行的操作:\n");
printf("\t\t a表達(dá)式求值 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("請(qǐng)輸入要計(jì)算的表達(dá)式:\n");
CreateExpression(exp);
if (!Error(exp))
{
TransmitExpression(exp, postexp);
printf("后綴表達(dá)式為:%s\n", postexp);
printf("表達(dá)式結(jié)果為:%s=", exp);
printf("%g\n", EvaluateExpression(postexp));
break;
}
else
if (Error(exp))
{
printf("您輸入的表達(dá)式有誤!\n");
goto sr;//goto語(yǔ)句在循環(huán)體里進(jìn)行跳轉(zhuǎn)
}
case'b':
clear();
break;
case'c':
Quit();
break;
}
}
system("pause");
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- c++編寫(xiě)簡(jiǎn)單的計(jì)算器程序
- 簡(jiǎn)單實(shí)現(xiàn)C++復(fù)數(shù)計(jì)算器
- C/C++實(shí)現(xiàn)日期計(jì)算器的示例代碼
- C++有限狀態(tài)機(jī)實(shí)現(xiàn)計(jì)算器小程序
- C/C++經(jīng)典實(shí)例之模擬計(jì)算器示例代碼
- C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
- C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能
- C++實(shí)現(xiàn)分?jǐn)?shù)計(jì)算器
- 基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器
- C++制作簡(jiǎn)單的計(jì)算器功能
相關(guān)文章
C++ 二維(多維)vector添加一個(gè)空項(xiàng)問(wèn)題
這篇文章主要介紹了C++ 二維(多維)vector添加一個(gè)空項(xiàng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
帶你用C語(yǔ)言實(shí)現(xiàn)strtok和字符串分割函數(shù)
下面小編就為大家?guī)?lái)一篇c語(yǔ)言中字符串分割函數(shù)及實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09
利用C語(yǔ)言模擬實(shí)現(xiàn)qsort,strcpy,strcat,strcmp函數(shù)
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)C語(yǔ)言模擬實(shí)現(xiàn)qsort(采用冒泡的方式),strcpy,strcat,strcmp等函數(shù),文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-11-11
C語(yǔ)言分別實(shí)現(xiàn)棧和隊(duì)列詳解流程
棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解2022-04-04

