——————————头文件————————
#define _CRT_SECURE_NO_WARNINGS 1 #ifndef __CALCULATOR_H__ #define __CALCULATOR_H__ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<windows.h> #include<math.h> typedef float DataType; #define MaxSize 100 typedef struct { float data[MaxSize]; int top; } ComStack; typedef struct { float data[MaxSize]; int top; }Stack; void InitStack(Stack *s); int GetTop(Stack s, DataType *z); int Push(Stack *s, DataType z); int Pop(Stack *s, DataType *z); void TransmitExpression(char a[], char b[]); float EvaluateExpression(char b[]); int quit(); int mune(); int SimpleCalculator(); int ExpressionCalculator(); #endif
————————函数部分——————
#include"calculator.h" void InitStack(Stack *s) { s->top = 0; } int GetTop(Stack s, DataType *z) { if (s.top > 0) { *z = s.data[s.top - 1]; return 1; } else return 0; } int Push(Stack *s, DataType z) { if (s->top >= MaxSize) { printf("栈已满,不能进栈!\n"); return 0; } else { s->data[s->top] = z; s->top++; return 1; } } int Pop(Stack *s, DataType *z) { if (s->top == 0) { printf("栈已空,不能出栈!\n"); return 0; } else { s->top--; *z = (char)s->data[s->top]; return 1; } } void TransmitExpression(char a[], char b[]) { Stack s; char ch; DataType x; int i = 0, j = 0; InitStack(&s); ch = a[i]; i++; while (ch != '\0') { switch (ch) { case '(': Push(&s, ch); break; case ')': while (GetTop(s, &x) && x != '(') { Pop(&s, &x); b[j] = x; j++; } Pop(&s, &x); break; case '+': case '-': while (GetTop(s, &x) && x != '(') { Pop(&s, &x); b[j] = x; j++; } Push(&s, ch); break; case '*': case '/': case '%': while (GetTop(s, &x) && x == '/' || x == '%' || x == '*') { Pop(&s, &x); b[j] = x; j++; } Push(&s, ch); break; case ' ': break; default: while (ch >= '0'&&ch <= '9') { b[j] = ch; j++; ch = a[i]; i++; } i--; b[j] = ' '; j++; } ch = a[i]; i++; } while (s.top != 0) { Pop(&s, &x); b[j] = x; j++; } b[j] = '\0'; } float EvaluateExpression(char b[]) { ComStack s; int i = 0; float A, B, C, D; int E, F; s.top = -1; while (b[i] != '\0') { if (b[i] != ' '&&b[i] >= '0'&&b[i] <= '9') { C = 0; while (b[i] != ' ') { C = 10 * C + b[i] - '0'; i++; } s.top++; s.data[s.top] = C; } else { switch (b[i]) { case '+': { A = s.data[s.top]; s.top--; B = s.data[s.top]; s.top--; D = A + B; s.top++; s.data[s.top] = D; break; } case '-': { A = s.data[s.top]; s.top--; B = s.data[s.top]; s.top--; D = B - A; s.top++; s.data[s.top] = D; break; } case '*': { A = s.data[s.top]; s.top--; B = s.data[s.top]; s.top--; D = A*B; s.top++; s.data[s.top] = D; break; } case '/': { A = s.data[s.top]; s.top--; B = s.data[s.top]; s.top--; D = B / A; s.top++; s.data[s.top] = D; break; } case'%': { E = s.data[s.top]; s.top--; F = s.data[s.top]; s.top--; D = F % E; s.top++; s.data[s.top] = D; break; } } i++; } } if (s.top != -1) { D = s.data[s.top]; s.top--; return D; } else { printf("表达式错误,请输入正确的表达式\n"); exit(0); } } int mune() { int p; printf(" calculator\n"); printf("********************************************************************\n"); printf("1.expression calculator 2.simple calculator 3.quit\n"); printf("********************************************************************\n"); printf("请根据目录输入一个操作命令(1,2,3):\n"); scanf_s("%d", &p); switch (p) { case 1: { ExpressionCalculator(); break; } case 2: { SimpleCalculator(); break; } case 3:{ quit(); break; } } return 0; } int SimpleCalculator() { int i; int A, B, R1; //加法 int C, D, R2; //减法 int E, F, R3; //乘法 float G, H, R4; //除法 int I, J, R5; //求余 float R6, L; //开方 printf("********************************************************************\n"); printf(" 2.simple calculator \n"); printf("********************************************************************\n"); printf(" 请输入对应序号启动计算程序(注意需要带上符号)\n"); printf("1.********加法******"); printf(" 2.********减法******\n"); printf("3.********乘法******"); printf(" 4.********除法******\n"); printf("5.******求余********"); printf(" 6.******求余*******\n"); printf("********************************************************************\n"); printf(" 等待用户输入命令:"); scanf_s("%d", &i); printf("\n"); switch (i) { case 1: { printf("请输入需要相加的两个数字:\n"); scanf_s("%d+%d", &A, &B); R1 = A + B; printf("\n"); printf("两数之和是:%d+%d=%d\n", A, B, R1); printf(" \n"); break; } case 2: { printf("请输入需要相减的两个数字:\n"); scanf_s("%d-%d", &C, &D); R2 = C - D; printf("\n"); printf("两数之差是:%d-%d=%d\n", C, D, R2); printf("\n"); break; } case 3: { printf("请输入需要相乘的表达式:\n"); scanf_s("%d*%d", &E, &F); R3 = E*F; printf("\n"); printf("两数乘积是:%ld*%ld=%ld\n", E, F, R3); printf("\n"); break; } case 4: { printf("请输入需要相除的表达式:\n"); scanf_s("%f/%f", &G, &H); R4 = G / H; printf("\n"); printf("结果是:%f/%f=%f\n", G, H, R4); printf("\n"); break; } case 5: { printf("请输入需要求余的数(无法识别表达式):\n"); scanf_s("%d %d", &I, &J); R5 = I % J; printf("\n"); printf("结果是:%d\n", R5); printf("\n"); break; } case 6: { printf("请输入你要开平方的数字:\n\n"); scanf_s("%f", &L); R6 = sqrt(L); printf("\n"); printf("结果是:%lf\n\n", R6); break; } } return 1; } int ExpressionCalculator() { char a[MaxSize], b[MaxSize]; float c; printf(" 1.expression calculator\n"); printf("********************************************************************\n"); printf("请输入一个表达式(可以运算加,减,乘,除,求余): \n"); scanf("%c", &a); gets(a); printf("中缀表达式为:%s\n", a); TransmitExpression(a, b); printf("转换为后缀表达式为:%s\n", b); c = EvaluateExpression(b); printf("该表达式的计算结果为:%s=%f\n", a, c); return 0; } int quit() { char y = 0; printf("********************************************************************\n"); printf(" 3.quit\n"); printf("********************************************************************\n"); printf("输入q/Q退出\n"); scanf("%s", &y); if (y == 'q' || y == 'Q') exit(0); } int main() { mune(); system("pause"); return 0; }
具有表达式求值功能的计算器软件设计
最新推荐文章于 2022-04-18 07:00:00 发布